如何多次部署AWS CDK应用程序?

时间:2020-03-17 16:35:27

标签: amazon-web-services amazon-cloudformation aws-cdk

是否可以将CDK应用程序多次部署到同一帐户?我想一次运行synth,然后对该合成模板多次运行cdk deploy

我看到CDK的最新1.28.0 release允许通过#1237将CloudFormation参数传递到deploy command中。这意味着我可以参数化堆栈的内容,但是我不知道如何更改应用程序本身的名称/ id。

例如,这是一个简单的应用程序:

public class ExampleApp {
    public static void main(final String[] args) {
        App app = new App();

        new ExampleStack(app, "ExampleStack");

        app.synth();
    }
}

这是一个简单的虚无堆栈:

public class ExampleStack extends Stack {

    public ExampleStack(final Construct scope, final String id) {
        this(scope, id, null);
    }

    public ExampleStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);

        CfnParameter someVar = CfnParameter.Builder.create(this, "SomeVar")
                .description("Some variable that can be passed in at deploy-time.")
                .type("String")
                .build();

        // rest of stack here
    }
}

我可以运行cdk synth并将模板输出到某个地方,然后运行

cdk --app path/to/cdk.out deploy ExampleStack --parameters "ExampleStack:SomeVar=SomeValue"

,该参数将在部署时传递到堆栈中。

但是,我看不到如何使用不同的名称(或ID)多次部署应用程序。这可能吗?

之所以要执行此操作而不是多次运行synth的背景是因为出于合规性原因,我需要一个工件-cdk.out目录-然后进行多次部署。为此,我不能基于synth的多次运行来使用答案。

1 个答案:

答案 0 :(得分:2)

尝试一下:

  1. 您需要使堆栈名称成为从命令行传入的参数
  2. 从cdk.json中删除应用程序参数,并在命令行中输入“ prefix”参数来指定应用程序参数

您堆栈中具有服务级别名称或ID的任何资源也都需要修改,例如,两个堆栈无法创建具有相同名称的密码

在我的解决方案中,我从StackProps对象派生来向堆栈添加“ PrefixName”属性,并且前缀可以在堆栈中使用以影响命名或资源。

我的program.cs如下所示:

using Amazon.CDK;

namespace DevconnectListener
{
    sealed class Program
    {
        public static void Main(string[] args)
        {
            var app = new App();
            var props = new DevConnectStackProps()
            {
                PrefixName = args[0],
                StackName = args[0]  + "-DevconnectListenerStack"
            };

            var s = new DevconnectListenerStack(app, "DevconnectListenerStack", props);
            

            app.Synth();
        }
    }
}

这是我自定义的DevConnectStackProps类:

using System.Collections.Generic;
using Amazon.CDK;
using Amazon.CDK.AWS.DynamoDB;
using Amazon.CDK.AWS.Lambda;

namespace DevconnectListener
{

    public class DevConnectStackProps : StackProps, IStackProps
    {
        public DevConnectStackProps()
        {

        }
        public string PrefixName { get; set; }
    }
}

我的cdk.json如下所示,删除了app属性:

{
  "context": {
    "@aws-cdk/core:enableStackNameDuplicates": "true",
    "aws-cdk:enableDiffNoFail": "true",
    "@aws-cdk/core:stackRelativeExports": "true"
  }
}

然后有一个名为deploy-dev.cmd的CMD文件(其中包含我要使用的AWS配置文件和dev前缀参数:

cdk deploy --app "dotnet run -p src/DevconnectListener/DevconnectListener.csproj dev" --profile dev_aws_profile

如果再次使用其他前缀运行它,您将在CloudFormation控制台中看到一个新堆栈。