2

我正在构建一个 CloudFormation 模板,其中包括一个使用该 LaunchConfiguration的一个AWS::AutoScaling::LaunchConfiguration和一个。AWS::AutoScaling::AutoScalingGroup对于我的堆栈,我将需要多个 AutoScalingGroup,但我希望它们位于单独的安全组中。

我还将使用 CodeDeploy,因此我的 LaunchConfiguration 包含用于安装和运行 CodeDeploy 代理的 Metadata 和 UserData 属性(如http://s3.amazonaws.com/aws-codedeploy-us-east的第 262 行所示-1/templates/latest/CodeDeploy_SampleCF_Template.json)。因为我必须在 LaunchConfiguration 而不是 AutoScalingGroup 中指定安全组,所以我的模板中必须有多个 LaunchConfiguration 副本,只有一行差异。

有没有办法减少冗长的元数据和用户数据部分出现在我的模板中的次数?我尝试创建映射,但它们只允许字母数字字符。

4

2 回答 2

2

编写代码来创建您的模板 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 确实只对非常小的模板很方便。

于 2015-02-26T14:48:56.073 回答
1

我最近发现了CDK。还没有使用它,但它似乎比直接写出所有模板代码更好。可以使用 TypeScript、JavaScript、Java 和 C# 定义资源并编译以生成 CloudFormation 模板。在 Java 中创建 Stack 的示例:

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

于 2019-03-04T22:11:05.503 回答