aws*_*734 15 amazon-web-services aws-cloudformation
我正在尝试向 AWS 中现有的 DynamoDB 表添加“get”函数。我为表添加了一个 yml 文件,当我尝试部署堆栈时,它说我的表的资源已经存在。
过去,我在发生这种情况时删除了该表,然后重新部署了堆栈,但在这种情况下,我不想删除该表,也不知道如何解决该问题。
我的第一个问题是我在 YML 文件中错误地定义了表的架构。然后当我重新定义它时,我遇到了堆栈中已经存在的资源的问题。
我的错误:
无服务器错误 ------------------------------------- 发生错误:ConsumersTable - dev-con堆栈中已存在 arn:aws:cloudformation:us-ea
Mal*_*ous 57
我自己也遇到过这个问题,并联系了 AWS 支持。看来CloudFormation将逻辑ID与资源相关联,例如(以IAM为例,但许多资源是相同的):
exampleLogicalId:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
ManagedPolicyName: exampleName
...
Run Code Online (Sandbox Code Playgroud)
在这里,资源是使用自定义名称创建的(exampleName在本例中)。只要逻辑 ID ( exampleLogicalId) 保持不变,CloudFormation 就会识别出该资源已被创建,并将根据需要进行更新。
但是,如果您更改逻辑 ID(就像我在使用 CDK 时发生的那样,因为它会自动生成这些逻辑 ID),那么 CloudFormation 认为它需要创建一个新资源。但由于该名称已存在,并且对于该资源类型,名称必须是唯一的,因此会发生冲突并且创建失败。这似乎是因为 CloudFormation 在删除任何已删除的资源之前创建所有新资源。
解决方案是 1) 将逻辑 ID 恢复为原来的状态,以便 CloudFormation 将其识别为“更新”而不是“创建”,或者 2) 将唯一部分(本exampleName例中的)更改为唯一的部分。
更改名称(或相关资源的唯一字段)可能是一个方便的选择,因为它将创建新资源并将其与新逻辑 ID 关联,然后在该逻辑 ID 不再存在时删除旧资源在您的 CloudFormation 模板中。然后,您可以将资源重命名回您最初想要的内容(保持相同的逻辑 ID)并进行第二次部署,CloudFormation 会将其识别为更新操作,并将资源重命名回您第一次想要的内容。
请注意,这样做不会执行更新,而是执行删除然后创建。因此,如果您的资源有数据(例如,包含数据的 DynamoDB 表、已附加到角色的 IAM 策略、已输入值的 Parameter Store 条目),您可能需要为新资源重新创建此数据。
您可以将现有资源导入到 CloudFormation (CFN):
AWS::DynamoDB::Table也是支持导入操作的资源之一。
因此,如果您不想删除现有表,可以将其导入 CFN。然后,您可以使用 CFN 管理它,就像在 CFN 中从头开始创建的任何其他表一样。
希望这有帮助。
| 归档时间: |
|
| 查看次数: |
5674 次 |
| 最近记录: |