无服务器错误,当自定义命名资源需要替换时,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