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