重命名 CloudFormation 模板中的资源

Ada*_*dam 7 amazon-web-services aws-cloudformation

您可以重命名 CloudFormation 模板中的资源吗?

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

GetTheFunnyPhraseText:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: ../Lambda/
    Handler: GetFunnyPhrase.handler
    FunctionName: GetFunnyPhrase
    Role: !GetAtt [ ExecuteFunctionGetFunnyPhrase, Arn ]
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,我想将资源名称更改GetTheFunnyPhraseTextGetFunnyPhrase. 是否有更改名称的机制?

我尝试了几件事...

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

对于那些建议不要命名函数的人,理解;暂时在该反馈中放置一个引脚。

小智 11

既然CloudFormation 导入可用,在技术上就可以做到这一点,尽管它很乏味。

这是您需要执行的操作:

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

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


Has*_*ana 5

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

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

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