【问题标题】:Restrict access to S3 static website that uses API Gateway as a proxy限制对使用 API Gateway 作为代理的 S3 静态网站的访问
【发布时间】:2019-08-04 13:43:00
【问题描述】:

我有一个充当静态网站的 S3 存储桶,我正在使用 API Gateway 向它分配流量。我知道 CloudFront 在这里是一个更好的选择,但请不要推荐它。这不是一个选项,由于我不会进入的原因。

我正在通过配置 {proxy+} 资源来完成我的解决方案。下图:

我只想允许从 API Gateway 代理资源访问 S3 网站。 有没有办法可以为代理资源提供执行角色,类似于您可以提供资源的执行角色以运行 lambda 函数?下面的 Lambda 执行角色示例:

代理资源的集成请求部分似乎没有执行角色:

或者有没有一种方法可以为整个 API Gateway 分配一个角色,为其提供访问 S3 存储桶的权限?

我尝试过的其他事情:

  1. 编辑存储桶策略以仅允许来自 API 网关服务的流量:

    { “版本”:“2012-10-17”, "Id": "apiGatewayOnly", “陈述”: [ { "Sid": "apiGW", “效果”:“允许”, “主要的”: { “服务”:[“api-gateway-amazonaws.com”] }, "动作": "s3:GetObject", "资源": "http://test-proxy-bucket-01.s3-website.us-east-2.amazonaws.com/*" } ] }

  2. 编辑存储桶策略以仅允许来自 API Gateway 的 URL 的流量:

    { “版本”:“2012-10-17”, "Id": "http 引用策略示例", “陈述”: [ { "Sid": "允许获取来自 www.example.com 和 example.com 的请求。", “效果”:“允许”, “校长”:“”, "动作": "s3:GetObject", "资源": "http://test-proxy-bucket-01.s3-website.us-east-2.amazonaws.com/", “健康)状况”: { “类似字符串”:{ “aws:推荐人”:[ "https://xxxxxxx.execute-api.us-east-2.amazonaws.com/prod/", "http://xxxxxxxx.execute-api.us-east-2.amazonaws.com/prod" ] } } } ] }

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-api-gateway


    【解决方案1】:
    1. 创建私有 S3 存储桶
    2. 创建一个可以访问存储桶的 IAM 角色。将可以担任此角色的受信任实体/委托人设置为apigateway.amazonaws.com
    3. 使用 AWS 服务集成类型并选择 s3。将执行角色设置为2中创建的角色

    详情请参阅docs

    【讨论】:

    • 谢谢,这正是我所需要的。对于以后看到这篇文章的任何人,完成我需要的文档部分是“公开 API 方法以访问存储桶中的 Amazon S3 对象”,因为我不仅需要查看存储桶,还需要查看其中的对象。
    • 我在走这条路线时遇到的一个问题是,它使用了底层的 S3 API,而 S3 网站则有局限性。例如,网站路径允许您指定要返回的索引/错误页面,它们都可以指向 index.html,这对于 SPA 来说非常有用。对于 s3 API,错误返回一个 s3 xml——据我所知,这会破坏使用现代浏览器路由的 SPA 路由(第二次您在嵌套路由上重新加载页面,您会返回 s3 xml 错误 404)。我可以让它工作的唯一方法是使用旧式哈希路由。
    猜你喜欢
    • 2019-11-17
    • 2020-05-18
    • 1970-01-01
    • 2015-09-20
    • 2019-08-25
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多