【问题标题】:AWS CloudFront to S3 Post Support?AWS CloudFront 到 S3 后期支持?
【发布时间】:2019-05-16 14:40:23
【问题描述】:

第三方程序需要从我们的 CDN 访问静态文件。问题是,他们不是通过 GET 获取这些文件,而是通过 POST 发出此请求。

在测试这个POST => cdn.company.com/somefile 时,我得到-

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>MethodNotAllowed</Code>
    <Message>The specified method is not allowed against this resource.</Message>
    <Method>POST</Method>
    <ResourceType>OBJECT</ResourceType>
</Error>

CloudFront 行为设置为支持所有方法-

并且CORS配置中包含POST方法-

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <MaxAgeSeconds>2592000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

不确定还需要做什么。我的怀疑是 S3(正确)假设 POST 正在尝试将信息添加到存储桶,它应该只返回路径中的文件。 Cloudfront 到 s3 有可能吗?我是否需要将请求转发给将下载文件的 lambda?

【问题讨论】:

  • 第三方程序坏了。他们确实需要为他们正在采取的行动使用正确动词,即GET。您是否应该通过创建解决方法来为他们解决这个问题?可以说不是,但如果出于某种原因有必要,还有另一个问题将决定您的选择:对象有多大?
  • 我完全同意你的看法,迈克尔。问题是第三方程序是Apple。该对象压缩后约为 250kb
  • 您确定这是对您要解决的问题的正确诊断吗?您能否提供更多上下文,也许是一些苹果文档的链接?我不想解决错误的问题。
  • developer.apple.com/library/archive/documentation/…。在“下载您的网站包”下 - 使用 POST 请求而不是 GET 请求。意味着推送包不能直接由 s3 服务

标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudfront aws-lambda-edge


【解决方案1】:

S3 仅支持GETHEAD,因此您无法发送POST 请求(请参阅related)。

您可以编写一个 lambda Edge 函数,在将请求 POST 方法发送到源 (s3) 之前将其替换为 GET。无需在本地下载文件。

【讨论】:

  • HTTP 方法在 Lambda@Edge 中列为只读。 docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…
  • 查看请求 lambda 是正确的,但我相信可以修改源请求方法。
  • 我担心我需要 lambda@edge 从 s3 获取内容并返回。你是说我可以修改方法并转发吗?那将是最好的方案!
  • 将此标记为答案,因为它让我最接近。不幸的是,您无法更改 edge 中的原点方法。解决方案很糟糕,但您必须使用边缘 lambda 来获取 s3 并直接在响应正文中返回它(更改内容类型并使用 b64 编码)。使边缘 lambda 仅与普通 lambda 相比有用,因为它是全局分布的
猜你喜欢
  • 2015-06-16
  • 2017-07-24
  • 2019-08-22
  • 1970-01-01
  • 2020-05-07
  • 2015-06-21
  • 2021-01-29
  • 2014-10-14
  • 2016-12-08
相关资源
最近更新 更多