web-dev-qa-db-ja.com

サーバーレスエラー、カスタム名のリソースを置き換える必要がある場合、CloudFormationはスタックを更新できません

次のエラーが発生します。

サーバーレス:操作に失敗しました!

Serverless Error ---------------------------------------
An error occurred: phoneNumberTable - CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename mysite-api-phonenumber-dev and update the stack again…

データベースを削除して再作成できるかどうかを確認しようとしましたが、それでも同じエラーが発生し、データベースが再作成されませんか? ここで何をしますか?

最近、serverless.ymlファイルでリソースを次のように変更しました。

phoneNumberTable: #This table is used to track phone numbers used in the system
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:custom.phoneNumberTable}
        AttributeDefinitions: #UserID in this case will be created once and constantly updated as it changes with status regarding the user.
          - AttributeName: phoneNumber
            AttributeType: S
        KeySchema:
          - AttributeName: phoneNumber
            KeyType: HASH
        ProvisionedThroughput:
            ReadCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.pstage}}
            WriteCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.pstage}}

コピーして貼り付けているときに誤ってuserIdを使用して作成したため、ハッシュキーのphoneNumberに変更しましたが、変更は反映されません。

編集::

私は解決策を見つけましたが、それはひどいです。 sls remove --stage devを実行すると、ステージのすべてが削除されますが、文字通りすべてが削除されます...次に、sls deploy --stage devを実行して、デプロイを最初からやり直す必要があります。その間に、データベースからすべてがクリアされます。データ...どういうわけかより良い方法が必要です。

10
Joseph Astrahan

AWSが推奨するソリューションは、名前を変更することです: https://aws.Amazon.com/premiumsupport/knowledge-center/cloudformation-custom-name/

7
Jon Smirl

それを機能させるには、いくつかの変数を挿入する必要があることがわかりました。

環境変数:_USERS_TABLE: "users-${opt:stage, self:provider.stage}-${self:provider.environment.BUILD_NUMBER}"_

テーブル名:_TableName: ${self:provider.environment.USERS_TABLE}_

私のコードでは:const existingUser = await dynamoDb.get({ TableName: process.env.USERS_TABLE, Key: { email, }, }).promise();

1
Alex K