AWS API Gateway Method请求路径参数不起作用 [英] AWS API Gateway Method request path parameter not working

查看:618
本文介绍了AWS API Gateway Method请求路径参数不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试配置API网关以将请求路由到我的后端GO微服务上的特定路由.我正在将GET请求方法与VPC_LINK集成到NLB一起使用,该方法路由到在Fargate中运行的后端微服务.这是用GO编写的简单REST api.在服务方面,在我的处理程序中,我对我的舞台路线添加了全部捕获响应,然后对/nmapscan路线添加了"Hello World"响应,这就是我要达到的目标.但是,当我尝试使用调用URL来访问后端服务时,尽管请求路径在我的请求响应输出中显示为正确,但我仍会获得全部响应.我是API Gateway的新手,我感觉自己缺少一些简单的东西.另外,当我在本地运行容器时,我连接了一个外壳并运行curl localhost:8000/v1/nmapscan并获得了正确的"Hello World!".回复.以下是响应,我的配置以及流日志的响应:

I am trying to configure API Gateway to route requests to a specific route on my backend GO microservice. I am using a GET request method with a VPC_LINK integration with an NLB, which routes to my backend microservice running in Fargate. This is a simple REST api written in GO. On the service side, in my handler, I put a catch all response for my stage route and then a "Hello World" response for the /nmapscan route, which is what I am trying to hit. However, when I try to hit my backend service with the invocation url, I keep getting the catch all response, despite the request path appearing correct in my request response output. I am new to API Gateway and I have a feeling I am missing something simple. Also, when I ran the container locally, I attached a shell and ran curl localhost:8000/v1/nmapscan and got the correct "Hello World!" response. Below is the response, my configuration, as well as the response from the flow logs:

RESPONSE:

