首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将部署到美国的Lambda@Edge限制-东方-1阻止我将S3桶部署到欧洲

将部署到美国的Lambda@Edge限制-东方-1阻止我将S3桶部署到欧洲
EN

Stack Overflow用户
提问于 2020-07-23 23:30:29
回答 2查看 1.8K关注 0票数 3

更新:

我想交叉引用不同区域不同堆栈中的一些值的简短版本,但是文档让我感到非常困惑,以至于我认为不可能做到这一点,但这是可能的,只是我必须将这些值作为导出值输出到该堆栈中,然后在另一个堆栈中使用:${cf.us-east-1:another-stack.theNeededArn}

如果您感兴趣,请使用长篇版本:

我正在使用Serverless框架维护基础结构代码。我有CloudFront连接到一个在欧洲托管的S3桶。我得到了一个客户端请求,将通过CloudFront访问这个桶的权限限制为仅限于经过身份验证的用户(自定义auth)。Lambda@Edge是最好的解决方案,我已经以这种方式实现了它,但由于Lambda@Edge必须部署到我们的东部-1,我最终将S3和Cloudfront移动到我们东部的同一区域(这是因为云锋依赖于lambda边缘,而S3依赖于CloudFront,因此我必须将它们保持在相同的堆栈或至少相同的区域)。但我不想为了法律问题把我的桶搬到美国去,我想把数据保存在欧洲,我的S3还有一个lambda触发器函数,可以监听它,并将一些数据写入欧洲托管的DynamoDb。

所以问题是:我在欧洲有S3,我想把它保存在欧洲,但是由于使用lambda边缘,并且由于云形成或无服务器不支持跨区域堆栈引用,我最终把这个S3移到了美国,但这不是要求!

  • 我认为即使我们使用云前端,但让我们的所有客户都在欧洲,并在美国放置S3桶将增加延迟。至于法律方面的
  • ,我想把欧洲用户的数据保存在欧洲内部,而不是移到国外。--

在这个问题的答案中,我指定了我的方法和完整的代码示例,以防您感兴趣:How to access AWS CloudFront that connected with S3 Bucket via Bearer token of a specific user (JWT Custom Auth)

有什么建议吗?

更新(显示确切问题的步骤):

  1. 在我的serverless.yml中,我创建了这个堆栈,包含这个lambda边缘:

我不想使用无服务器框架配置lambda边缘,而是使用云形成来配置云前端和所有内容。

  1. 在云形成资源文件中,我添加了云源,并通过它的行为配置私有源来使用lambda边缘(请检查图片中的亮点):

请注意,现在我在我的Cloudfront中使用lambda边缘ARN,所以他们需要在同一个区域,而且因为lambda@ CloudFront应该在我们的东部-1,所以我决定将这个CloudFront移到同一个区域,这并不重要,因为它具有设计上的边缘行为。

如果您对此感兴趣,我在第1步中为预定义的lambda边缘定义了所有需要的角色(这包括发布正确的策略和lambda边缘版本,就像在lambda边中一样,您必须引用版本,而不是函数,在这一步中,我只是将其放在completeness.):中)。

  1. 现在我有了云前端配置,lambda边缘配置,在云端,我们引用了lambda边缘ARN,这导致我将它们放在相同的区域,但是现在我将定义我的S3桶,使它成为私有的,这样就没有人可以访问它,只有云前端CloudFrontOriginAccessIdentity可以这样做:

正如您可能看到的角色,我刚刚提供了访问CloudFront的权限,并提供了访问(lambda边缘以获取和放置,但不确定这是否正确),但无论如何,即使我们只需要CloudFrontOriginAccessIdentity连接到我的桶,那么现在连接到我的CloudFront的水桶,也是连接到lambda边缘,所以我不能分开他们,把S3只在欧洲?

这样,即使我有一个S3触发器lambda函数,所以我应该把这个函数放在美国,即使这个函数在欧洲做一些与DynamoDb相关的事情?那又有什么意义呢?而且,即使Cloudfront是边缘的,但桶是区域性的,那么如果我真的需要处理一些与它相关的数据,那就意味着通过将它放入我们中,我增加了延迟?这就是我的全部细节问题。

Update2:我想把这些代码作为截图发布,这样我就可以突出显示一些行,让代码更简单,但是对于那些有兴趣检查代码本身的人,我已经在我对这个问题的回答中发布了完整版本的代码:How to access AWS CloudFront that connected with S3 Bucket via Bearer token of a specific user (JWT Custom Auth)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-28 02:56:14

解决方案不是把所有东西都移到us-east-1上,而是维护两个堆栈,它们是主堆栈和lambda边缘堆栈。主堆栈位于EU中,lambda边缘堆栈位于us-east-1中。您可以使用us-east-1引用${cf.us-east-1:another-stack.lambdaEdgeArn}中的lambda边缘函数。

票数 3
EN

Stack Overflow用户

发布于 2020-12-07 12:26:46

不可能通过us-east-1从其他区域引用Lambda@Edge。在CloudFormation模板中,可以通过动态查找版本特定的ARN并在任务文件中将其作为CloudFront模板的模板参数传递来解决这一问题。

代码语言:javascript
复制
- name: Get Lambda Version-ARN
  shell:
    cmd: "
      aws lambda list-versions-by-function \
        --function-name '{{ lambda_func_name }}' \
        --region '{{ lambda_region }}' \
        --query \"max_by(Versions, &to_number(to_number(Version) || '0'))\" \
      | jq -r '.FunctionArn'
    "
  register: lambda_output

- set_fact:
    lambda_arn: "{{ lambda_output.stdout }}"

- name: CloudFront
  cloudformation:
    stack_name: "{{ stack_name }}"
    state: "{{ state }}"
    region: "{{ region }}"
    template: "roles/{{ role_name }}/templates/cloudfront-template.yml"
    template_parameters:
      LambdaARN: "{{ lambda_arn }}"
      ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63064610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档