我正在尝试创建一个cron事件,该事件在PROD
环境上每天运行一次,而在DEV
环境上每周运行一次。我的代码是这样的
environment = CfnParameter(
self,
"environment",
type="String",
description="Environment e.g. DEV|PROD",
default="DEV",
allowed_values=["DEV", "PROD"],
)
if environment.value_as_string == "PROD":
rule = events.Rule(
self,
"Some clever description",
schedule=events.Schedule.cron(minute="0", hour="2", week_day="TUE,WED,THU,FRI,SAT"),
)
else:
rule = events.Rule(
self,
"Some clever description",
schedule=events.Schedule.cron(minute="0", hour="2", week_day="TUE"),
)
我的问题是,在我的prod帐户上,当我检查云形成参数时,它显示PROD
,但该事件每周只运行一次?
您的方法不工作,因为您不能使用部署时CloudFormation参数与本地if..then
代码。
Docs:因为它们在合成时不可用,参数值不能很容易地用于流量控制和其他目的在你的CDK应用程序…要实现带有参数的控制流,您可以使用
CfnCondition
结构,尽管这与本机if语句相比有些笨拙。
下面是另外两种惯用的CDK方法。在这两种情况下,"生产还是开发?"在合成时已知:
选项1:将prod: bool
prop添加到您的Stack定义
一种方法,取自CDK文档,使用Stack prop和if prod:
控制流语句。
# app.py
MyStack(app, "beta", env=my_dev_env)
MyStack(app, "prod", prod=True, env=my_prod_env)
选项2:对控制流使用Stack的帐户id
您可能不需要显式的prod
prop。文档中也介绍了另一种方法,即使用堆栈的帐户id来确定条件变量:
#MyStack.py
if self.account == '<prod-account>':
# do prod stuff
else:
# do dev stuff
无论使用哪一种方法,根据你的部署策略,你可以将应用程序分成两个文件(例如app_prod.py
,app_dev.py
)。这里的要点是:在合成时做出决定,并在代码中对所有生产阶段建模。