指定堆栈名执行cdk synth仍合成所有堆栈的原因及解决方法
CDK执行
cdk synth StackA时为何两个堆栈都被合成?如何仅合成StackA? 问题背景
app.py代码如下:
my_env = cdk.Environment(account="XXXXXXX", region="us-east-1") StackA(app, "stack-a", env=my_env) StackB(app, "stack-b", env=my_env)
每个堆栈中都包含打印堆栈名称的语句,执行CLI命令cdk synth StackA时,输出同时出现两个堆栈的打印内容:
Inside StackA Inside StackB
原因解析
CDK的运行逻辑是:执行任何命令前,都会完整加载整个CDK应用的代码,实例化所有定义的堆栈。哪怕你指定只处理单个堆栈,应用初始化阶段还是会遍历所有堆栈的定义代码——这是因为CDK需要先构建整个应用的依赖图谱,才能确定指定堆栈的依赖关系。而堆栈里的打印语句属于实例化时执行的代码,所以两个堆栈的打印内容都会输出。
解决方法
方法一:用参数控制堆栈实例化
修改app.py代码,通过环境变量或CDK上下文参数控制是否创建StackB,不需要处理它时就不会实例化:
import os from aws_cdk import App, Environment app = App() my_env = Environment(account="XXXXXXX", region="us-east-1") # 始终创建StackA StackA(app, "stack-a", env=my_env) # 仅在指定条件下创建StackB(两种方式二选一即可) # 方式1:通过环境变量控制 if os.getenv("INCLUDE_STACK_B"): StackB(app, "stack-b", env=my_env) # 方式2:通过CDK上下文参数控制 # if app.node.try_get_context("include-stack-b"): # StackB(app, "stack-b", env=my_env) app.synth()
执行cdk synth StackA时,默认不会创建StackB,也就不会输出它的打印内容。如果需要处理StackB,再通过参数开启:
- 环境变量方式:
INCLUDE_STACK_B=true cdk synth StackB - 上下文参数方式:
cdk synth StackB -c include-stack-b=true
方法二:拆分堆栈到独立应用文件
把StackA和StackB分别放到不同的app文件中:
app-stack-a.py:仅定义StackAfrom aws_cdk import App, Environment my_env = Environment(account="XXXXXXX", region="us-east-1") app = App() StackA(app, "stack-a", env=my_env) app.synth()app-stack-b.py:仅定义StackBfrom aws_cdk import App, Environment my_env = Environment(account="XXXXXXX", region="us-east-1") app = App() StackB(app, "stack-b", env=my_env) app.synth()
执行时指定对应的app文件:
cdk synth StackA --app "python app-stack-a.py"
这样只会加载对应文件里的堆栈代码,完全不会处理另一个堆栈的定义。
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

