将 StackName 添加到 Cloudformation 资源

Prepend StackName to Cloudformation resources

我想拥有基于单个 CloudFormation 模板的多个堆栈,但我遇到了命名冲突。解决这个问题的最简单方法似乎是将 StackName 添加到每个重复的资源中,例如我的 lambda 函数或角色。

AWS 在 'Template Reference' section of the documentation 中讨论了 AWS::StackName,但没有明确说明如何执行此操作。

如何将 StackName 添加到 CloudFormation 资源?

MyLambdaFunction
  Type: "AWS:Serverless::Function"
  Properties:
    FunctionName: AWS::StackName + "-myLambdaFunction"

需要Ref伪参数,使用Fn::Join方法构造名称

MyLambdaFunction
  Type: "AWS:Serverless::Function"
  Properties:
    FunctionName: !Join [ "", [ {"Ref": "AWS::StackName"}, "-myLambdaFunction" ]]

我更喜欢使用 Fn::Sub,因为我相信它比其他选择更容易阅读:

"RoleName": { "Fn::Sub" : "${AWS::StackName}-InstanceRole" },

YAML 版本:

RoleName: !Sub ${AWS::StackName}-InstanceRole