user$ curl -v -X GET https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/v1/nmapscan/
> GET /v1/nmapscan/ HTTP/2
> Host: xxxxxxxxxx.execute-api.us-east-1.amazonaws.com
> User-Agent: curl/7.54.0
> Accept: */*
> 
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200 
< content-type: application/json
< content-length: 27
< date: Wed, 25 Sep 2019 20:24:16 GMT
< x-amzn-requestid: df90f051-dbdd-405f-a708-73668ad955f1
< x-amz-apigw-id: XXXXXXXXXXX=
< x-amzn-trace-id: Root=1-5d8bccf0-44ebf9c5af13c90e1636de42
< x-cache: Miss from cloudfront
< via: 1.1 b7ddb18a56b4bad68ca78b085e9ca451.cloudfront.net (CloudFront)
< x-amz-cf-pop: EWR52-C2
< x-amz-cf-id: lvT1CGlv2fboFJ5AxE917Jr61Nwb4fQOwbranZ3s_vz0EJULhcwudQ==
< 
* Connection #0 to host xxxxxxxxx.execute-api.us-east-1.amazonaws.com left intact
This is the catch all path!

如您所见,这将返回catch all响应.它应该返回"Hello World!".

As you can see, this is returning the catch all response. It should return "Hello World!".

Configuration:

resource "aws_api_gateway_rest_api" "GOAPI" {
  name        = "GO"
  description = "REST API for GO APIs"
}

resource "aws_api_gateway_resource" "test" {
  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  parent_id   = "${aws_api_gateway_rest_api.GOAPI.root_resource_id}"
  path_part   = "nmapscan"
}

resource "aws_api_gateway_method" "testmethod" {
  rest_api_id   = "${aws_api_gateway_rest_api.GOAPI.id}"
  resource_id   = "${aws_api_gateway_resource.test.id}"
  http_method   = "GET"
  authorization = "NONE"
  request_parameters = {
    "method.request.path.nmapscan" = true
  }
}

resource "aws_api_gateway_integration" "integrationtest" {
  connection_type = "VPC_LINK"
  connection_id   = "${aws_api_gateway_vpc_link.test.id}"
  type = "HTTP"
  integration_http_method = "GET"
  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  resource_id = "${aws_api_gateway_resource.test.id}"
  http_method = "${aws_api_gateway_method.testmethod.http_method}"
  uri = "${format("http://%s:8000", aws_lb.myapis.dns_name)}"

//  request_parameters = {
//    "integration.request.path.nmapscan" = "method.request.path.nmapscan"
//  }
}


resource "aws_api_gateway_method_response" "test-200" {
  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  resource_id = "${aws_api_gateway_resource.test.id}"
  http_method = "${aws_api_gateway_method.testmethod.http_method}"
  status_code = "200"

  response_models = {
    "application/json" = "Empty"
  }
}

resource "aws_api_gateway_integration_response" "testintegrationresponse" {
  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  resource_id = "${aws_api_gateway_resource.test.id}"
  http_method = "${aws_api_gateway_method.testmethod.http_method}"

  status_code = "${aws_api_gateway_method_response.test-200.status_code}"

  response_templates = {
    "application/json" = ""
  }
}

resource "aws_api_gateway_deployment" "testdeploy" {
  depends_on = ["aws_api_gateway_integration.integrationtest"]

  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  stage_name = "v1"
}

Flow Logs:

(fdaa14d3-08df-4847-ba63-a9644a65d265) Method request body before transformations:
(fdaa14d3-08df-4847-ba63-a9644a65d265) Endpoint request URI: http://xxx-yyy-zzzzzzz.elb.us-east-1.amazonaws.com:8000
(fdaa14d3-08df-4847-ba63-a9644a65d265) Endpoint request headers: {x-amzn-apigateway-api-id=cqq6k2xrw3, Accept=application/json, User-Agent=AmazonAPIGateway_cqq6k2xrw3, Host=xxx-yyy-zzzzzz.elb.us-east-1.amazonaws.com, X-Amzn-Trace-Id=Root=1-5d8c2eee-51c73680b040aea02ab1dd14}
(fdaa14d3-08df-4847-ba63-a9644a65d265) Endpoint request body after transformations:
(fdaa14d3-08df-4847-ba63-a9644a65d265) Sending request to http://xxx-yyy-zzzzzzz.elb.us-east-1.amazonaws.com:8000
(fdaa14d3-08df-4847-ba63-a9644a65d265) Received response. Status: 200, Integration latency: 15 ms
(fdaa14d3-08df-4847-ba63-a9644a65d265) Endpoint response headers: {Content-Type=application/json, Date=Thu, 26 Sep 2019 03:22:22 GMT, Content-Length=27}
(fdaa14d3-08df-4847-ba63-a9644a65d265) Endpoint response body before transformations: This is the catch all path!
(fdaa14d3-08df-4847-ba63-a9644a65d265) Method response body after transformations: This is the catch all path!
(fdaa14d3-08df-4847-ba63-a9644a65d265) Method response headers: {X-Amzn-Trace-Id=Root=1-5d8c2eee-51c73680b040aea02ab1dd14, Content-Type=application/json}
(fdaa14d3-08df-4847-ba63-a9644a65d265) Successfully completed execution
(fdaa14d3-08df-4847-ba63-a9644a65d265) Method completed with status: 200

推荐答案

您的帖子看起来像如果您确信这不是该响应中提到的内容,那么我将检查您的集成请求中的路由.

If you are convinced it's not the things mentioned in that response, then I would check the routing in your integration request.

您的curl请求的URI是/v1/nmapscan/,这意味着API网关将查看STAGE v1资源/nmapscan.一旦发生这种情况,API GW就会根据集成请求中配置的uri将请求发送到VPC链接.我对Terraform不太熟悉,但是好像您将其发送到:

The URI of your curl request is /v1/nmapscan/ which means API Gateway will look at STAGE v1, resource /nmapscan. Once that occurs, API GW sends the request to the VPC Link based on the uri configured in the Integration Request. I'm not super familiar with Terraform, but it looks like you are sending it to:

http://aws_lb.myapis.dns_name:8000

我还看到您在terraform中定义了请求参数"(但可能已注释掉了?):

I also see that you have "request parameters" defined in terraform(but maybe commented out?):



    //  request_parameters = {
    //    "integration.request.path.nmapscan" = "method.request.path.nmapscan"
    //  }

我将检查部署后,API GW控制台中的Integration Request是否显示已将其路由到正确的路由.不确定,我假设您的应用程序路径实际上是 http://aws_lb.myapis.dns_name/nmapscan:8000 ,并且由于某种原因在集成请求中未正确映射,因此未正确传递给NLB.

I would check that after deployment, the Integration Request in the API GW Console shows that this is being routed to the proper route. Without knowing for sure, I'm assuming your application path is actually http://aws_lb.myapis.dns_name/nmapscan:8000 and that's not being passed correctly to the NLB because it isn't properly mapping for some reason in the Integration Request.

总而言之,在将请求发送到NLB时查看URI的最简单方法是启用API网关执行日志,并在这些日志上启用完整的请求/响应数据.它会给你类似的东西:

All of that being said, the easiest way to see what the URI is when the request is being sent to the NLB is to enable API Gateway execution logs, and enable full request/response data on those logs. It will give you something similar to this:



    (32e76dc1-2e80-11e9-b849-1d4cbf2f1403) Endpoint request body after transformations: {"resource":"/testproxy","path":"/testproxy","httpMethod":"GET","headers":[TRUNCATED]
    (32e76dc1-2e80-11e9-b849-1d4cbf2f1403) Sending request to [TRUNCATED]

为简洁起见,我将其截断,但您可以在此处看到路径定义.对此进行研究将有助于缩小错误源的范围.

I truncated for brevity but you can see the path definition there. It will be useful to look at that to narrow down where the error is originating.

这篇关于AWS API Gateway Method请求路径参数不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