質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

2283閲覧

terraformの設定がAPI Gatewayに反映されない

suzunashi

総合スコア16

Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/11/02 03:53

編集2021/11/02 23:55

前提・実現したいこと

terraformでLambdaとAPI Gatewayを作成し、applyするとエラー無くapplyされるのに、APIgatewayに設定が完全に反映されません。
もう一度applyすると反映されます。

仕様なのか設定に不足があるのかが分かりません。

発生している問題①APIgatewayに設定が反映されない

コード内でLamdaをしているのに統合リクエストのLambda関数が空欄になり、設定されない状態となります。
もう一度applyするとlambda関数は選択された状態になります。
イメージ説明

HCL

1resource "aws_api_gateway_rest_api" "example" { 2 name = "example-api" 3 description = "sample" 4 endpoint_configuration { 5 types = ["REGIONAL"] 6 } 7} 8resource "aws_api_gateway_resource" "example" { 9 # 諸々設定 10} 11resource "aws_api_gateway_method" "example" { 12 # 諸々設定 13} 14resource "aws_api_gateway_integration" "example" { 15 rest_api_id = aws_api_gateway_rest_api.example.id 16 resource_id = aws_api_gateway_resource.example.id 17 http_method = aws_api_gateway_method.example.http_method 18 integration_http_method = "GET" 19 uri = aws_lambda_function.example.invoke_arn 20}

発生している問題②権限情報が足りてない?

イメージ説明
2度目のapplyでlambdaが設定されても、Apigatewayでテストを実行すると500エラーとなります。

イメージ説明
GUIで統合リクエスト>Lambda関数ですでに設定されているLambda関数を再設定するとテストは200となり解決します。

HCL

1resource "aws_lambda_permission" "example" { 2 # 諸々設定 3 source_arn = "${aws_apigateway_rest_api.example.execution_arn}/*" 4}

権限の問題かと思ったのですが、aws_lambda_permissionは設定しています。
足りない部分があればご教授お願いします。

お願いしたいこと

terraformでの設定値が足りないのか、仕様なのか判断が付きません。
1度のapplyでlambda関数が反映され、Apigatewayのテストを実行しても200が返ってくる様にしたいです。
何卒ご教授お願いします。

問題②について追加情報

lambdaのコードを追加しました。

HCL

1resource "aws_lambda_function" "example" { 2 function_name = "example" 3 role = aws_iam_role.lambda.arn 4 handler = "lambda_function.lambda_handler" 5 runtime = "python3.7" 6 filename = "lambda_function.zip" 7 description = "Sample" 8 memory_size = "128" 9 timeout = "3" 10 tags = { 11 "Name" = "Example-lmd" 12 } 13} 14 15resource "aws_lambda_permission" "example" { 16 statement_id = "AllowAPILambdaPremission" 17 action = "lambda:InvokeFunction" 18 function_name = aws_lambda_function.example.function_name 19 principal = "apigateway.amazonaws.com" 20 source_arn = "${aws_api_gateway_rest_api.example.execution_arn}/*" 21}

aws_lambda_permissionのsource_arnを下記に設定してもダメでした。

source_arn = "${aws_api_gateway_rest_api.example.execution_arn}/*/GET/servers/*/users/*/config"

問題②の解決案実行後の手順

apply後にGUIでlambdaの再設定を行いました。
その際、lambdaにてトリガーが追加されていたので、追加された分を削除しました。
apigatewayでtestを実行すると200となります。

![イメージ説明

解決案の通り、terraformでplanを実行した所以下のような変更点が出力されました。

Terraform will perform the following actions: # aws_api_gateway_deployment.example must be replaced +/- resource "aws_api_gateway_deployment" "example" { ~ created_date = "2021-11-02T23:22:48Z" -> (known after apply) ~ execution_arn = "arn:aws:execute-api:ap-northeast-1:アカウントID:jlihn3alu4/" -> (known after apply) ~ id = "todot6" -> (known after apply) ~ invoke_url = "https://jlihn3alu4.execute-api.ap-northeast-1.amazonaws.com/" -> (known after apply) ~ triggers = { - "redeployment" = "3875530b499ff01a701c50620346694f9e676d2c" } -> (known after apply) # forces replacement # (1 unchanged attribute hidden) } # aws_api_gateway_integration.example must be replaced +/- resource "aws_api_gateway_integration" "example" { - cache_key_parameters = [] -> null ~ cache_namespace = "qj8p2r" -> (known after apply) - content_handling = "CONVERT_TO_TEXT" -> null ~ id = "agi-jlihn3alu4-qj8p2r-GET" -> (known after apply) ~ integration_http_method = "POST" -> "GET" # forces replacement ~ passthrough_behavior = "WHEN_NO_MATCH" -> (known after apply) - request_parameters = {} -> null - request_templates = {} -> null # (7 unchanged attributes hidden) } # aws_api_gateway_stage.example will be updated in-place ~ resource "aws_api_gateway_stage" "example" { ~ deployment_id = "todot6" -> (known after apply) id = "ags-jlihn3alu4-stg" tags = {} # (9 unchanged attributes hidden) } Plan: 2 to add, 1 to change, 2 to destroy.

-マークの付いていた下記をコード上で設定しました。
しかしapply後Api Gatewayでのtestで500エラーとなってしまいます。

- cache_key_parameters = [] -> null - request_parameters = {} -> null - request_templates = {} -> null - content_handling = "CONVERT_TO_TEXT" -> null 以下のように設定 content_handling = "CONVERT_TO_TEXT" request_parameters = {} request_templates = {} cache_key_parameters = []

#####不明な変更点
以下の変更点は、POSTの設定はないのにも関わらず出力されているので不明です。

POSTの設定してないので、なぜこれが変更点として出るのかは分かりません。 ~ integration_http_method = "POST" -> "GET" # forces replacement

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2021/11/02 06:55

terraform applyしたときの出力を載せられる範囲で載せてみてはどうでしょうか。
jhashimoto

2021/11/02 11:57

aws_lambda_function.exampleの定義が見当たりません。質問文に追加をお願いします。
suzunashi

2021/11/02 17:00

問題①はdepends_onを設定したら発現しなくなりました。 問題②に関しての追加情報を記載しました。よろしくお願いします。
guest

回答2

0

ベストアンサー

以下の変更点は、POSTの設定はないのにも関わらず出力されているので不明です。

POSTの設定してないので、なぜこれが変更点として出るのかは分かりません。
~ integration_http_method = "POST" -> "GET" # forces replacement

Lambdaとの統合はPOSTメソッドしかサポートしていません。

aws_api_gateway_integration | Resources | hashicorp/aws | Terraform Registry

Not all methods are compatible with all AWS integrations. e.g. Lambda function can only be invoked via POST.

マネジメントコンソールからLambda統合を設定すると、HTTPメソッドの項目はありませんが、バックグラウンドではPOSTに設定されています。

イメージ説明

統合タイプAWSサービスを選択すると、HTTPメソッドがPOSTに設定されていることが確認できます。

イメージ説明

試しに、HTTPメソッドをGETに変更して、テストを実行すると、500エラーになると思います。

なので、

~ integration_http_method = "POST" -> "GET" # forces replacement

こちらの差分を取り込むため、次のように変更します。

lang

1resource "aws_api_gateway_integration" "example" { 2 ... 3 integration_http_method = "POST" 4 ... 5}

-マークの付いていた下記をコード上で設定しました。

+は追加, -は削除, ~は変更を意味します。HTTPメソッドをPOSTにするだけで動くかもしれませんが、マネジメントコンソールから設定した状態を正とするなら、削除だけでなく、追加と変更もコードに反映させる必要があります。

尚、リソース作成時に自動で割り当てられる属性は、Terraformで設定しないのでコードへの反映は不要です。例えば、aws_api_gateway_deploymentのexecution_arnが、それにあたります。各リソースのリファレンスでAttributes Referenceのセクションを確認してください。

aws_api_gateway_deployment | Resources | hashicorp/aws | Terraform Registry

Attributes Reference

In addition to all arguments above, the following attributes are exported:

投稿2021/11/03 01:49

編集2021/11/03 04:57
jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzunashi

2021/11/03 11:10

integration_http_method = "POST"に設定したらapply後に200が返ってくる様になりました! getしか使ってないからとリファレンスの内容を見落としていました。。。 リンク付きで丁寧な解説も頂きありがとうございます。
guest

0

問題②について。

TerraformでAWSのリソースを管理する場合、AWSにあるリソースの状態とTerraformのコード/stateが同期していればいいので、次の2つの方法があります。

  • A. Teraformでリソースを構築
  • B. 手動で構築したリソースをTerraformの管理下に取り込む

また、AとBの折衷案として、次の方法が可能です。

  1. Teraformでリソースを構築
  2. Teraformの外部(今回はマネジメントコンソールかと思います)でリソースを変更する
  3. 2の変更分をTerraformに取り込む

今回は2まではできているので、この方法がよいかと思います。

  1. terraformでapply(問題①が解決済みであれば、一度でいいはず)
  2. 「Apigatewayでテストを実行すると500エラー」
  3. 「GUIで統合リクエスト>Lambda関数ですでに設定されているLambda関数を再設定するとテストは200」

この手順は試されていると思いますが、3.の後にterraform planを実行してみてください。

Terraformで作成したAWSのリソースを外部から変更した場合、リソースの状態とTerraformのstateに差分があるはずです。その差分がマネジメントコンソールからの変更で設定された属性であり、Terraformで設定すべき属性です。

設定すべき属性がわかったら、Terraformのコードに反映します。その後、もう一度terraform planを実行して差分がないことを確認してください。

投稿2021/11/02 21:34

編集2021/11/02 22:16
jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzunashi

2021/11/02 23:58

提案頂いた手順の通り行ったのですが、500エラーが返って来ました。 コードに追加する内容が間違っていましたら、ご指摘頂けますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問