Kinesis Data Firehose と Amazon S3 の間のデータ配信エラーのトラブルシューティング方法を教えてください。

最終更新日: 2022 年 6 月 20 日

Amazon Kinesis Data Firehose から Amazon Simple Storage Service (Amazon S3) バケットにデータを送信しようとしていますが、失敗します。これを解決するにはどうすれば良いですか?

簡単な説明

Kinesis Data Firehose が Amazon S3 バケットにデータを配置しようとしていることを確認するには、 DeliveryToS3.Success メトリクスを確認します。DeliveryToS3.Success メトリクス値が一貫してゼロの場合は、次の領域を確認します。

  • リソースの可用性
  • 受信データレコード
  • Kinesis Data Firehose ログ
  • AWS Identity and Access Management (IAM) ロールのアクセス許可
  • Kinesis Data Firehose サーバー側の暗号化
  • AWS KMS で暗号化された Amazon S3 バケット
  • AWS Lambda の呼び出し

解決方法

リソースの可用性

Kinesis Data Firehose 配信ストリームで指定された S3 バケットの可用性を確認します。データ変換機能を使用している場合は、指定された Lambda 関数が存在することを確認します。

受信データレコード

IncomingRecords および IncomingBytes メトリクスをチェックして、Kinesis Data Firehose がデータを受信していることを確認します。IncomingRecords または IncomingBytes のメトリクス値がゼロの場合、Kinesis Data Firehose に到達するレコードがないことを示します。配信ストリームがソースとして Amazon Kinesis データストリームを使用する場合、ストリームソースの IncomingBytes および IncomingRecords メトリクスを確認します。また、 DataReadFromKinesisStream.Bytes および DataReadFromKinesisStream.Records メトリクスが配信ストリームから出力されるかどうかを確認します。これらのメトリクスの詳細については、「データ配信 CloudWatch メトリクス」を参照してください。

Kinesis Data Firehose に到達するデータがない場合、アップストリームに問題がある可能性があります。直接の PUT オペレーションでは、Kinesis Data Firehose にレコードを配置するために使用される PutRecord および PutRecordBatch API が正しく呼び出されていることを確認します。

Kinesis Data Firehose ログ

Kinesis Data Firehose のログ記録が有効になっていることを確認します。ログ記録が有効になっていない場合は、エラーログで配信エラーを確認します。エラーログは、配信エラーの具体的な理由を示します。これにより、問題のある領域のトラブルシューティングが行えます。ロググループ名の形式は /aws/kinesisfirehose/delivery-stream-name です。

次に、ロールに以下のアクセス許可を使用します。

"Action": [
               "logs:PutLogEvents"
           ],
           "Resource": [
               "arn:aws:logs:region:account-id:log-group:log-group-name:log-stream:log-stream-name"
           ]

IAM ロールのアクセス許可

Kinesis Data Firehose 配信ストリームで指定された IAM ロールに正しいアクセス許可があることを確認します。ストリームで有効になっているパラメータに応じて、いくつかのアクセス許可が必要です。詳細については、「Amazon S3 の送信先へのアクセス権を Kinesis Data Firehose に付与する」を参照してください。

[Amazon S3 access] では、次のように IAM ポリシーを更新します。

"Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject"
            ],     
            "Resource": [       
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"                         
            ]

Lambda 関数のデータ変換を許可するには、次のようにポリシーを更新します。

"Action": [
               "lambda:InvokeFunction",
               "lambda:GetFunctionConfiguration"
           ],
           "Resource": [
               "arn:aws:lambda:region:account-id:function:function-name:function-version"
           ]

ソースとしてリストされている Kinesis データストリームでは、次のようにポリシーを更新します。

"Action": [
                "kinesis:DescribeStream",
                "kinesis:GetShardIterator",
                "kinesis:GetRecords",
                "kinesis:ListShards"
            ],
            "Resource": "arn:aws:kinesis:region:account-id:stream/stream-name"

Kinesis Data Firehose サーバー側の暗号化

Kinesis Data Firehose では、Amazon S3 に配信されるデータを暗号化するために、AWS Key Management Service (AWS KMS) を使用した Amazon S3 サーバー側の暗号化がサポートされています。サーバー側の暗号化を許可するには、IAM ロールポリシーを次のように更新します。

"Action": [
               "kms:Decrypt",
               "kms:GenerateDataKey"
           ],
           "Resource": [
               "arn:aws:kms:region:account-id:key/key-id"          
           ],
           "Condition": {
               "StringEquals": {
                   "kms:ViaService": "s3.region.amazonaws.com"
               },
               "StringLike": {
                   "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::bucket-name/prefix*"
               }
           }

AWS KMS で暗号化された S3 バケット

Kinesis Data Firehose 配信ストリームの IAM ロールに正しいアクセス許可があることを確認します。AWS KMS で暗号化された Amazon S3 バケットにデータを配信するには、キーポリシーで Kinesis Data Firehose IAM ロールが許可されている必要があります。詳細については、Amazon S3 バケットへの書き込み時に Kinesis Data Firehose の「Access Denied」というエラーを解決するにはどうすればよいですか?を参照してください。

Lambda の呼び出し

配信ストリームで指定された Lambda 関数の可用性を確認します。Lambda 関数が見つからないか、削除されている場合は、新しい Lambda 関数を作成して呼び出します。

Kinesis Data Firehose ExecuteProcessingSuccess および Errors メトリクスをチェックして、Data Firehose が Lambda 関数を呼び出そうとしたことを確認します。呼び出せなかった場合は、Amazon CloudWatch ロググループで </aws/lambda/functionname> の場所を確認し、Lambda が呼び出されない理由を特定します。Lambda 変換があり、Lambda 関数が呼び出された場合は、呼び出しの継続時間を調べます。継続時間がタイムアウトパラメータを超えた場合は、呼び出しが失敗します。呼び出しメトリクスの詳細については、呼び出しメトリクスの使用を参照してください。

データ変換が失敗した場合、処理できなかったレコードは [処理失敗] フォルダの S3 バケットに配信されます。Amazon S3 のレコードの形式には、エラーメッセージも含まれます。データ変換の失敗の詳細については、「データ変換の失敗処理」を参照してください。

注意: S3 バケットポリシーでは、aws:SourceIpaws:SourceVpce など、明示的な拒否が発生する場合があります。S3 バケットポリシーが明示的に拒否されているかどうかを確認するには、CloudWatch Logs で S3.AccessDenied エラーコードを探します。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?