スポンサーリンク
AWSKinesisLambda

Kinesis Data FirehoseでLambda連携エラーが発生した時の落とし穴

Kinesis

概要

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ロールに以下の権限が足りていない場合、権限を追加する必要があります。
エラーメッセージ通りの素直な対処。

Amazon データFirehose によるアクセス制御 - Amazon Data Firehose
IAM を使用して Amazon Data Firehose リソースへのアクセスとリソースからのアクセスを制御します。
{
    "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のバージョンがうまく指定されていなかったという結果でした。
なんだかんだ気づくまでに割と時間が掛かりました。。( ̄▽ ̄;)

コメント

タイトルとURLをコピーしました