【发布时间】:2020-07-16 08:09:51
【问题描述】:
我在 S3 存储桶前面创建了一个 Cloudfront 分配,如果未找到请求的文件,则使用 RoutingRule 重定向到 lambda 函数。我正在使用它来调整图像大小。
所需流量:
- 向 Cloudfront 请求文件
- 在 Cloudfront 检查 S3 中找不到文件
- 在 S3 中找不到文件重定向到 lambda 函数
- Lambda 将找到原始文件,调整其大小并重定向回 Cloudfront url。
s3 网站上的重定向规则集:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals/>
<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
</Condition>
<Redirect>
<Protocol>https</Protocol>
<HostName>mylambda.execute-api.us-east-1.amazonaws.com</HostName>
<ReplaceKeyPrefixWith>/?key=</ReplaceKeyPrefixWith>
<HttpRedirectCode>307</HttpRedirectCode>
</Redirect>
</RoutingRule>
</RoutingRules>
当 lambda 函数重定向回原始 url 时,第 4 步出现问题 Cloudfront缓存了404?并且来自 S3 的路由规则再次重定向到导致循环的 lambda 函数。
- 我确认 lambda 函数生成了文件。
- 如果我使 Cloudfront 上的文件无效,我成功地看到它从 S3 提供)
我尝试将 0 TTL 添加到 404 错误页面,但没有帮助。
重定向规则返回 307 状态代码 [Temporary Redirect]。但我不知道如何为此设置 0 TTL。我在 Cloudfront 自定义错误响应页面上找不到该选项。
根据this article。 307 被缓存。需要为它设定一个规则……某处。
这是RoutingRules on AWS S3 Static website hosting的后续问题
感谢您的帮助。
更新: 1. 移除 S3 上的 RoutingRule 2. 为 Cloudfront 分发(API 网关)添加了一个新的源
lambda 函数现在返回
return {
statusCode: "200",
body: "image converted",
};
检查 Cloudwatch 日志我没有看到 lambda 函数被调用,当我转到 https://myCloudfront.cloudfront.net/photos/resized/test.jpg 时
我只看到一个普通的 404
我还为 404 添加了一个 0 TTL 的自定义错误页面
好消息是如果我通过 key=/photos/resized/test.jpg 去 api 网关 然后去https://my.cloudfront.net/photos/resized/test.jpg它工作。它可以正确读取图像。
我认为问题在于未触发 api 网关调用的故障转移。
【问题讨论】:
标签: amazon-web-services amazon-s3 amazon-cloudfront