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

How to deploy AWS CDK app multiple times?

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

我可以看到最近的1.28.0 release of the CDK allows for passing CloudFormation parameters into the deploy command (via #1237)。这意味着我可以参数化堆栈的内容,但我不知道如何更改应用程序本身的 name/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. 你需要让你的堆栈名称成为从命令行传入的参数
  2. 从您的 cdk.json 中删除 app 参数并在传递“prefix”参数的命令行中指定 app 参数

堆栈中具有服务级别名称或 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 class:

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 看起来像这样,删除了应用程序 属性:

{
  "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 控制台中看到一个新堆栈。