传递每个部署环境的 CDK 上下文值
Pass CDK context values per deployment environment
我正在使用 context 将值传递给 CDK
。目前是否有一种方法可以为每个部署环境(dev
、test
)定义项目上下文文件,以便当我必须传递的值数量增加时,与传递命令行中的值:
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.json
和 cdk.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 对象,其中分配或派生了我的所有部署属性,并将该对象传递到每个堆栈,从那里检索我需要的东西。
我正在使用 context 将值传递给 CDK
。目前是否有一种方法可以为每个部署环境(dev
、test
)定义项目上下文文件,以便当我必须传递的值数量增加时,与传递命令行中的值:
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.json
和 cdk.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 对象,其中分配或派生了我的所有部署属性,并将该对象传递到每个堆栈,从那里检索我需要的东西。