Ошибка без сервера, 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, чтобы снова начать развертывание, а пока моя база данных будет очищена от всех данные... должен быть как-то лучше.

5 ответов

Рекомендуемое решение AWS - переименовать: https://aws.amazon.com/premiumsupport/knowledge-center/cloudformation-custom-name/

Переименуйте свой ресурс во что-то другое, разверните его, переименуйте обратно (если нужно) и снова разверните.

Я обнаружил, что мне нужно вставить некоторые переменные, чтобы это работало.

Переменная среды: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();

Эта проблема обычно возникает при изменении ключей разделов таблицы DynamoDB. DynamoDB не может внести изменения за вас. Вы должны удалить базу данных, сделав ее резервную копию и воссоздав ее заново. Как только новая БД будет создана, вы можете выполнить миграцию.

Согласно https://aws.amazon.com/premiumsupport/knowledge-center/cloudformation-custom-name/

Эта ошибка обычно возникает, когда обновление стека пытается заменить ресурсы со свойствами с пользовательскими именами. AWS CloudFormation не заменяет ресурс с пользовательским именем, если только это пользовательское имя не изменено на другое. Чтобы предотвратить сбой стека и избежать сообщения об ошибке, измените все ресурсы с пользовательскими именами, чтобы использовать другие имена, прежде чем обновлять стек.

Чтобы решить эту проблему, вам нужно изменитьTableNameна какую-то другую строку. Что это будет делать: Serverless удалит вашу таблицу (поскольку она больше не является частью стека) и создаст новую таблицу с новым именем и ключами.