You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AWS HTTP Gateway暴露禁止公访的S3桶(无需Lambda)

使用AWS HTTP API Gateway无Lambda代理访问私有S3桶(GET请求)

完全可以不用Lambda作为中间代理实现,核心是通过IAM角色让HTTP API Gateway获得访问私有S3桶的权限,避免使用静态网站托管的公共路径。以下是具体操作步骤和问题排查:

一、创建API Gateway专用IAM角色

  1. 角色可信实体设置为apigateway.amazonaws.com,信任策略示例:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  1. 给角色附加S3访问权限,若对象用KMS加密,需额外添加KMS解密权限,权限策略示例:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::你的私有桶名称/*"
    },
    {
      "Effect": "Allow",
      "Action": "kms:Decrypt",
      "Resource": "arn:aws:kms:你的区域:账号ID:key/你的KMS密钥ID"
    }
  ]
}

二、配置HTTP API Gateway集成

  1. 创建HTTP API,添加GET路由,路径设为/{proxy+}(匹配所有对象路径)
  2. 集成类型选择AWS服务,服务选S3,填写桶所在区域
  3. 集成端点使用S3的REST端点(格式:你的桶名称.s3.amazonaws.com),不要用静态网站托管的URL(这类URL是为公共访问设计的,私有桶无法通过它授权)
  4. 集成方法选GET,启用AWS区域代理(确保请求签名正确)
  5. 在权限配置中选择之前创建的IAM角色,让API Gateway扮演该角色访问S3

三、配置请求路径映射

在集成的请求设置中,将路径覆盖设为/{proxy},这样API网关收到的/{proxy+}路径会直接映射到S3的对象键(比如请求https://你的API ID.execute-api.区域.amazonaws.com/doc.pdf会对应S3桶中的doc.pdf)

四、验证S3桶配置

  • 确保桶的阻止公共访问所有选项均处于开启状态
  • 无需修改桶策略添加公共权限,API Gateway通过IAM角色授权访问,不依赖桶策略的公共规则

常见问题排查

  • 访问拒绝错误:
    • 检查IAM角色的Resource是否包含桶下所有对象(需加/*,不能只写桶ARN)
    • 确认信任策略的服务主体是apigateway.amazonaws.com,不要拼写错误
    • 验证集成端点用的是S3 REST端点,而非静态网站托管端点
    • 若对象加密,确认IAM角色拥有对应KMS密钥的kms:Decrypt权限

内容的提问来源于stack exchange,提问作者dragsu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:16:13