基于子网IP的AWS API Gateway资源访问策略控制失效求助
我来帮你排查这个问题!你遇到的资源策略不生效,核心原因是无公网IP的EC2实例访问API Gateway时,走的是VPC接口端点,而不是公网路径,这时候API Gateway无法识别到EC2的私有子网IP,所以基于aws:SourceIp的条件根本不会触发。
问题根源
无公网IP的EC2实例要访问AWS API Gateway,必须通过Interface类型的VPC端点实现内网访问。这时候API Gateway收到的请求来自VPC端点,而非EC2的私有IP,你原来基于子网CIDR/IP的aws:SourceIp条件自然无法生效。
正确的资源策略写法
针对你的场景,有两种精准的策略配置方式:
方式1:允许指定VPC内的资源访问(适合两台EC2在同一VPC的不同子网)
如果两台EC2在同一个VPC下的独立子网,直接限制VPC ID即可:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域ID:你的AWS账号ID:你的API Gateway ID/*/*/*", "Condition": { "StringEquals": { "aws:SourceVpc": "你的VPC ID" } } } ] }
方式2:允许指定VPC端点访问(更严格,适合多VPC或需精准控制的场景)
如果两台EC2在不同VPC,或者你想只开放给特定的VPC端点,可以用aws:SourceVpcEndpoint条件:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域ID:你的AWS账号ID:你的API Gateway ID/*/*/*", "Condition": { "StringEquals": { "aws:SourceVpcEndpoint": "你的VPC端点ID" } } }, // 如果有第二个VPC端点,添加这个Statement { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域ID:你的AWS账号ID:你的API Gateway ID/*/*/*", "Condition": { "StringEquals": { "aws:SourceVpcEndpoint": "第二个VPC端点ID" } } } ] }
额外必须配置的步骤
光有资源策略还不够,你得确保VPC端点的配置正确:
- 为API Gateway创建Interface类型的VPC端点,服务名称格式是
com.amazonaws.你的区域.execute-api - 确保EC2所在的子网已关联包含VPC端点路由的路由表(路由目标是VPC端点的ID,目标地址是API Gateway服务域名对应的IP范围)
- 验证EC2的安全组允许出站访问VPC端点的443端口(HTTPS)
- 资源策略里的
ResourceARN必须精准:替换区域(比如us-east-1)、AWS账号ID、API Gateway的ID;/*/*/*表示允许所有API的所有方法,若要限制特定API,可改成更具体的路径(比如API_ID/prod/GET/users)
验证策略是否生效
配置完成后,你可以在EC2上用curl测试API Gateway的内网域名(VPC端点提供的域名),如果能正常访问说明策略生效;用其他VPC内的资源测试则会被拒绝。
内容的提问来源于stack exchange,提问作者Renukaradhya Dakshinamurthy
相关产品推荐
相关产品推荐

