如果您只需要一个随机 ID(没有密码,没有花哨的要求),我建议的方法是使用一部分AWS::StackId https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html#cfn-pseudo-param-stackid,其格式如下:
arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123
因此,为了获得最后一部分,您需要两次拆分,例如:
AutoScalingGroupName:
Fn::Join:
- '-'
- - my-auto-scaling-group
- Fn::Select:
- 4
- Fn::Split:
- '-'
- Fn::Select:
- 2
- Fn::Split:
- /
- Ref: AWS::StackId
等效的较短语法:
AutoScalingGroupName: !Join ['-', ['my-auto-scaling-group', !Select [4, !Split ['-', !Select [2, !Split ['/', !Ref AWS::StackId]]]]]]
Meaning:
- 从...开始
AWS::StackId
, e.g.: arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123
- 分裂于
/
并选择第二部分(0索引):51af3dc0-da77-11e4-872e-1234567db123
- 分裂于
-
并选择第四部分(0索引):1234567db123
- 加入您的固定部分名称:
my-auto-scaling-group-1234567db123
.
优点:与创建 CustomResource 相比,我更喜欢这种方式,因为对于大型 AWS 环境和许多堆栈,您最终可能会使用多个 lambda,从而使治理变得更加困难。
缺点:比较冗长(Fn::Join
, Fn::Select
, and Fn::Split
).
编辑 2022 年 2 月 17 日:
正如 @teuber789 的评论所观察到的,如果您需要相同类型的多个资源,例如:my-auto-scaling-group-<random_1>
and my-auto-scaling-group-<random_2>
,这种方法不会起作用AWS::StackId
整个堆栈都是一样的。