如何通过AWS HTTP Gateway暴露禁止公访的S3桶(无需Lambda)
使用AWS HTTP API Gateway无Lambda代理访问私有S3桶(GET请求)
完全可以不用Lambda作为中间代理实现,核心是通过IAM角色让HTTP API Gateway获得访问私有S3桶的权限,避免使用静态网站托管的公共路径。以下是具体操作步骤和问题排查:
一、创建API Gateway专用IAM角色
- 角色可信实体设置为
apigateway.amazonaws.com,信任策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
- 给角色附加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集成
- 创建HTTP API,添加GET路由,路径设为
/{proxy+}(匹配所有对象路径) - 集成类型选择AWS服务,服务选S3,填写桶所在区域
- 集成端点使用S3的REST端点(格式:
你的桶名称.s3.amazonaws.com),不要用静态网站托管的URL(这类URL是为公共访问设计的,私有桶无法通过它授权) - 集成方法选GET,启用AWS区域代理(确保请求签名正确)
- 在权限配置中选择之前创建的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权限
- 检查IAM角色的Resource是否包含桶下所有对象(需加
内容的提问来源于stack exchange,提问作者dragsu
相关产品推荐
相关产品推荐

