1ヶ月のブログとなります。皆さんお元気ですか!?最近、API GatewayをバシバシTerraform化しているのですが、rootのリソース /
配下にPOSTメソッドを設定する場合、どうしても以下のようになってしまい、見事にハマりました。
今回は下記のように設定したい場合、ブログしたいと思いますが、まずはNGだったコードを見てみましょう。
api_gateway.tf
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_resource
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_method
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
resource "aws_api_gateway_rest_api" "hoge" { name = "hoge" endpoint_configuration { types = ["REGIONAL"] } } resource "aws_api_gateway_resource" "hoge" { rest_api_id = aws_api_gateway_rest_api.hoge.id parent_id = aws_api_gateway_rest_api.hoge.root_resource_id path_part = "/" } resource "aws_api_gateway_method" "hoge" { rest_api_id = aws_api_gateway_rest_api.hoge.id resource_id = aws_api_gateway_resource.hoge.id http_method = "POST" authorization = "NONE" } ~省略~ |
メソッドは上記のようにリソースを定義しないとTerraformの変数として取り出すことができません。ちなみに path_part = "/"
にしていますが、これだと下記のように /
は文字列として対応していないから直せと怒られてしまいます。なので、 POST
でイケるかと思い上記のようにrootリソース配下にPOSTができてしまい、その配下にPOSTメソッドができちゃうわけですね。(そりゃそうだ)じゃあどうするのといったところで、ドキュメントにも見当たらず、stack overflowにて発見しました。
Error: Error creating API Gateway Resource: BadRequestException: Resource’s path part only allow a-zA-Z0-9._- or a valid greedy path variable and curly braces at the beginning and the end.
Terraform: How to create a api gateway POST method at root?
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:
ルートリソースはAPI Gateway REST APIの作成の一部として自動的に作成されます。 TerraformではそのルートリソースのIDはREST APIリソースインスタンスのroot_resource_id属性として公開されます。 そのリソースはAPIの一部として暗黙的に作成されるため、個別のリソースは必要ありません。 代わりに、メソッド(およびその他の必要なダウンストリームオブジェクト)を既存のルートリソースに直接アタッチできます。
- api_gateway.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
resource "aws_api_gateway_rest_api" "hoge" { name = "hoge" endpoint_configuration { types = ["REGIONAL"] } } resource "aws_api_gateway_method" "post-hoge" { rest_api_id = aws_api_gateway_rest_api.hoge.id resource_id = aws_api_gateway_rest_api.hoge.id http_method = "POST" authorization = "NONE" } ~追記~ resource "aws_api_gateway_integration" "hoge_intergration" { rest_api_id = aws_api_gateway_rest_api.hoge.id resource_id = aws_api_gateway_rest_api.hoge.root_resource_id http_method = aws_api_gateway_method.post-hoge.http_method type = "AWS_PROXY" cache_namespace = aws_api_gateway_rest_api.hoge.root_resource_id content_handling = "CONVERT_TO_TEXT" integration_http_method = "POST" passthrough_behavior = "WHEN_NO_MATCH" uri = aws_lambda_function.hoge.invoke_arn } resource "aws_api_gateway_deployment" "hoge_stg" { depends_on = [aws_api_gateway_rest_api.hoge] rest_api_id = aws_api_gateway_rest_api.hoge.id stage_name = "stg" triggers = { redeployment = "v0.1" } lifecycle { create_before_destroy = true } } |
aws_api_gateway_resource
は指定する必要なく、既存の aws_api_gateway_method
から aws_api_gateway_rest_api
を resource_id
に指定すればOKとのことでした。そりゃ論理的に考えるとそうだわと言う感じですな。
まとめ
盲点過ぎる!!しかし、ちゃんと考えればできていたような気がする…
ドキュメントの例外として書いてもらえるとありがたき!
0件のコメント