我正在构建一个 CloudFormation 模板,其中包含 AWS::AutoScaling::LaunchConfiguration
和使用该 LaunchConfiguration 的 AWS::AutoScaling::AutoScalingGroup
。对于我的堆栈,我需要多个 AutoScalingGroup,但我希望它们位于单独的安全组中。
我还将使用 CodeDeploy,因此我的 LaunchConfiguration 包含用于安装和运行 CodeDeploy 代理的 Metadata 和 UserData 属性(如 http://s3.amazonaws.com/aws-codedeploy-us-east-1/templates/latest/CodeDeploy_SampleCF_Template.json 的第 262 行所示)。因为我必须在 LaunchConfiguration 中而不是在 AutoScalingGroup 中指定安全组,所以我必须在模板中拥有 LaunchConfiguration 的多个副本,并且只有单行差异。
有没有办法减少冗长的元数据和用户数据部分出现在我的模板中的次数?我尝试创建映射,但它们只允许字母数字字符。
最佳答案
编写代码来创建模板 JSON,而不是手动编写 - 然后您可以使用您选择的语言中可用的任何抽象来创建不同的 LaunchConfiguration 资源。
允许您将 map 和向量表示为文字的语言比那些不这样做的语言更适合于此。
例如,Clojure 文字
{"Type" "AWS::AutoScaling::LaunchConfiguration"
"Properties" {"KeyName" {"Ref" "KeyName"}
"ImageId" {"Ref" "AMI"}}}
可以自动翻译成JSON字符串
{"Type":"AWS::AutoScaling::LaunchConfiguration",
"Properties":{"ImageId":{"Ref":"AMI"},
"KeyName":{"Ref":"KeyName"}}}
(尽管实际上您只会为完整模板而不是单个资源创建 JSON。)
然后你可以做类似的事情
(defn launch-configuration
[ami]
{"Type" "AWS::AutoScaling::LaunchConfiguration"
"Properties" {"KeyName" {"Ref" "KeyName"}
"ImageId" ami}})
和
(map launch-configuration ["ami1" "ami2" "ami3"])
创建多个类似的资源。
手工制作模板 JSON 实际上只对非常小的模板很方便。
关于amazon-web-services - 有没有办法在 AWS CloudFormation 模板中进行继承或代码重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28724929/