【发布时间】:2020-11-13 18:58:39
【问题描述】:
更新:
我想在不同区域的不同堆栈中交叉引用一些值的问题的简短版本,但文档非常混乱,让我认为不可能这样做,但有可能,只是我必须输出那些值作为该堆栈中的导出值,然后使用:
${cf.us-east-1:another-stack.theNeededArn} 在另一个堆栈中。
如果您有兴趣,请阅读长版:
我正在使用无服务器框架维护基础架构代码。我有连接到在欧洲托管的 S3 存储桶的 CloudFront。我收到了一个客户端请求,要求通过 CloudFront 限制对该存储桶的访问,仅限于经过身份验证的用户(自定义身份验证)。 Lambda@Edge 是最好的解决方案,我已经以这种方式实现了它,但是由于必须将 Lambda@Edge 部署到 us-east-1,我最终将 S3 和 Cloudfront 移动到同一区域 us-east-1(即因为 Cloufront 依赖于 lambda 边缘,而 S3 依赖于 CloudFront,所以我必须将它们保持在同一个堆栈或至少同一个区域中)。但是我不想将我的存储桶移到美国获取合法的东西,我想将数据保留在欧洲,而且我的 S3 有一个 lambda 触发器功能,可以监听它并将一些数据写入欧洲托管的 DynamoDb。
所以问题: 我在欧洲有 S3,我想将它保留在欧洲,但由于使用 lambda edge,并且由于云形成或无服务器不支持跨区域堆栈引用,我最终将此 S3 移至美国,但事实并非如此要求!
- 我认为即使我们使用云端,但将所有客户都放在欧洲并将 S3 存储桶放在美国会增加延迟。
- 对于法律方面的内容,我希望将欧洲用户的数据保留在欧洲境内,而不是将其移出。
在这个问题的答案中,我指定了我的方法和完整的代码示例,以防您感兴趣:How to access AWS CloudFront that connected with S3 Bucket via Bearer token of a specific user (JWT Custom Auth)
有什么建议吗?
更新(显示确切问题的步骤):
- 在我的 serverless.yml 中,我创建了这个堆栈,其中包含这个 lambda 边缘:
我不想使用无服务器框架配置 lambda edge,而是使用云形成来配置云前端和所有内容。
- 在云形成资源文件中,我添加了云前端 origins 并通过其行为配置私有源以使用 lambda 边缘(请查看图片中的高光部分):
请注意,现在我在 Cloudfront 中使用 lambda edge ARN,因此它们需要位于同一区域,并且因为 lambda@edge 应该在 us-east-1 中,所以我决定将 CloudFront 移动到同一区域并且确实如此没关系,因为它在设计上具有边缘行为。
- 如果你有兴趣,我在这里定义了所有需要的角色 step.1 中预定义的 lambda 边缘(其中包括 发布正确的策略以及 lambda 边缘版本作为 在 lambda edge 中,您必须引用版本,而不是函数 为了完整起见,我只是在这一步中设置了所有内容。):
- 现在我有了云前端配置,lambda 边缘配置, 在云端,我们引用了 lambda edge ARN,它 引导我将它们放在同一个区域,但现在我将定义我的 S3 存储桶并将其设为私有,因此没有人可以访问它,只有 云端 CloudFrontOriginAccessIdentity 可以做到这一点:
正如您在角色中看到的那样,我只是授予对 CloudFront 的访问权限以获取并授予对(获取和放置的 lambda 边缘但不确定这是否正确)的访问权限,但无论如何,即使我们只需要连接 CloudFrontOriginAccessIdentity我的存储桶,所以现在与我的 CloudFront 链接的存储桶也链接到 lambda 边缘,所以我无法将它们分开以仅将 S3 放在欧洲??
即使我有一个 S3 触发 lambda 函数,所以我应该把这个函数放在美国,即使这个函数在欧洲做一些与 DynamoDb 相关的事情?那么有什么意义呢?此外,即使 Cloudfront 是边缘的,但存储桶是区域性的,所以如果我真的需要处理一些与之相关的数据,这意味着通过将它放入我们我会增加延迟?这就是我的全部详细问题。
更新2: 我想将代码作为屏幕截图发布,以便突出显示一些行并使其更容易,但是对于有兴趣检查代码本身的人,我已经在此处对这个问题的回答中发布了它的完整版本:How to access AWS CloudFront that connected with S3 Bucket via Bearer token of a specific user (JWT Custom Auth)
【问题讨论】:
-
您实际上在 us-east-1 中创建了 Lambda@edge 函数,但它被部署在所有区域中,并且该函数基于客户端连接到的边缘触发,但这并不要求您在 us-east-1 中使用 bucket,您可以使用 lambda 函数并仍然触发您的欧洲桶。您可以在 lambda@edge 函数中将 origin 指定为 s3 eu 端点。
-
有依赖关系。所以基本上在 CloudFront 配置中,我指定了 lambda 边缘 ARN,在存储桶策略角色中,我指定了 Cloudfront 锥形 id,在无服务器框架或云形成中,在不同的环境中使用来自另一个堆栈的输出是不可接受的地区所以这是我的问题。我开始了赏金,因为这个问题非常重要并且阻止了我,所以如果你有答案,请告诉我。
-
@JamesDean 我更新了问题以包含代码示例和图像的确切问题。
-
你能把你的代码以文本格式推送到 github 中的某个地方吗?我们阅读您的代码会更容易。
-
@jellycsc 我已经发布了这些屏幕截图,所以我可以突出显示这些行,但是如果您有兴趣查看我已经在这个问题的答案中发布的代码:stackoverflow.com/questions/62492604/… 我还更新了问题
标签: amazon-s3 amazon-cloudformation amazon-cloudfront serverless-framework aws-lambda-edge