具有API网关自定义端点的S3预签名URL,MethodNotAllowed

时间:2018-09-05 20:05:25

标签: node.js amazon-web-services amazon-s3 pre-signed-url

我正在尝试对带有自定义端点的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似乎是所有正确的查询参数,正确的键名,并且该URL指向我的端点。但是,当尝试上传时,出现以下错误:

  

  MethodNotAllowed不允许对此资源使用指定的方法。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支持付费。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我找不到说明预签名URL支持代理(alt /自定义域)的文档。 IMO的用例用于验证和授予请求从API网关对AWS资源的访问权限(无论您是否代理S3)将使用带有w / lambda的API网关授权者来允许请求承担以下IAM角色:有权访问AWS资源(在本例中为s3存储桶中的PUT OBJECT)

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