AWS CDK で DynamoDB の importSource によるデータインポートが失敗した際のエラーログを確認する

2024.02.20

こんにちは、CX 事業本部製造ビジネステクノロジー部の若槻です。

以前に AWS CDK(TypeScript)で DynamoDB テーブルへの importSource によるデータインポートを試してみました。

そのデータインポート機能を使用してサンプルデータを DynamoDB テーブルにインポートする際に、エラーが発生したので、エラーログを確認してみました。

確認してみた

CDK コードサンプル

CDK コードのサンプルです。デプロイにより次の処理が行われます。

  • サンプルデータアップロード用の S3 バケット作成
  • サンプルデータの S3 バケットへのアップロード
  • DynamoDB テーブルの作成とサンプルデータのインポート

lib/cdk-sample-stack.ts

import {
  aws_dynamodb,
  aws_s3,
  aws_s3_deployment,
  Stack,
  RemovalPolicy,
} from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // サンプルデータアップロード用の S3 バケット
    const bucket = new aws_s3.Bucket(this, 'Bucket', {
      removalPolicy: RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });

    // サンプルデータのアップロード
    new aws_s3_deployment.BucketDeployment(this, 'DeploySampleTableData', {
      sources: [aws_s3_deployment.Source.asset('./src/tableData')],
      destinationBucket: bucket,
    });

    // DynamoDB テーブル
    new aws_dynamodb.Table(this, 'SampleTable', {
      partitionKey: { name: 'id', type: aws_dynamodb.AttributeType.STRING },
      sortKey: { name: 'timestamp', type: aws_dynamodb.AttributeType.NUMBER },
      billingMode: aws_dynamodb.BillingMode.PAY_PER_REQUEST,
      removalPolicy: RemovalPolicy.DESTROY,
      importSource: {
        inputFormat: aws_dynamodb.InputFormat.csv({
          delimiter: ',',
          headerList: ['id', 'timestamp'],
        }),
        bucket,
      },
    });
  }
}

サンプルデータ

サンプルデータとなる CSV ファイルは次の通りです。

src/tableData/table1.csv

d003,1683537208
d003,1684677072
d003,1700919770
d004,1692319739
d005,1683241923
d001,1696872343
d001,1702273299
d004,1695004862
d001,1686191741
d005,1696989999

デプロイでエラーが発生した

上記 CDK コードを使用してデプロイを行ったところ、エラーが発生しました。

$ npx cdk deploy --require-approval never --method=direct

(中略)

2:00:03 AM | CREATE_FAILED        | AWS::DynamoDB::Table        | SampleTable08FBB2D0
Resource handler returned message: "Error occurred during operation 'ImportTable request did not complete for Table: CdkSampleStack-SampleTable08FBB2D0-JG5O9VXCXSP6, and Import ARN: arn:aws:dynamodb:ap-northeast-1:XXXXXXXXXXXX:table/CdkSampleStack-SampleTable08F
BB2D0-JG5O9VXCXSP6/import/01708361899774-da4e1e14. The ImportTable failure code is ItemValidationError and the ImportTable failure message is Some of the items failed validation checks and were not imported. Please check CloudWatch error logs for more details.'.
" (RequestToken: ab11d479-5ebb-53c2-a09d-5a2f643f5e4e, HandlerErrorCode: GeneralServiceException)


 ❌  CdkSampleStack failed: Error: The stack named CdkSampleStack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Resource handler returned message: "Error occurred during operation 'ImportTable request did not complete for Table: CdkSampleStack-SampleTable08FBB2D0-JG5O9VXCXSP6, and Import ARN: arn:aws:dynamodb:ap-northeast-1:XXXXXXXXXXXX:table/CdkSampleStack-SampleTable08FBB2D0-JG5O9VXCXSP6/import/01708361899774-da4e1e14. The ImportTable failure code is ItemValidationError and the ImportTable failure message is Some of the items failed validation checks and were not imported. Please check CloudWatch error logs for more details.'." (RequestToken: ab11d479-5ebb-53c2-a09d-5a2f643f5e4e, HandlerErrorCode: GeneralServiceException)
    at FullCloudFormationDeployment.monitorDeployment (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk/lib/index.js:431:10615)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Object.deployStack2 [as deployStack] (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk/lib/index.js:434:196750)
    at async /Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk/lib/index.js:434:178719

 ❌ Deployment failed: Error: The stack named CdkSampleStack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Resource handler returned message: "Error occurred during operation 'ImportTable request did not complete for Table: CdkSampleStack-SampleTable08FBB2D0-JG5O9VXCXSP6, and Import ARN: arn:aws:dynamodb:ap-northeast-1:XXXXXXXXXXXX:table/CdkSampleStack-SampleTable08FBB2D0-JG5O9VXCXSP6/import/01708361899774-da4e1e14. The ImportTable failure code is ItemValidationError and the ImportTable failure message is Some of the items failed validation checks and were not imported. Please check CloudWatch error logs for more details.'." (RequestToken: ab11d479-5ebb-53c2-a09d-5a2f643f5e4e, HandlerErrorCode: GeneralServiceException)
    at FullCloudFormationDeployment.monitorDeployment (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk/lib/index.js:431:10615)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Object.deployStack2 [as deployStack] (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk/lib/index.js:434:196750)
    at async /Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk/lib/index.js:434:178719

