【问题标题】:Renaming Resource in CloudFormation Template在 CloudFormation 模板中重命名资源
【发布时间】:2019-05-20 14:09:37
【问题描述】:

能否重命名 CloudFormation 模板中的资源?

假设我创建了一个堆栈模板,它创建了一个 lambda 函数。

GetTheFunnyPhraseText:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: ../Lambda/
    Handler: GetFunnyPhrase.handler
    FunctionName: GetFunnyPhrase
    Role: !GetAtt [ ExecuteFunctionGetFunnyPhrase, Arn ]

无论出于何种原因,我想将资源名称GetTheFunnyPhraseText 更改为GetFunnyPhrase。有改名字的机制吗?

我尝试了几件事...

  • 更改模板中的资源名称。看起来这就像删除GetTheFunnyPhraseText 并创建GetFunnyPhrase。这里的问题是资源创建发生在资源删除之前,导致操作失败,因为 Lambda 函数存在。
  • 创建两个模板草稿。 Draft-1:更改现有资源的函数名称。 Draft-2:删除旧资源(从模板中省略它们的定义)并添加新资源。按顺序执行草稿模板:第一个然后第二个。这行得通。太恶心了。

对于那些建议不要命名函数的人,理解;暂时在该反馈中添加一个大头针。

【问题讨论】:

  • 除了第二种方法,我还没有看到任何其他方法。恶心,但有效。这是不建议明确命名资源的原因之一。
  • 我听到了。不幸的是,我在命名方面受到限制。在我加入团队之前,解决方案就是这样。

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

现在CloudFormation import is available 在技术上可以做到这一点,尽管它很乏味。

这是您需要做的:

  1. 更新GetTheFunnyPhraseText的定义,添加DeletionPolicy: "Retain",上传到CloudFormation
  2. 从您的模板中完全删除GetTheFunnyPhraseText。上传到 CloudFormation。这实际上不会删除底层 Lambda,因为之前添加了 DeletionPolicy
  3. 将您的模板恢复到步骤 #1 中的先前状态(添加 GetTheFunnyPhraseText 回来)并将逻辑名称更改为 GetFunnyPhrase
  4. 启动“堆栈操作”>“将资源导入堆栈”工作流程。
  5. 上传您恢复的模板(使用更改后的逻辑名称,仍包括DeletionPolicy
  6. 导入过程会注意到新的GetFunnyPhrase 逻辑名称,并询问您应该将什么实际FunctionName 映射到该名称。提供现有的 GetFunnyPhrase Lambda 名称并完成导入。
  7. 最后,您可以重新上传您的模板并删除DeletionPolicy

这肯定是一个乏味的过程,但如果您真的不想删除现有资源,技术上是可行的。

【讨论】:

    【解决方案2】:

    不!在 Cloud Formation 中无法重命名资源的逻辑名称。

    正如您所测试的那样,CloudFormation 将其视为删除旧资源并创建新资源。这是因为逻辑资源 ID 在创建后通过 CloudFormation 绑定到资源的物理 ID。但对于 CloudFormation 模板语言,它仅在解析模板时识别逻辑 ID,因此对其进行任何更改都意味着与其关联的资源将被更改。

    在某些资源类型中,尽管您可以使用特定于资源的某些名称属性自己设置物理 ID,例如资源AWS::RDS::DBInstance 可能具有属性DBInstanceIdentifier,它将是数据库实例的物理名称本身。

    【讨论】:

    • 知道了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2017-05-05
    • 1970-01-01
    • 2020-10-17
    • 2016-09-30
    相关资源
    最近更新 更多