AWS API 网关和 EC2 服务代理

Posted

技术标签:

【中文标题】AWS API 网关和 EC2 服务代理【英文标题】:AWS API Gateway and EC2 Service Proxy 【发布时间】:2016-08-01 23:45:02 【问题描述】:

我正在尝试将 json 字符串发布到 API Gateway,然后让 API Gateway 将 JSON 发送到 EC2 服务器。

我的问题是我无法从亚马逊找到有关如何完成此任务的良好文档。

当我测试设置时,我得到了这个

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response><Errors><Error><Code>InvalidHttpRequest</Code><Message>The HTTP request is invalid. Reason: Unable to parse request</Message></Error></Errors><RequestID>1fa47f52-d75c-4ff8-8992-3eac11a79015</RequestID></Response>"

这对我来说意义不大。我认为这是 API Gateway 尝试将请求发送到 EC2 的问题,但它不能,因此它会生成此错误。所以也许我在 API Gateway 中错误地设置了 EC2 AWS 服务代理。这可能是因为我不知道我现在应该将“操作”设置为什么我让它指向 EC2 实例,只是因为我看不到任何其他地方可以放置该信息。

这真的不应该那么难我已经成功地完成了连接到 Lambda 的事情并查看了所有文档,我只能找到:http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-aws-proxy.html#getting-started-aws-proxy-add-resources

这对这种情况没有多大帮助。有什么想法吗?

【问题讨论】:

【参考方案1】:

我认为您混淆了 AWS 服务代理和 HTTP 服务代理。

API Gateway 可以将 API 调用转发到不同类型的后端: - 一个 lambda 函数 - AWS 服务(参见http://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html 示例) - 在 AWS 或本地运行的现有 API(您的用例)

在定义您的 API 时,请务必定义一个 POST 动词并将端点 URL 指向您的 EC2 实例 URL

我刚刚使用http://gurujsonrpc.appspot.com/ 在线提供的 JSON POST 服务进行了测试,它按预期工作。

这是我的测试 API 的 Swagger 导出。


  "swagger": "2.0",
  "info": 
    "version": "2016-04-11T20:46:13Z",
    "title": "test"
  ,
  "host": "c22wfjg4d7.execute-api.eu-west-1.amazonaws.com",
  "basePath": "/prod",
  "schemes": [
    "https"
  ],
  "paths": 
    "/": 
      "post": 
        "produces": [
          "application/json"
        ],
        "responses": 
          "200": 
            "description": "200 response",
            "schema": 
              "$ref": "#/definitions/Empty"
            
          
        ,
        "x-amazon-apigateway-integration": 
          "responses": 
            "default": 
              "statusCode": "200"
            
          ,
          "uri": "http://gurujsonrpc.appspot.com/guru",
          "httpMethod": "POST",
          "type": "http"
        
      
    
  ,
  "definitions": 
    "Empty": 
      "type": "object"
    
  

【讨论】:

是的,这正是我所困惑的。谢谢。 @wmfrancia 那么,你们是说,如果我想使用 API Gateway 在我的 EC2 上调用 php 文件,我实际上必须选择“集成类型:->”HTTP”,并且不是“AWS 服务”? @NinoŠkopac - 没错,“AWS 服务”是指 AWS S3 等内置服务。 @RichVel,这意味着如果我重新启动我的 ec2 实例,我需要手动将新 IP 插入 API 集成请求。有什么办法吗? @Shakedk - 最好为此提出一个新问题,答案很可能包括创建一个映射到分配给 EC2 实例的弹性 IP 的域名

以上是关于AWS API 网关和 EC2 服务代理的主要内容,如果未能解决你的问题,请参考以下文章

AWS API 网关:为啥调用 url 返回 HTML 代码而不是实际网页?

用于 S3 的 API 网关代理和子目录

AWS API网关自定义授权程序AuthorizerConfigurationException

AWS SOC 2 API 网关 / CloudFront

如何使用 lambda 代理集成来云化 API 网关资源

无法设置到私有 AWS API 网关 API 的 SSH 隧道