Kinesis Data Firehose で「Lambda.InvokeAccessDenied」が発生するときの対処方法

2022.01.08

困っていた内容

Kinesis Data Firehose で Lambda 関数によるデータ変換を設定しています。データを送信すると、S3 バケットのprocessing-failedフォルダに次のエラーが記録され、変換に失敗しました。データ変換を正常に実施させるには、どうしたら良いでしょうか?

{
    "attemptsMade": 4,
    "arrivalTimestamp": 123456789012,
    "errorCode": "Lambda.InvokeAccessDenied",
    "errorMessage": "Access was denied. Ensure that the access policy allows access to the Lambda function.",
    "attemptEndingTimestamp": 123456789012,
    "rawData": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
    "lambdaArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:hato_data_transformation_lambda:$LATEST"
}

どう対応すればいいの?

Kinesis Data Firehose に設定した IAM ロールをご確認ください。

データ変換を行う Lambda 関数は Kinesis Data Firehose から呼び出されます。Kinesis Data Firehose には IAM ロール(サービスロール)が設定でき、 Lambda 関数を呼び出すには設定した IAM ロールに Lambda 関数の呼び出し許可が必要となります。

そのため、Kinesis Data Firehose に設定した IAM ロールのアクセス権限を確認し、必要な権限が許可されているか、また許可するリソース名等の条件指定に誤りがないかご確認ください。

なお、Kinesis Data Firehose から Lambda 関数は呼び出す場合は次のアクセス許可が必要となります。

Amazon Kinesis Data Firehose によるアクセスの制御 - Amazon Kinesis Data Firehose

※リソース名(12行目)は適切な値に書き換える必要があります

{
    "Version": "2012-10-17",  
    "Statement":
    [    
        {
           "Effect": "Allow", 
           "Action": [
               "lambda:InvokeFunction", 
               "lambda:GetFunctionConfiguration" 
           ],
           "Resource": [
               "arn:aws:lambda:region:account-id:function:function-name:function-version"
           ]
        }
    ]
}

Kinesis に設定した IAM ロールがわからないときは?

Kinesis Data Firehose に設定した IAM ロールは、Kinesis コンソールもしくは AWS CLI のdescribe-delivery-streamコマンドから確認できます。

Kinesis コンソールから確認する場合は、「Configuration」タブをクリックします。

ページ最下部の「Permissions」セッションに IAM ロール が表示されます。クリックすると IAM ロールの詳細画面に遷移します。
※右上の「Edit」は設定する IAM ロールを変更する場合に使用します。ポリシーを編集する場合はリンクをクリックしてください。

参考資料