通过API Gateway调用EC2实例中API时出现InvalidAction错误的排查与解决咨询
问题描述
我正在用API Gateway调用EC2实例里部署的自定义API,测试时返回200状态码,但没看到预期的"Success"消息,反而收到以下错误:
<?xml version="1.0" encoding="UTF-8"?> <Response> <Errors><Error> <Code>InvalidAction</Code> <Message>The action deploy is not valid for this web service.</Message> </Error></Errors> <RequestID>4c2aeb89-1dfe-4a95-a9fd-7af28b49c708</RequestID> </Response>
我创建API的步骤是:
- 在API Gateway中创建REST API;
- 添加API端点(通过资源和方法),并将其连接到AWS EC2实例;
- 进入IAM角色页面创建执行角色ARN,并添加所需的全部权限;
测试带查询参数的API端点时就出现了上面的错误。
问题原因
这个错误的核心原因是:你的请求没有正确转发到EC2实例上的自定义API,反而被API Gateway当成了对AWS官方服务(比如EC2原生API)的调用。
InvalidAction是AWS官方服务API的标准错误格式,说明API Gateway把你的请求发送到了AWS的公共API端点(比如ec2.amazonaws.com),而不是你EC2实例的地址。AWS官方EC2 API里根本没有deploy这个动作,所以返回了这个错误。
大概率是你在配置API Gateway的集成环节出了问题,比如选错了集成类型,或者填错了目标Endpoint URL。
GET请求的配置修改步骤
针对这个问题,你可以按以下步骤调整配置:
确认集成类型选择正确
进入API Gateway的对应方法配置页面,检查"集成请求"的类型:你需要选择HTTP(或HTTP_PROXY,如果想透传所有请求参数的话),而不是"AWS服务"。因为你要调用的是EC2上自己部署的API,不是AWS官方的EC2服务API。核对集成Endpoint URL
确认集成请求的Endpoint URL是你EC2实例的公网IP/私有IP(如果用VPC链接的话)加上自定义API的路径,比如:http://<EC2公网IP>:<端口>/your-api-path绝对不能填成AWS官方的EC2 API地址(比如
https://ec2.us-east-1.amazonaws.com),这是最容易踩的坑。确保查询参数正确传递
如果你的GET请求带查询参数,在"集成请求"的"查询字符串参数"里,要设置参数映射:- 点击"添加查询字符串",输入你自定义API需要的参数名;
- 在"映射来自"选择"方法请求参数",然后选择对应的请求参数(比如
method.request.querystring.<参数名>),这样API Gateway会把前端传入的查询参数正确传递到EC2的API里。
验证EC2实例的网络可达性
- 先直接用curl或者浏览器访问EC2实例的公网IP+API路径,确认能返回预期的"Success"消息,排除EC2本身API的问题;
- 检查EC2的安全组规则,允许API Gateway的流量访问:如果是公网访问,安全组要允许0.0.0.0/0(或API Gateway的IP段)访问你的API端口(比如80/443);如果用VPC链接,要确保VPC链接的安全组和EC2的安全组之间有互通规则。
调整IAM角色权限(按需)
如果你用的是HTTP集成+公网地址,其实不需要给执行角色太多AWS服务权限;如果是用VPC链接访问EC2私有地址,需要确保执行角色拥有ec2:CreateNetworkInterface、ec2:DescribeNetworkInterfaces、ec2:DeleteNetworkInterface这些权限,让API Gateway能创建VPC链接的网络接口。
内容的提问来源于stack exchange,提问作者user18425667




