无服务器错误,当自定义命名的资源需要替换时,CloudFormation 无法更新堆栈

问题描述 投票:0回答:6

我有以下错误。

无服务器:操作失败!

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 重新开始部署,同时我的数据库已清除所有内容数据...必须有更好的方法。

amazon-web-services amazon-dynamodb aws-cloudformation serverless-framework serverless
6个回答

3
投票

我发现我需要插入一些变量才能使其工作。

环境变量:

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();


3
投票

将您的资源重命名为其他名称,部署它,重命名回来(如果需要),然后再次部署。


3
投票

当您修改 DynamoDB 表的分区键时,通常会出现此问题。 DynamoDB 无法为您进行更改。您必须删除数据库,确保备份并重新创建它。创建新数据库后,您就可以执行迁移。


1
投票

根据https://aws.amazon.com/premiumsupport/knowledge-center/cloudformation-custom-name/

当堆栈更新尝试用自定义名称替换具有属性的资源时,通常会发生此错误。 AWS CloudFormation 不会替换具有自定义名称的资源,除非将该自定义名称更改为其他名称。为了防止堆栈失败并避免出现错误消息,请在更新堆栈之前将具有自定义名称的任何资源更改为使用不同的名称。

要解决此问题,您需要将

TableName
更改为其他字符串。会做什么:无服务器将删除您的表(因为它不再是堆栈的一部分),并将创建一个具有新名称和键的新表。


0
投票

就我而言,我只需要在我的

serverless.yml
(我的dynamodb重命名表)中评论有问题的资源。

  1. 评论您有问题的资源并部署
  2. 取消注释资源
  3. 进行所需的更改,然后再次部署
© www.soinside.com 2019 - 2024. All rights reserved.