我正在使用js/ts开发AWS CDK(版本2,因为我们都讨厌版本1中的版本控制),并且由于一些明显的原因,我正在尝试用CDK取代我们当前的Cloudformation堆栈/实现。
当前的Cfn repo的结构是这样的:
.
├── cloudformation
│ ├── params
│ │ └── submit
│ │ ├── e2e.json
│ │ ├── preprod.json
│ │ └── prod.json
│ ├── stack
│ │ └── submit.yml
│ └── tags
│ ├── e2e.json
│ ├── preprod.json
│ └── prod.json
├── deploy.sh
├── ops
│ ├── add-state.sh
│ ├── create-or-update-stack.sh
│ └── upload-zendesk-templates.sh
├── state-machine
│ ├── Submit.json
│ └── SubmitSubStateMachine.json
└── zendesk-template
├── some_handlebars_zendesk_template_1.hbs
└── some_handlebars_zendesk_template_2.hbs
Cloudformation堆栈在./cloudformation/stack/
下面的yaml文件中定义。在不同环境中使用的所有参数都在./cloudformation/params/{stackname}/{env}/
目录下的json文件中定义,这些参数在堆栈定义中被引用/反映,看起来像这样(有很多!Sub
和!Ref
):
ZendeskWorkerLambdaArn:
Fn::ImportValue: !Sub "${ZendeskWorkerInfrastructureStackName}-ZendeskWorkerLambdaArn"
ZendeskDomain: !Ref ZendeskDomain
FooBarGroupId: !Ref FooBarGroupId
这个堆栈的作用是:
- 一旦从后端接收到调用信号,它就会启动,并且;
- 它随后调用lambda worker以及存储在S3 bucket中的模板名称(key),并且;
- 它还将参数传递给状态机,在状态机中,工作线程获得所有参数并执行一些业务逻辑操作(超出了本问题的范围)。
请注意,所有这些句柄模板文件都是通过在shell脚本中运行aws-cli(在./ops/
下)上传到s3 bucket的。
因为我试图使用CDK来取代这个非常重配置和重shell的Cfn项目,我遇到了一个问题,那就是我应该对不同环境的所有这些参数做什么。我使用cdk.CfnParameter
来定义CDK堆栈定义中的环境变量。我想我可以再做一次,但问题是:
- 如何区分相同的变量(名称),但在不同的环境下?
- 我必须附加到
cdk deploy
命令末尾的env数量很大,这使得整个命令看起来很乏味。(目前在json文件中为每个环境定义了大约40个参数) - 在部署时使用参数是法律不鼓励的。
我已经想不出如何解决这个问题了。非常感谢如果有人能给我一点想法,也很抱歉超长的帖子。虽然我希望我已经提供了足够的上下文(说到上下文,CDK上下文是我应该看的东西吗?)
欢呼,亚当
为此我使用了cdk.context.json和环境变量。
示例cdk context json,
{
"shared": {
"application": "application name",
},
"dev": {
"environment": "dev",
}
}
在部署cdk时从管道设置环境。
在python中获取如下环境,
ENVIRONMENT = os.environ.get('ENVIRONMENT', 'dev')
并在创建基础结构时读入该上下文,如Python中的
self.context = self.node.try_get_context(ENVIRONMENT)
请参阅此处获取其他示例- https://docs.aws.amazon.com/cdk/latest/guide/get_context_var.html