更新日付:2022年8月31日
こんにちは。運用開発グループの木村です。今回はTerraformでAWSリソースからLambdaを呼び出す際の注意点について話したいと思います。
aws_lambda_permissionを忘れないようにしよう
Terraformではaws_lambda_permissionを記述しておかないと、EventBridgeやSNS、S3などからLambdaを呼び出すことができません。これはaws_lambda_functionのドキュメントにも記載されていますが、自分がTerraformを使っていて、たまにaws_lambda_permissionを記述し忘れることがあったので、今回記事としてまとめました。
公式ドキュメントからの引用
To give an external source (like an EventBridge Rule, SNS, or S3) permission to access the Lambda function, use the aws_lambda_permission resource. See Lambda Permission Model for more details. On the other hand, the
role
argument of this resource is the function’s execution role for identity and access to AWS services and resources.
aws_lambda_permissionが無くてもデプロイできてしまう
aws_lambda_permissionが記述されていない状態で、terraform applyを実行すると、エラーにならずデプロイが完了してしまいます。例えば以下のコードのようにLambdaとEventBridgeを記述した場合、問題なくデプロイすることができますが、EventBridgeで設定したスケジュール時刻になってもLambdaは実行されません。
aws_lambda_permissionを記述しないtfファイルの例
resource "aws_cloudwatch_event_rule" "test_event_bridge" {
name = "test_event_bridge"
schedule_expression = "cron(0 1 * * ? *)"
}
resource "aws_cloudwatch_event_target" "test_event_bridge_target" {
rule = aws_cloudwatch_event_rule.test_event_bridge.name
arn = aws_lambda_function.test_lambda.arn
}
resource "aws_iam_role" "test_iam_for_lambda" {
name = "test_iam_for_lambda"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOF
}
resource "aws_lambda_function" "test_lambda" {
function_name = "test_lambda"
role = aws_iam_role.test_iam_for_lambda.arn
handler = "src/test_lambda.lambda_handler"
runtime = "python3.9"
architectures = ["x86_64"]
filename = "lambda/function.zip"
}
AWSマネジメントコンソールで確認する
aws_lambda_permissionが記述されていない状態でデプロイした場合、AWSマネジメントコンソール上でLambdaを確認すると、トリガーが設定されていないことが分かります。
先ほどのtfファイルにaws_lambda_permissionを追記してterraform applyを実行すると、LambdaのトリガーとしてEventBridgeが追加されます。
resource "aws_lambda_permission" "test_lambda_permission" {
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.test_lambda.function_name
principal = "events.amazonaws.com"
source_arn = aws_cloudwatch_event_rule.test_event_bridge.arn
}
このようにAWSマネジメントコンソールを確認すれば、aws_lambda_permissionが正しく記述されているかどうかは確認することができます。
まとめ
今回はTerraformでAWSリソースからLambdaを呼び出す際の注意点について、内容としては簡単なことですが、油断しているとaws_lambda_permissionの記述を忘れてしまうこともあるかと思い、記事にしてみました。Terraformのデプロイが問題なく完了していても想定した動作ができていない場合があるので、動作確認等実施するように気を付けましょう!