DynamoDBをCDKで構築したときにprovisionedからondemandに変更できない

0

質問

DynamoDBをCDKで構築したときにprovisionedからondemandに変更できないです。以下のようなエラーが出てしまうのですが、どのように対応すれば良いのでしょうか。同じ境遇の方や解決された方がいらっしゃいましたらご教示いただきたいです。 よろしくお願いします。

Invalid request provided: When switching billing mode to OnDemand, the previous template must specify a value for all autoscaled resources, so that Cloudformation can rollback if needed.

機械翻訳

無効なリクエストが提供されました: 請求モードをオンデマンドに切り替える場合、Cloudformation が必要に応じてロールバックできるように、前のテンプレートですべての自動スケーリングされたリソースの値を指定する必要があります。

エラー内容

CDK を実行したときのエラー内容です。

00:00:00 | UPDATE_FAILED        | AWS::DynamoDB::GlobalTable                      | Table4B424B7A
Resource handler returned message: "Invalid request provided: When switching billing mode to OnDemand, the previous template must specify a value for all autoscaled resources, so that Cloudformation can rollback if needed." (RequestToken: 744d72a5-010d-de42-9a96-38a5f47dcc25, HandlerErrorCode: InvalidReque
st)


 ❌  CdkStack failed: Error: The stack named CdkStack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Resource handler returned message: "Invalid request provided: When switching billing mode to OnDemand, the previous template must specify a value for all autoscaled resources, so that Cloudformation can rollback if needed." (RequestToken: 744d72a5-010d-de42-9a96-38a5f47dcc25, HandlerErrorCode: InvalidRequest)
    at FullCloudFormationDeployment.monitorDeployment (/Users/aws-cdk/node_modules/aws-cdk/lib/index.js:421:10708)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Object.deployStack2 [as deployStack] (/Users/aws-cdk/node_modules/aws-cdk/lib/index.js:424:180618)
    at async /Users/aws-cdk/node_modules/aws-cdk/lib/index.js:424:163866

CDK の実装内容

変更前(provisioned で DynamoDB を構築)

import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
// : 省略
    const table = new dynamodb.TableV2(this, 'Table', {
      partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
      globalSecondaryIndexes: [
        {
          indexName: 'index',
          partitionKey: { name: 'code', type: dynamodb.AttributeType.STRING },
        },
      ],
      billing: dynamodb.Billing.provisioned({
        readCapacity: dynamodb.Capacity.autoscaled({ minCapacity: 5, maxCapacity: 50, targetUtilizationPercent: 25 }),
        writeCapacity: dynamodb.Capacity.autoscaled({ minCapacity: 1, maxCapacity: 5 }),
      }),
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });
// : 省略

変更後(onDemand で DynamoDB を構築)

import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
// : 省略
    const table = new dynamodb.TableV2(this, 'Table', {
      partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
      globalSecondaryIndexes: [
        {
          indexName: 'index',
          partitionKey: { name: 'code', type: dynamodb.AttributeType.STRING },
        },
      ],
      billing: dynamodb.Billing.onDemand(), // ★★★ 変更箇所
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });
// : 省略
1 個回答
1
已接受的答案

TableV2 is an abstraction for GlobalTable CloudFormation construct. With GlobalTables you must define a value for provisioned capacity for all resources (tables and GSI's) in-case the stack update needs to rollback. In your example, you are missing the provisioned capacity for your GSI.

Defined here as readCapacity and writeCapacity.


「TableV2」は GlobalTable CloudFormation 構造の抽象化です。 GlobalTables では、スタックの更新をロールバックする必要がある場合に備えて、すべてのリソース (テーブルと GSI) のプロビジョニングされた容量の値を定義する必要があります。この例では、GSI にプロビジョニングされた容量が不足しています。

ここ を「readCapacity」および「writeCapacity」として定義します。

profile pictureAWS
專家
已回答 4 個月前

您尚未登入。 登入 去張貼答案。

一個好的回答可以清楚地回答問題並提供建設性的意見回饋,同時有助於提問者的專業成長。

回答問題指南