3
votes

I am trying to create POST method using terraform at the root api gateway URL such as https://somehash.execute-api.us-east-1.amazonaws.com/dev which would include the stage. Here is part of the terraform plan of concern:

resource "aws_api_gateway_rest_api" "api" {
  name = "submit-dev-gateway-api"
}

resource "aws_api_gateway_resource" "resource" {
  rest_api_id = "${aws_api_gateway_rest_api.api.id}"
  parent_id = "${aws_api_gateway_rest_api.api.root_resource_id}"
  path_part = "submit"
}

resource "aws_api_gateway_method" "post_form" {
  rest_api_id   = "${aws_api_gateway_rest_api.api.id}"
  resource_id   = "${aws_api_gateway_resource.resource.id}"
  http_method   = "POST"
  authorization = "NONE"
}
...

I tried changing the path_part to "/" but it did not work. I could not create a aws_api_gateway_method resource without aws_api_gateway_resource. I can create a POST at root manually without terraform which looks like this: manual

When I use the above terraform plan I get this: terraform

How do I create POST at root with terraform?

2
What if you remove path_part = "submit" from terraform script? - Chetan
I get this error: The argument "path_part" is required, but no definition was found. - nealous3
Try putting path_part = "" or path_part = "\" - Chetan
Got this error for empty string BadRequestException: Resource's path part must be specified. "\" is same as "/". Doesn't work. - nealous3

2 Answers

12
votes

The "root resource" is created automatically as part of creating an API Gateway REST API. In Terraform, the id of that root resource is exposed as the root_resource_id attribute of the REST API resource instance.

Because that resource is implicitly created as part of the API, we don't need a separate resource for it. Instead, we can just attach methods (and the other necessary downstream objects) directly to that existing root resource:

resource "aws_api_gateway_rest_api" "api" {
  name = "submit-dev-gateway-api"
}

resource "aws_api_gateway_method" "post_form" {
  rest_api_id   = aws_api_gateway_rest_api.api.id
  resource_id   = aws_api_gateway_rest_api.api.root_resource_id
  http_method   = "POST"
  authorization = "NONE"
}
0
votes

You must check path_part. Try

path_part   = "{submit}"

The path_part argument will contain a string that represents the endpoint path. Read more path_part