更新:
我想交叉引用不同区域不同堆栈中的一些值的简短版本,但是文档让我感到非常困惑,以至于我认为不可能做到这一点,但这是可能的,只是我必须将这些值作为导出值输出到该堆栈中,然后在另一个堆栈中使用:${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移到了美国,但这不是要求!
在这个问题的答案中,我指定了我的方法和完整的代码示例,以防您感兴趣:How to access AWS CloudFront that connected with S3 Bucket via Bearer token of a specific user (JWT Custom Auth)
有什么建议吗?
更新(显示确切问题的步骤):

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

请注意,现在我在我的Cloudfront中使用lambda边缘ARN,所以他们需要在同一个区域,而且因为lambda@ CloudFront应该在我们的东部-1,所以我决定将这个CloudFront移到同一个区域,这并不重要,因为它具有设计上的边缘行为。
如果您对此感兴趣,我在第1步中为预定义的lambda边缘定义了所有需要的角色(这包括发布正确的策略和lambda边缘版本,就像在lambda边中一样,您必须引用版本,而不是函数,在这一步中,我只是将其放在completeness.):中)。

。

正如您可能看到的角色,我刚刚提供了访问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)。
发布于 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边缘函数。
发布于 2020-12-07 12:26:46
不可能通过us-east-1从其他区域引用Lambda@Edge。在CloudFormation模板中,可以通过动态查找版本特定的ARN并在任务文件中将其作为CloudFront模板的模板参数传递来解决这一问题。
- 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 }}"
...https://stackoverflow.com/questions/63064610
复制相似问题