前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー