S3 预签名 URL,通过 API 网关、方法不允许的自定义终端节点



我正在尝试为具有自定义终端节点的 S3 存储桶使用预签名 URL。我看起来很接近,但我不断收到"方法不允许"错误。这就是我所处的位置。

我有一个 API 网关,它将终端节点连接到 Lambda 函数。除其他事项外,该函数还会生成一个预签名的 URL。这样

var s3 = new AWS.S3({
endpoint: 'custom.domain.com/upload',
s3BucketEndpoint: true,
signatureVersion: 'v4'
});
//...
s3.getSignedUrl('putObject', {
ACL: 'bucket-owner-full-control',
Bucket: process.env.S3_BUCKET_NAME,
ContentType: "image/png",
Key: asset.id + ".png"
};

此代码成功返回一个 url,其中包含看似所有正确的查询参数、正确的键名称,并且该 url 指向我的终结点。但是,尝试上传时,我收到以下错误:

方法不允许

不允许针对此资源指定方法。PUTSERVICE[请求 ID 在这里][主机 ID 在这里]

如果我从 S3 配置中删除自定义终端节点声明,则会收到一个以标准域为前缀的预签名 URL,并且上传工作正常。

关于我的设置的其他说明。

  1. 我已将 API 网关上的/upload 资源配置为 PUT 方法的 S3 直通。
  2. 我已经在需要时启用了 CORS。在存储桶和我的 API 上。我已经确认 CORS 很好,因为浏览器通过了检查。
  3. 我已经设置了我的策略。lambda 函数可以从我的 VPC 访问互联网,具有完全 S3 访问权限,并且与 S3 和 API 网关具有信任关系。此执行角色在资源之间共享。
  4. 我正在使用 axios 包通过 PUT 上传文件。
  5. 我添加了一个 CloudTrail 日志,但它报告的错误与浏览器完全相同......
  6. 暂时公开我的存储桶没有任何区别。
  7. 我试图将查询字符串添加到 API 网关请求/响应集成中,但没有成功。
  8. 我已将必要的内容类型标头添加到请求和预签名的 url 配置中。
  9. 我用谷歌搜索了这个东西。

我错过了什么吗?这可能吗?我计划暂时禁用我的自定义终端节点并继续使用默认的预签名 URL,但从长远来看,我想要自定义终端节点。最坏的情况是,我可能会为一些 AWS 支持付费。

感谢您的帮助!

我找不到说明预签名 URL 支持代理(alt/自定义域(的文档。IMO 验证并授予请求从 API 网关访问 AWS 资源(无论您是否代理 S3(的使用案例是使用 API 网关授权方 w/lambda,以允许请求代入有权访问 AWS 资源的 IAM 角色(在本例中为 PUT 对象在 s3 存储桶上(

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html

最新更新