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 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则