TerraformでつくったAWS LambdaにEventBridgeのトリガーが有効にならない時は
2024-04-30
azblob://2024/04/29/eyecatch/2024-04-30-terraform-aws-lambda-eventbridge-trigger-000.jpg

こちらの記事はなむゆの個人ブログにもマルチポストしてます。
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のトリガー作成画面にも以下のような注意書きがあります。

注: 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が設定されているように見えてしまうのですが、実際にはトリガーが設定されておらず動作もしません。
紛らわしいですよね~

解決策

ということで、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人くらいが引っかかるかと思います、そんな方の助けになれば幸いです~