跨账号使用AWS CLI调用API Gateway触发NotFoundException问题求助
问题根因
你遇到的报错是因为apigateway test-invoke-method属于AWS API Gateway的管理平面操作接口,设计上仅允许操作当前调用凭证所属账户下的API Gateway资源。你用B账户的EC2实例凭证调用时,AWS后台会自动将B账户ID与你传入的rest-api-id拼接为资源标识符检索,自然找不到A账户下的对应API,因此抛出NotFoundException。test-invoke-method本身是为同账户下的API调试设计的,不适合跨账户的API调用场景。
解决方案
方案1:调用API Gateway运行时端点(推荐)
跨账户正常调用API直接使用API的运行时访问端点即可,无需使用测试调用接口:
- 如果你的API未开启IAM授权,直接用curl调用对应URL即可:
curl https://<rest-api-id>.execute-api.us-east-1.amazonaws.com/<stage-name>/<resource-path>
- 如果你的API开启了IAM授权,可使用aws cli的
execute-api命令发起带SigV4签名的调用,只要A账户API Gateway的资源策略已允许B账户EC2实例角色的execute-api:Invoke权限即可成功调用:
aws --region us-east-1 execute-api invoke \ --rest-api-id xxxxxxxxxx \ --stage-name <你的API部署阶段名> \ --resource-path <你的资源路径> \ --http-method GET
方案2:需使用test-invoke-method调试的场景
如果你需要调试A账户下未部署的API配置,必须使用test-invoke-method,则需要配置跨账户角色 Assume:
- 在A账户创建专用IAM测试角色,授予
apigateway:TestInvokeMethod权限,信任实体设置为B账户EC2实例绑定的Instance Profile角色ARN - 在B账户的EC2 Instance Profile角色的权限策略中,添加允许
sts:AssumeRole的规则,资源为A账户刚才创建的测试角色ARN - 在EC2实例上先Assume A账户的测试角色,获取临时凭证后再执行原来的
test-invoke-method命令,此时调用凭证属于A账户,即可正常检索到对应API资源
注意事项
如果使用方案1调用,需确认A账户API Gateway的资源策略中,明确允许B账户EC2实例角色执行execute-api:Invoke操作,否则会出现权限拒绝报错。
内容的提问来源于stack exchange,提问作者user1607158
相关产品推荐
相关产品推荐

