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

Posted

技术标签:

【中文标题】无服务器错误,当自定义命名资源需要替换时,CloudFormation 无法更新堆栈【英文标题】:Serverless Error, CloudFormation cannot update a stack when a custom-named resource requires replacing 【发布时间】:2018-05-14 00:48:28 【问题描述】:

我有以下错误。

无服务器:操作失败!

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

【问题讨论】:

您的解决方案对我有好处...阶段是“开发”,在我的情况下丢失的数据不是问题。谢谢! 【参考方案1】:

AWS 推荐的解决方案是重命名: https://aws.amazon.com/premiumsupport/knowledge-center/cloudformation-custom-name/

【讨论】:

您能解释一下问题的原因吗?我无法理解您提供的 AWS 页面中提到的解释。【参考方案2】:

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

环境变量: 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();

【讨论】:

变量在你的情况下总是相同的吗?如果更改变量会发生什么? 我最终不得不添加一个变量,该变量每次都会更改 BUILD_NUMBER。更新了我的答案。然而,我实际上决定改用 mysql 而不是 Dynamo 来完成我的工作。 有趣的是你提到我确实也切换到了 MySQL 我还有其他一些关于如何使用无服务器实现自动化的帖子 不错。是的,我发现 Dynamo 太有限了。我正在构建一个 SaaS,我已经习惯了能够轻松地查询不同的字段并创建索引和类似的东西。 这不是一个解决方案,我的意思是但不是真的,这基本上会删除您现有的表并且您会丢失您的数据,如果我理解正确的话

以上是关于无服务器错误,当自定义命名资源需要替换时,CloudFormation 无法更新堆栈的主要内容,如果未能解决你的问题,请参考以下文章

当自定义 collectionViewCell 中包含标签时,不会调用 didSelectItemAtIndexPath

Flex:当自定义 itemrenderers 中的文本更改时,强制重绘 DataGrid

命名空间错误中不存在类型资源

当自定义模板已应用于节点的内容类型时,如何在 Drupal 6 中自定义特定节点?

命名空间错误中不存在类型资源

Android:Google Play 服务“无资源”错误