amazon-web-services - 获取“资源已存在于堆栈中”错误时如何重新部署堆栈,而不删除资源
问题描述
我正在尝试向 AWS 中已经存在的 DynamoDB 表添加一个“获取”函数。我为表添加了一个 yml 文件,当我尝试部署堆栈时,它说我的表的资源已经存在。
过去我在发生这种情况时删除了表,然后重新部署了堆栈,但在这种情况下,我不想删除表并且不知道如何解决问题。
我的第一个问题是我在 YML 文件中错误地定义了表的模式。然后,当我重新定义它时,我遇到了堆栈中已经存在的资源的问题。
我的错误:
无服务器错误 ---------------------------------------- 发生错误:ConsumersTable - dev-con已存在于堆栈 arn:aws:cloudformation:us-ea
解决方案
我自己遇到了这个问题并联系了 AWS 支持。似乎 CloudFormation 将逻辑 ID 与资源相关联,例如(以 IAM 为例,但许多资源是相同的):
exampleLogicalId:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
ManagedPolicyName: exampleName
...
exampleName
在这里,使用自定义名称(在本例中)创建资源。只要逻辑 ID ( exampleLogicalId
) 保持不变,CloudFormation 就会识别出资源已经创建,并会在必要时对其进行更新。
但是,如果您更改逻辑 ID(就像我在使用 CDK 时发生的那样,因为它会自动生成这些逻辑 ID),那么 CloudFormation 认为它需要创建一个新资源。但是因为名称已经存在,并且对于这种资源类型,名称必须是唯一的,所以会发生冲突并且创建失败。这似乎是因为 CloudFormation 在删除任何已删除的资源之前会创建所有新资源。
解决方案是 1) 将逻辑 ID 恢复到原来的状态,以便 CloudFormation 将其识别为“更新”而不是“创建”,或者 2) 将唯一部分(exampleName
在本示例中)更改为唯一的.
更改名称(或相关资源的任何唯一字段)可能是一个方便的选择,因为它将创建新资源并将其与新逻辑 ID 关联,然后如果该逻辑 ID 不再存在则删除旧资源在您的 CloudFormation 模板中。然后,您可以将资源重命名为您最初想要的名称(保持相同的逻辑 ID)并再次部署,CloudFormation 会将其识别为更新操作,并将资源重命名为您第一次想要的名称。
请注意,这样做不会执行更新,而是执行删除然后创建。因此,如果您的资源有数据(例如,包含数据的 DynamoDB 表、已附加到角色的 IAM 策略、已输入值的 Parameter Store 条目),您可能需要为新资源重新创建此数据。
推荐阅读
- sql - SQL Server 使用表连接返回前 X 行
- botframework - SendAsync 和 CreateReply 上的 BotFramework 错误
- javascript - 为什么我不能从 Reactjs 中的另一个文件导入常量?
- javascript - 如何为 React 和非 React 消费者提供解决方案?
- ios - 这些闭包中的保留周期有什么区别?标准闭包与对象初始化闭包
- python - Keras:用于重复多输入的单输入层
- c# - 尝试使用 ASP.NET Catch 不明显
- html - CSS:缩放字体大小以适应父块元素高度
- record - 存在的目标过早地完成
- python - 变换保持 NULLS