【问题标题】:How to deploy AWS CDK app multiple times?如何多次部署 AWS CDK 应用程序?
【发布时间】:2020-06-28 18:43:02
【问题描述】:

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

我可以看到 CDK 最近的1.28.0 release 允许将 CloudFormation 参数传递到deploy command(通过#1237)。这意味着我可以参数化堆栈的内容,但我不知道如何更改应用程序本身的名称/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 的答案。

【问题讨论】:

  • 您是否尝试过添加循环? for (String name : myListOfNames) new ExampleStack(app, name);
  • 或者只是用不同的 id 构造两次? (没有必要使用循环)
  • 不,不幸的是,这仍然会在synth 时间定义堆栈,而不是deploy 时间。在运行synth 时,我不知道我需要多少堆栈实例。
  • 抱歉。我误解了多次运行 deploy。

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


【解决方案1】:

试试这个:

  1. 您需要将堆栈名称作为从命令行传入的参数
  2. 从 cdk.json 中移除 app 参数,并在命令行中指定 app 参数,传入“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 控制台中看到一个新堆栈。

【讨论】:

    猜你喜欢
    • 2020-05-08
    • 2021-04-02
    • 1970-01-01
    • 2021-10-13
    • 2020-06-18
    • 2020-08-15
    • 1970-01-01
    • 2022-07-21
    • 2017-05-15
    相关资源
    最近更新 更多