AWS CDK 多个应用程序

Lai*_*kus 10 amazon-web-services aws-cdk infrastructure-as-code

是否可以在同一个项目中拥有两个 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()
Run Code Online (Sandbox Code Playgroud)

并部署它们?同步/异步?

是否可以在另一个应用程序中引用一个应用程序中的某些资源?

Dig*_*ion 10

是的,您可以在一个 CDK 项目中拥有多个应用程序,但有一些严重的警告。

  1. CDK 进程一次只能合成/部署一个应用程序。

  2. 它们不能在同一个文件中定义。

  3. 他们不能直接引用彼此的资源。

从角度来看,每个应用程序在功能上都是相互隔离的,大致相当于两个单独的 CDK 项目只是共享相同的代码库,因此其用例是有限的。

它们共享资源的唯一方法是将其提取到必须首先部署的其他通用应用程序,或者您将该资源的 ARN 存储在某些内容(例如,参数存储)中,并在运行时加载它。您不能假设该资源将存在,因为其中一个应用程序可能尚未部署,并且如果您将资源直接导入到堆栈中,则您已经破坏了将它们分开的全部意义。

也就是说,这样就可以了:

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
Run Code Online (Sandbox Code Playgroud)

但是,如果 stack2 中的资源存在对于 stack1 至关重要,或者您想要将 stack2 资源导入到 stack1 中,那么您要么需要对所有公共资源进行第三次拆分: ,common-resources.app.py要么拆分它们没有意义。


我们在项目中经常这样做,一个应用程序创建一个 CodePipeline,自动部署另一个应用程序。然而,我们这样做只是因为我们更喜欢管道位于它正在部署的代码旁边,并且将其提取到一个全新的项目中同样有效。


如果你想这样做,你需要这样做:

应用程序1.py:

from aws_cdk import core

from stack1 import Stack1

app1 = core.App()
Stack1(app1, "CDK1")
app1.synth()
Run Code Online (Sandbox Code Playgroud)

应用程序2.py:

from aws_cdk import core

from stack2 import Stack2

app2 = core.App()
Stack2(app2, "CDK2")
app2.synth()
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过并行或顺序运行来部署它:

  • cdk deploy --app "python app1.py"
  • cdk deploy --app "python app2.py"

  • 看起来应用程序的有效用法可能是部署到单独的环境阶段。您可以将应用程序用作堆栈的捆绑,然后在实例化它时,可以在应用程序道具中传递 `env: {account: '1111111111',region: 'eu-west-1'}` 。想法? (2认同)

gar*_*wil 2

重新阅读你的问题后,简短的回答是否定的。在测试中,我发现 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 调用。