You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过API Gateway调用EC2实例中API时出现InvalidAction错误的排查与解决咨询

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请求的配置修改步骤

针对这个问题,你可以按以下步骤调整配置:

  1. 确认集成类型选择正确
    进入API Gateway的对应方法配置页面,检查"集成请求"的类型:你需要选择HTTP(或HTTP_PROXY,如果想透传所有请求参数的话),而不是"AWS服务"。因为你要调用的是EC2上自己部署的API,不是AWS官方的EC2服务API。

  2. 核对集成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),这是最容易踩的坑。

  3. 确保查询参数正确传递
    如果你的GET请求带查询参数,在"集成请求"的"查询字符串参数"里,要设置参数映射:

    • 点击"添加查询字符串",输入你自定义API需要的参数名;
    • 在"映射来自"选择"方法请求参数",然后选择对应的请求参数(比如method.request.querystring.<参数名>),这样API Gateway会把前端传入的查询参数正确传递到EC2的API里。
  4. 验证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的安全组之间有互通规则。
  5. 调整IAM角色权限(按需)
    如果你用的是HTTP集成+公网地址,其实不需要给执行角色太多AWS服务权限;如果是用VPC链接访问EC2私有地址,需要确保执行角色拥有ec2:CreateNetworkInterfaceec2:DescribeNetworkInterfacesec2:DeleteNetworkInterface这些权限,让API Gateway能创建VPC链接的网络接口。


内容的提问来源于stack exchange,提问作者user18425667

火山引擎 最新活动