我正在构建一个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)。因为我必须在LaunchConfiguration中而不是在AutoScalingGroup中指定安全组,所以我必须在模板中有LaunchConfiguration的多个副本,只有单行差异。
有没有办法减少冗长的元数据和UserData部分在我的模板中出现的次数?我尝试创建一个映射,但它们只允许使用字母数字字符。
编写代码来创建模板JSON,而不是手动编写-然后您可以使用所选语言中可用的任何抽象来创建不同的LaunchConfiguration资源。
允许您将映射和矢量表示为文字的语言比不这样做的语言更适合于此。
例如,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模板实际上只对非常小的模板很方便。
我最近发现了CDK。还没有使用它,但它似乎是一种比直接写出所有模板代码更好的方法。可以使用TypeScript、JavaScript、Java和C#定义资源,并对其进行编译以生成CloudFormation模板。在Java中创建堆栈的示例:
public class MyStack extends Stack {
public MyStack(final App scopy, final String id) {
this(scope, id, null);
}
public MyStack(final App scope, final String id, final StackProps props) {
super(scope, id, props);
new Bucket(this, "MyFirstBucket", BucketProps.builder()
.withVersioned(true)
.build());
}
}
关于CDK的更多信息:https://docs.aws.amazon.com/CDK/latest/userguide/what-is.html