传递每个部署环境的 CDK 上下文值

Pass CDK context values per deployment environment

我正在使用 context 将值传递给 CDK。目前是否有一种方法可以为每个部署环境(devtest)定义项目上下文文件,以便当我必须传递的值数量增加时,与传递命令行中的值:

cdk synth --context bucketName1=my-dev-bucket1 --context bucketName2=my-dev-bucket2 MyStack

可以使用一个 cdk.json 上下文文件,并且仅将环境作为命令行中的上下文值传递,并且根据它的值 select 正确的值:

{
  ...
  "context": {
    "devBucketName1": "my-dev-bucket1",
    "devBucketName2": "my-dev-bucket2",
    "testBucketName1": "my-test-bucket1",
    "testBucketName2": "my-test-bucket2",
  }
}

但最好是,我想将其拆分成单独的文件,f.e。 cdk.dev.jsoncdk.test.json 会包含它们对应的值,并根据环境使用正确的值。

根据 documentation,CDK 将在几个地方之一查找上下文。但是,没有提及定义 multiple/additional 文件。

我能想出的最佳解决方案是利用 JSON 将上下文从每个环境中分离出来:

"context": {
  "dev": {
    "bucketName": "my-dev-bucket"
  }
  "prod": {
    "bucketName": "my-prod-bucket"
  }
}

这允许您根据 CDK 部署到的环境以编程方式访问不同的值。

let myEnv = dev         // This could be passed in as a property of the class instead and accessed via props.myEnv

const myBucket = new s3.Bucket(this, "MyBucket", {
  bucketName: app.node.tryGetContext(myEnv).bucketName
})

您也可以在代码中以编程方式执行此操作:

例如,我有一个上下文变量 deploy_tag cdk deploy Stack\* -c deploy_tag=PROD

然后在我的代码中,我检索了 deploy_tag 变量并在那里做出决定,例如:(使用 python,但想法是一样的)

bucket_name = BUCKET_NAME_PROD if deploy_tag == 'PROD' else BUCKET_NAME_DEV

这可以给你更多的控制权,如果你在你的代码中设置一个常量文件,你可以使它保持最新,而在你的 cdk.json 中可能会变得非常混乱与更大的堆栈和多种环境。如果你走这条路,那么你可以拥有你的 Prod 和 Dev 常量文件,你的上下文变量可以通知你的 cdk 为给定的部署加载哪个文件。

我还倾向于创建一个新的 class 对象,其中分配或派生了我的所有部署属性,并将该对象传递到每个堆栈,从那里检索我需要的东西。