如何在获取“资源已在堆栈中”错误时重新部署堆栈,而不删除资源

时间:2019-10-07 11:10:29

标签: amazon-web-services amazon-cloudformation

我正在尝试向AWS中已经存在的DynamoDB表添加“获取”功能。我为该表添加了一个yml文件,当我尝试部署堆栈时,它说我的表资源已经存在。

过去,在发生这种情况时,我已经删除了该表,然后重新部署了堆栈,但是在这种情况下,我不想删除该表并且不知道如何解决该问题。

我的第一个问题是我在YML文件中错误地定义了表的架构。然后,当我重新定义它时,我遇到了堆栈中已经存在的资源的问题。

我的错误:

  

无服务器错误---------------------------------------       发生错误:ConsumersTable-dev-con已在堆栈arn:aws:cloudformation:us-ea

中存在

2 个答案:

答案 0 :(得分:2)

您可以导入现有资源到CloudFormation(CFN):

AWS::DynamoDB::Table也是one of the resources,支持导入操作。

因此,如果您不想删除现有表,则可以将其导入CFN。然后,您可以使用CFN 对其进行管理,就像在CFN中从头创建的任何其他表一样。

希望这会有所帮助。

答案 1 :(得分:0)

我自己遇到了这个问题并联系了 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 条目),您可能需要为新资源重新创建这些数据。