我正在尝试向AWS中已经存在的DynamoDB表添加“获取”功能。我为该表添加了一个yml文件,当我尝试部署堆栈时,它说我的表资源已经存在。
过去,在发生这种情况时,我已经删除了该表,然后重新部署了堆栈,但是在这种情况下,我不想删除该表并且不知道如何解决该问题。
我的第一个问题是我在YML文件中错误地定义了表的架构。然后,当我重新定义它时,我遇到了堆栈中已经存在的资源的问题。
我的错误:
无服务器错误--------------------------------------- 发生错误:ConsumersTable-dev-con已在堆栈arn:aws:cloudformation:us-ea
中存在
答案 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 条目),您可能需要为新资源重新创建这些数据。