是否有可能在同一项目中有两个CDK应用程序,如下所示:
from aws_cdk import core
from stack1 import Stack1
from stack2 import Stack2
app1 = core.App()
Stack1(app1, "CDK1")
app1.synth()
app2 = core.App()
Stack2(app2, "CDK2")
app2.synth()
然后部署它们?同步/异步?
是否可以在一个应用程序中引用另一个应用程序中的一些资源?
发布于 2021-04-15 03:59:39
是的,您可以在一个CDK项目中拥有多个应用程序,但有一些严重的警告。
为了正确地理解这一点,每个应用程序在功能上相互隔离,这大致相当于两个单独的CDK项目共享相同的代码库,因此这方面的用例是有限的。
它们共享资源的唯一方法是要么将其提取到必须首先部署的其他通用应用程序中,要么让您将该资源的ARN存储在某个东西(例如,Parameter Store)中,并在运行时加载它。你不能假设资源将会存在,因为其中一个应用程序可能还没有部署,如果你直接将资源导入到你的Stack中,你已经放弃了将它们分开的整个要点。
也就是说,这是可以的:
stack1.lambda:
from ssm_parameter_store import SSMParameterStore
store = SSMParameterStore(prefix='/Prod')
ssn_arn = store['stack2.sns']
if !ssn_arn
// Doesn't matter
return
try:
sns.publish(ssn_arn, 'something')
except:
// Doesn't matter
但是,如果来自stack2的资源对于stack1来说很重要,或者您想要将stack2资源导入到stack1中,那么您需要对所有公共资源进行第三次拆分:common-resources.app.py
,否则拆分它们是没有意义的。
我们在我们的项目中经常这样做,一个应用程序创建一个自动部署另一个应用程序的CodePipeline。然而,我们这样做只是因为我们更喜欢流水线紧挨着它正在部署的代码,而且将其提取到一个全新的项目中也同样有效。
如果你想这样做,你需要做的是:
app1.py:
from aws_cdk import core
from stack1 import Stack1
app1 = core.App()
Stack1(app1, "CDK1")
app1.synth()
app2.py:
from aws_cdk import core
from stack2 import Stack2
app2 = core.App()
Stack2(app2, "CDK2")
app2.synth()
然后,您可以通过并行或顺序运行来部署它:
cdk deploy --app "python app1.py"
cdk deploy --app "python app2.py"
发布于 2020-12-17 21:12:45
重读你的问题后,简短的答案是否定的。在测试中,我发现CDK只会创建第二个定义的应用程序。
但是,您可以部署多堆栈应用程序:
https://docs.aws.amazon.com/cdk/latest/guide/stack_how_to_create_multiple_stacks.html
还可以使用core.CfnOutput和core.Fn.importValue从一个堆栈引用另一个堆栈中的资源:
https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.core/CfnOutput.html https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.core/Fn.html
在幕后,这使用了CloudFormation导出输出并将其导入其他堆栈的能力。实际上,你的多协议栈CDK应用将创建嵌套的CloudFormation协议栈。
在部署方面,CDK创建并部署了一个CloudFormation变更集,因此所有变更都将部署在cdk deploy
上。从您的角度来看,它将是同步的,但可能会通过CloudFormation在幕后进行一些异步API调用。
https://stackoverflow.com/questions/65341642
复制相似问题