AWS API Gateway资源策略:如何仅对webhook端点做IP访问限制?
问题分析与解决方案
问题根源
你之前的两个方案都出现范围错误,核心原因是第二个允许语句的资源范围太窄(仅匹配{proxy+}路径下的端点),而AWS资源策略默认是拒绝所有未明确允许的请求。所以非{proxy+}路径下的端点会被默认拒绝,看起来像是IP限制影响了所有端点。
正确的资源策略配置
以下两种方案都能实现「仅限制/webhook端点的IP访问,其他端点不受影响」的需求:
方案1:Deny优先(推荐,逻辑更清晰)
通过Deny语句拦截非指定IP对/webhook的访问,同时允许所有IP访问所有端点(Deny会优先覆盖/webhook的允许规则):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:eu-central-1:你的账号ID:你的API ID/*/POST/webhook", "Condition": { "NotIpAddress": { "aws:SourceIp": [ "X.XX.XX.XX/32", "X.XXX.XXX.XXX/32" ] } } }, { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:eu-central-1:你的账号ID:你的API ID/*/*/*" } ] }
方案2:Allow精准匹配
先允许指定IP访问/webhook,再允许所有IP访问除/webhook外的所有端点:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:eu-central-1:你的账号ID:你的API ID/*/POST/webhook", "Condition": { "IpAddress": { "aws:SourceIp": [ "X.XX.XX.XX/32", "X.XXX.XXX.XXX/32" ] } } }, { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:eu-central-1:你的账号ID:你的API ID/*/*/*", "Condition": { "StringNotEquals": { "execute-api:ResourcePath": "/webhook" } } } ] }
关键注意事项
- 替换策略中的
你的账号ID、你的API ID为实际值(可在API Gateway控制台的API详情页获取) - 确保资源ARN的阶段部分用
*,匹配所有部署阶段 - 配置完成后必须重新部署API,策略才会生效
- 测试时分别用允许IP和非允许IP访问/webhook,同时验证其他端点的正常访问
内容的提问来源于stack exchange,提问作者F16R
相关产品推荐
相关产品推荐