The stack named CdkSampleStack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Resource handler returned message: "Error occurred during operation 'ImportTable request did not complete for Table: CdkSampleStack-SampleTable08FBB2D0-JG5O9VXCXSP6, and Import ARN: arn:aws:dynamodb:ap-northeast-1:XXXXXXXXXXXX:table/CdkSampleStack-SampleTable08FBB2D0-JG5O9VXCXSP6/import/01708361899774-da4e1e14. The ImportTable failure code is ItemValidationError and the ImportTable failure message is Some of the items failed validation checks and were not imported. Please check CloudWatch error logs for more details.'." (RequestToken: ab11d479-5ebb-53c2-a09d-5a2f643f5e4e, HandlerErrorCode: GeneralServiceException)

The ImportTable failure code is ItemValidationError and the ImportTable failure message is Some of the items failed validation checks and were not imported. Please check CloudWatch error logs for more details.

(日本語)
ImportTable の失敗コードは ItemsValidationError で、ImportTable の失敗メッセージは「一部の項目が検証チェックに失敗したため、インポートされませんでした」です。 詳細については、CloudWatch エラー ログを確認してください。

とのことです。この「CloudWatch エラー ログ」はどこから確認すればよいのでしょうか?

Cfn スタックからはエラーログにアクセスできない

まず、AWS CDK でデプロイした Cfn スタックを確認したところ、テーブルデータインポート用のリソースがありませんでした。ここからエラーログにアクセスすることはできないようです。

DynamoDB の「Import from S3」からアクセスできた

Amazon DynamoDB のコンソールで「Import from S3」にアクセスすると、インポート失敗のジョブを確認することができました。

ジョブを開くと CloudWatch ロググループへのリンクが表示されます。アクセスしてみます。

すると info および error ログのストリームがありました。error ログを確認してみます。

エラーログの内容を確認することができました。

{
    "itemS3Pointer": {
        "bucket": "cdksamplestack-bucket83908e77-wxzkxtrptjpd",
        "key": "table1.csv"
    },
    "importArn": "arn:aws:dynamodb:ap-northeast-1:XXXXXXXXXXXX:table/CdkSampleStack-SampleTable08FBB2D0-JG5O9VXCXSP6/import/01708361899774-da4e1e14",
    "errorMessages": [
        "The S3 object could not be downloaded because it was overwritten"
    ]
}

どうやら S3 バケット上の CSV データがインポート中に上書きされたため、エラーが発生したようです。

この時は根本原因は分からなかったのですが、DynamoDB テーブルを一度削除および再作成のデプロイをすることにより、エラー無くインポートが行えました。

おわりに

AWS CDK で DynamoDB の importSource によるデータインポートが失敗した際のエラーログを確認してみました。

どなたかの参考になれば幸いです。

以上