起こったこと
╷
│ Error: putting CloudWatch Logs Subscription Filter (subscription-filter): InvalidParameterException: Could not execute the lambda function. Make sure you have given CloudWatch Logs permission to execute your function.
│
│ with aws_cloudwatch_log_subscription_filter.this,
│ on main.tf line 34, in resource "aws_cloudwatch_log_subscription_filter" "this":
│ 34: resource "aws_cloudwatch_log_subscription_filter" "this" {
│
CloudwatchLogsのロググループにサブスクリプションフィルターを通してLambda関数を発火させる構成をTerraformで作成していたところ、上記のエラーが発生した。
# ロググループの作成
resource "aws_cloudwatch_log_group" "this" {
name = "/test/log_group"
}
# Lambda関数の作成
resource "aws_lambda_function" "this" {
function_name = "lambda-function"
handler = "index.handler"
runtime = "nodejs18.x"
filename = "./lambda_function.zip"
role = "arn:aws:iam::123456789012:role/_lambda_exection_role"
}
# サブスクリプションフィルタの設定
resource "aws_cloudwatch_log_subscription_filter" "this" {
name = "subscription-filter"
log_group_name = aws_cloudwatch_log_group.this.name
filter_pattern = "hoge"
destination_arn = aws_lambda_function.this.arn
}
原因
CloudwatchLogsがLambda関数を起動するためのポリシーの設定が必要。Lambda関数には他のAWSリソースと同様にリソースベースのポリシーを設定可能だが、AWSマネジメントコンソールで作成するときは自動で設定されるため、うっかり忘れていた。
エラーを回避するには
Lambda関数へCloudwatchLogs用の権限を付与するポリシーを追加する。json形式ではなく、Terraformの引数としてパラメータを記述する。
resource "aws_lambda_permission" "this" {
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.this.function_name
principal = "logs.amazonaws.com"
source_arn = "${aws_cloudwatch_log_group.this.arn}:*"
}
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.