如何获取AWS Amplify React应用IP以配置API Gateway访问白名单
解决AWS Amplify前端访问API Gateway的白名单配置问题
方案1:使用Amplify签名请求(推荐)
Amplify前端可以通过内置的API模块发送带IAM签名的请求,结合API Gateway的IAM授权实现精准访问控制,无需依赖IP白名单:
- 步骤1:在Amplify控制台进入你的应用,打开Backend environments -> API,将API Gateway的授权类型设置为
IAM。 - 步骤2:为Amplify的前端IAM角色(通常命名为
amplify-<应用名>-<环境>-authRole或unauthRole)添加API Gateway调用权限,示例策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:<区域>:<账号ID>:<API ID>/*/*/*" } ] } - 步骤3:前端代码使用Amplify API模块发起请求,自动携带签名:
import { API } from 'aws-amplify'; const fetchData = async () => { const response = await API.get('你的API名称', '/接口路径'); console.log(response); }; - 步骤4:在API Gateway的资源策略中配置规则,拒绝未授权请求:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:<区域>:<账号ID>:<API ID>/*/*/*", "Condition": { "StringNotEquals": { "aws:PrincipalArn": "arn:aws:iam::<账号ID>:role/amplify-<应用名>-<环境>-authRole" } } } ] }
方案2:自定义请求头验证
通过给Amplify前端请求添加专属自定义头,在API Gateway或Lambda层验证头信息实现访问控制:
- 步骤1:前端配置Amplify API拦截器,添加自定义密钥头:
import { Amplify, API } from 'aws-amplify'; Amplify.configure({ API: { endpoints: [ { name: '你的API名称', endpoint: 'https://<API ID>.execute-api.<区域>.amazonaws.com/<环境>', custom_header: async () => { return { 'X-Amplify-Secret': '你的专属密钥' }; } } ] } }); - 步骤2:二选一配置验证逻辑:
- 方式A:在API Gateway创建请求验证器,检查
X-Amplify-Secret头是否匹配预设密钥; - 方式B:在Lambda函数开头添加验证逻辑:
exports.handler = async (event) => { const secretHeader = event.headers['X-Amplify-Secret']; if (secretHeader !== '你的专属密钥') { return { statusCode: 403, body: JSON.stringify('Forbidden') }; } // 后续业务逻辑 };
- 方式A:在API Gateway创建请求验证器,检查
方案3:基于Amplify出站IP范围配置(不推荐,需维护)
AWS会公开Amplify的出站IP范围,可定期获取并更新API Gateway白名单,但IP会动态调整,需持续维护:
- 步骤1:下载AWS官方发布的IP地址范围文件,筛选出
service: "AMPLIFY"对应的IP段; - 步骤2:在API Gateway资源策略中添加IP允许规则:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:<区域>:<账号ID>:<API ID>/*/*/*", "Condition": { "IpAddress": { "aws:SourceIp": [ "1.2.3.4/24", "5.6.7.8/24" // 填入筛选出的Amplify IP段 ] } } }, { "Effect": "Deny", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:<区域>:<账号ID>:<API ID>/*/*/*" } ] }
内容的提问来源于stack exchange,提问作者Berkay Koralturk
相关产品推荐
相关产品推荐

