Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Terraform, how do you specify an API Gateway endpoint with a variable in the request path?

In AWS API Gateway, I have a endpoint defined as /users/{userId}/someAction, and I'm trying to recreate this with terraform

I would start having some sort of linked gateway_resource chain like so...

resource "aws_api_gateway_resource" "Users" {   rest_api_id = "${var.rest_api_id}"    parent_id = "${var.parent_id}"    path_part = "users" }  //{userId} here?  resource "aws_api_gateway_resource" "SomeAction" {   rest_api_id = "${var.rest_api_id}"    parent_id = "${aws_api_gateway_resource.UserIdReference.id}"   path_part = "someAction" } 

In which I then define the aws_api_gateway_method and everything else.

How do I define this endpoint in terraform? The terraform documentation and examples don't cover this use case.

like image 652
iquestionshard Avatar asked Aug 19 '16 13:08

iquestionshard


People also ask

What is the role of the integration request in an API method in Amazon API gateway?

An integration request is an HTTP request that API Gateway submits to the backend, passing along the client-submitted request data, and transforming the data, if necessary. The HTTP method (or verb) and URI of the integration request are dictated by the backend (that is, the integration endpoint).

What is Aws_api_gateway_integration?

Resource: aws_api_gateway_integration. Provides an HTTP Method Integration for an API Gateway Integration.

When configuring a new API method in API gateway using the mock integration type which configuration setting requires no changes?

Hence, When configuring a new API method in API Gateway integration response configuration needs no changes.


1 Answers

You need to define a resource whose path_part is the parameter you want to use:

// List resource "aws_api_gateway_resource" "accounts" {     rest_api_id = var.gateway_id     parent_id   = aws_api_gateway_resource.finance.id     path_part   = "accounts" }  // Unit resource "aws_api_gateway_resource" "account" {   rest_api_id = var.gateway_id   parent_id   = aws_api_gateway_resource.accounts.id   path_part   = "{accountId}" } 

Then you create the method and enable the path parameter:

resource "aws_api_gateway_method" "get-account" {   rest_api_id   = var.gateway_id   resource_id   = var.resource_id   http_method   = "GET"   authorization = "NONE"    request_parameters = {     "method.request.path.accountId" = true   } } 

And finally you can successfully create the mapping within the integration:

resource "aws_api_gateway_integration" "get-account-integration" {     rest_api_id             = var.gateway_id     resource_id             = var.resource_id     http_method             = aws_api_gateway_method.get-account.http_method     type                    = "HTTP"     integration_http_method = "GET"     uri                     = "/integration/accounts/{id}"     passthrough_behavior    = "WHEN_NO_MATCH"      request_parameters = {         "integration.request.path.id" = "method.request.path.accountId"     } } 

The method needs to be there - and with the parameter enabled - in order for the integration mapping to work.

like image 174
pesama Avatar answered Sep 20 '22 18:09

pesama