概要
Kinesis Data Firehoseの配信ストリームを作成し、CloudWatchLogsへ出力されたアプリケーションログをS3へファイル出力する構成としました。
配信ストリームでは、アプリケーションログをログ整形用Lambdaへ連携して、Lambdaの処理完了後にS3へ出力します。
実際にアプリケーションログを出力し、配信ストリームの動作を確認したところ下記のようなエラーが出力されました。
Access was denied. Ensure that the access policy allows access to the Lambda function.
→アクセスが拒否されました。 アクセス ポリシーで Lambda 関数へのアクセスが許可されていることを確認してください。
今回のケースではエラーメッセージ通りの解決では無かったため、対処内容を記載いたします。
解決策①
IAMロールの権限不足
Firehoseの配信ストリームに設定したIAMロールに以下の権限が足りていない場合、権限を追加する必要があります。
エラーメッセージ通りの素直な対処。
{
"Version": "2012-10-17",
"Statement":
[
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction",
"lambda:GetFunctionConfiguration"
],
"Resource": [
"<lambdaのARN>:$LATEST"
]
}
]
}
解決策②
実はLambdaのバージョンが指定されていない
コンソール上の設定画面で、Lambdaの設定を確認すると見掛け上は “Lambda関数のバージョン:$LATEST” と問題なくバージョンが指定されているように見えますが、内部的には設定されていない可能性があります。
「編集」ボタンを押下します。
編集画面からLambdaのバージョン設定値を確認し、空になっていた場合はバージョンを選択して変更を保存します。
原因
Terraformのコードで、下記$LATESTのようにLambdaのバージョンを指定していないと発生します。
resource "aws_kinesis_firehose_delivery_stream" "xxxxx" {
・・・
processing_configuration {
enabled = "true"
processors {
type = "Lambda"
parameters {
parameter_name = "LambdaArn"
parameter_value = "<lambdaのARN>:$LATEST"
}
parameters {
parameter_name = "BufferSizeInMBs"
parameter_value = 1
}
parameters {
parameter_name = "BufferIntervalInSeconds"
parameter_value = 60
}
}
}
}
・・・
}
あとがき
Terraformのコードをミスってタイトルのようなエラーが発生し、IAM権限回りを調査しまくっていましたが、原因はLambdaのバージョンがうまく指定されていなかったという結果でした。
なんだかんだ気づくまでに割と時間が掛かりました。。( ̄▽ ̄;)
コメント