Kinesis Data Firehose の Lambda変換を設定した際に”processing-failed”フォルダが作成される

2021.07.21

いわさです。

CloudWatch Logsではサブスクリプションフィルターを介することで、ログを別のサービスに転送することが出来ます。
その宛先にKinesis Data Firehoseを指定することで、CloudWatch LogsのログデータをS3ストレージへ転送することが出来ます。

そして、Kinesis Data Firehoseの転送設定で Lambda関数を使ってログデータの変換処理を行うことも出来ます。
その設定を行った際に、S3バケットに見慣れないフォルダが作成されました。

調べてみると対した事ではなかったのですが、こういう現象起きるんだなという点を知って頂ければと思い、記事にしました。

見慣れない processing-failed フォルダ

前述のKinesis Data Firehoseからの転送時にLambda関数での変換を行うためには、以下のようにTransformプロパティに関数を指定します。

しばらくすると、S3へ転送されますが...

見慣れない、processing-failedというフォルダが作成されるようになりました。

こちらについて以下のドキュメントに記載されています。

Transformを初めてとする、Kinesis Data Firehoseのエラー挙動について記載がまとめられています。
その中に、「Lambda 変換の配信に失敗した場合は processing-failed」 との記載があります。

では、processing-failed内のファイルを解析してみましょう。

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

アクセス権限に関するエラーです。

一連の設定を行った際に新規ロールを作成、Lambda関数へアタッチしました。
しかし、上記エラーはLambda関数に設定するロールに関するエラーではなく、Kinesis Data Firehoseに設定するロール上にLambda関数へアクセスする権限が不足しているというエラーとなり、Kinesis Data Firehoseのデリバリーストリームへアタッチするロールへも権限を追加する必要がありました。

Kinesis Data FirehoseのロールにLambdaを実行する権限を与えて再度転送結果を確認してみましょう。

期待したディレクトリ構成でログ転送に成功しました。

まとめ

  • processing-failedディレクトリが作成されたら、中に格納されているのはエラーログです。解析してみましょう。
  • Kinesis Data Firehose上のマネジメントコンソールでLambda関数を関連付けしても良いように権限追加をしてくれるわけではないので Kinesis側のロールに割り当てられている権限も見直しましょう。

参考