如何限制API Gateway仅接受来自自有S3静态网站的调用?
保护API Gateway仅允许自有S3静态网站调用的可行方案
针对你的场景,以下是几个可靠的解决方案,同时回应你提到的两个方案的疑问:
关于你考虑的方案的补充说明
- 代理方案:确实如你所说,若代理无额外防护,任何人只要能访问代理地址就能调用API,无法实现仅允许S3网站调用的目标。
- IP白名单:S3静态网站的访问IP属于AWS全局IP池,无固定范围,且用户访问S3的出口IP是动态的,该方案不可行。
可行方案
1. AWS WAF + 自定义请求标头验证
这是低成本的实现方案,核心是让S3网站的请求携带专属自定义标头,通过WAF拦截无效请求:
- 步骤1:在S3静态网站的前端代码中,给所有API Gateway请求添加自定义标头,比如
X-Allowed-Source: your-unique-secret-value - 步骤2:在API Gateway关联的AWS WAF中创建规则,检查请求是否包含该标头且值完全匹配预设的
your-unique-secret-value - 步骤3:将WAF规则设置为拦截不满足条件的请求,同时保留原有的API密钥验证,实现双重防护
2. IAM身份验证(SigV4签名)+ Lambda@Edge
通过给API请求添加AWS SigV4签名,确保只有授权请求能访问API Gateway:
- 步骤1:将API Gateway的授权方式改为IAM授权,配置IAM策略允许特定角色调用该API
- 步骤2:部署CloudFront作为S3静态网站的分发前端,启用Lambda@Edge(关联到CloudFront的
Viewer Request事件) - 步骤3:编写Lambda@Edge函数,在用户发起API请求时自动为请求添加SigV4签名(使用预先创建的IAM角色权限)
- 步骤4:配置CloudFront的Origin Access Control(OAC),确保只有CloudFront能访问你的S3存储桶,避免S3网站被直接访问
3. 私有API Gateway + VPC端点 + CloudFront
将API Gateway设为私有,仅允许通过VPC端点访问,结合CloudFront实现隔离:
- 步骤1:创建私有API Gateway,禁用公网访问,配置VPC端点(Interface类型)关联到你的VPC
- 步骤2:部署CloudFront,将S3作为默认源,同时添加API Gateway的VPC端点作为自定义源
- 步骤3:配置CloudFront的行为规则,限制API路径的请求仅能从S3网站的路径发起,同时通过OAC确保只有CloudFront能访问S3
- 步骤4:在VPC端点的安全组中,仅允许CloudFront的IP范围访问,进一步缩小访问范围
内容的提问来源于stack exchange,提问作者dooxe
相关产品推荐
相关产品推荐

