TerraformでつくったAWS LambdaにEventBridgeのトリガーが有効にならない時は
こちらの記事はなむゆの個人ブログにもマルチポストしてます。
https://namyusql.hatenablog.com/entry/2024-04-30-terraform-aws-lambda-e…
シンプルな答え
aws_lambda_permission リソースを作成する必要があります。
resource "aws_lambda_permission" "this" {
action = "lambda:InvokeFunction"
function_name = <作成したLambdaのリソース名>
principal = "events.amazonaws.com"
source_arn = <作成したaws_cloudwatch_event_ruleリソースのARN>
}
原因
TerraformでLambdaにEventBridgeからのトリガーを作成する際には、EventBridgeからLambdaにアクセスさせる権限を別途付与する必要があります。
この権限の付与はAWSコンソール上からトリガーを作成する際には自動で行われるのですが、AWS CLIやSDK、CloudFormation等の仕組みを使用してトリガーを作成する場合は手動で実行するする必要があるようです。
Terraformでもこれと同様で手動で権限を付与しなければEventBridgeからLambdaにアクセスできなくてトリガーが動作しないということなのですね。
EventBridgeのトリガー作成画面にも以下のような注意書きがあります。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2024-04-30-terraform-aws-lambda-eventbridge-trigger-003.png)
注: EventBridge コンソールを使用する場合、EventBridge は選択したターゲットについて適切な許可を自動的に設定します。AWS CLI、SDK、または CloudFormation を使用している場合は、適切な許可を設定する必要があります。
TerraformのLambdaのドキュメントにもNoteがあります。
To give an external source (like an EventBridge Rule, SNS, or S3) permission to access the Lambda function, use the aws_lambda_permission resource
症状
aws_lambda_permissionなしでもLambdaとEventBridge、そしてそのトリガー自体はエラーも起こさずに作成できてしまいます。
ただし、この状態ではEventBridgeで設定したトリガーは有効になっていません。
例えばcronを用いた定期実行を設定していても、そのタイミングでLambdaの実行がトリガーされることはありません。
コンソールからLambdaを確認すると、EventBridgeのトリガーが設定されていないことが確認できます。
一方でEventBridgeの方ではトリガーが作成されているのが確認でき、対象としてLambdaが設定されているように見えてしまうのですが、実際にはトリガーが設定されておらず動作もしません。
紛らわしいですよね~
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2024-04-30-terraform-aws-lambda-eventbridge-trigger-002.png)
解決策
ということで、TerraformでLambdaにEventBridgeからのトリガーを作成する際には、EventBridgeからLambdaにアクセスさせる権限を別途付与するためにaws_lambda_permissionリソースを作成します。
プレースホルダーのLambdaリソース名とEventBridgeのARNはそれぞれのリソースのものを設定してください。
Terraformの再apply後、コンソールのLambdaの概要画面でトリガーが設定されていれば成功です!
resource "aws_lambda_permission" "this" {
action = "lambda:InvokeFunction"
function_name = <作成したLambdaのリソース名>
principal = "events.amazonaws.com"
source_arn = <作成したaws_cloudwatch_event_ruleリソースのARN>
}
おわりに
コンソールで行ったことをTerraformに書き落とせばそのまま動くと考えていたら罠がありました。
コンソールの設定画面やTerraformのLambdaのドキュメントには注意書きがありますが、引っかかるまでこの仕様のこととは気づきませんでした。
おそらく同じことをしようとすれば100人のうち120人くらいが引っかかるかと思います、そんな方の助けになれば幸いです~