簡體   English   中英

使用 CDK 動態設置 CloudFormation 堆棧的名稱

[英]Dynamically set the name of a CloudFormation stack using CDK

我是 AWS CDK 的新手,我正在嘗試弄清楚如何動態設置將要創建的 CloudFormation 堆棧的名稱。

據我了解,堆棧的名稱在app.py中設置,在代表堆棧的構造中。 但是,我不知道如何(或是否可能)引用堆棧中設置的參數。

在下面的app.py中,我試圖引用cluster_name參數,如下面的vpc-stack.py中所定義。 但這不起作用,並且引發了 AttributeError 異常 -

AttributeError:類型 object 'Vpc' 沒有屬性 'cluster_name'

那么如何引用vpc-stack.py中定義的參數值呢?

應用程序.py

#!/usr/bin/env python3
import os
from aws_cdk import core as cdk
from ldx_analytics.vpc_stack import Vpc

app = cdk.App()
Vpc(app, 'Vpc',
    # For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html
    env = cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')),
    description = 'CDK VPC test.'
    stack_name = f"LDXa-{Vpc.cluster_name.value_as_string}-VPC"
)

app.synth()

vpc-stack.py

from aws_cdk import (
    core as cdk,
    aws_ec2 as ec2
)

class Vpc(cdk.Stack):

    def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        cidr_block = cdk.CfnParameter(self, 'CidrBlock',
            type = 'String',
            description = 'IPv4 CIDR block to use for the VPC.'
        )

        cluster_name = cdk.CfnParameter(self, 'ClusterName',
            type = 'String',
            description = 'Name of the LDX Analytics cluster.'
        )

        vpc = ec2.Vpc(self, 'VPC',
            cidr = self.node.try_get_context('cidr_block'),
            ...
        )
        cdk.Tags.of(vpc).add('Name', f"LDXa-{cluster_name.value_as_string}-VPC")

是的,可以在堆棧和其他元素之間動態傳遞變量。 它是CDK的超級大國之一。

CDK 最佳實踐是在synth-time設置變量,也就是說,當您運行cdk synth時。 這是 CDK 創建將要部署的 CloudFormation 模板(和其他工件)的時間。 亞馬遜 說:

盡管 AWS CloudFormation 允許您在部署時做出決策(使用條件、{ Fn::If } 和參數),並且 AWS CDK 允許您訪問這些機制,但我們建議您不要使用它們。 與通用編程語言中可用的值相比,您可以使用的值類型以及可以對其執行的操作類型非常有限

在您的情況下,遵循 CDK 最佳實踐意味着您應該刪除CfnParameter引用,它們是部署時變量。 相反,慣用的解決方案是將集群名稱和其他變量作為 arguments 向下傳遞給您的Vpc(Stack) class。 您可以在應用程序中的堆棧和構造之間傳遞字符串變量甚至 CDK 構造,只要它是正確的 Python 代碼即可。 AWS 在 github 上有一些很好的示例應用程序,包括帶有 Vpcs 的應用程序。

如果您有多個帳戶或區域,您只需在您的應用程序中創建幾個Vpc(Stack) class 實例。

CDK 還可以引用以前在您的應用程序之外部署到 AWS 的資源。 但是,正如 AWS 所說:

將盡可能多的資源保留在同一個堆棧中通常更容易,因此除非您知道要將它們分開,否則請將它們放在一起。

(PS 您看到的代碼異常是 Python 語法不正確的結果。您正在嘗試引用未定義的 class 變量。並且當前設置中存在一些循環性。但是因為無論如何您都會重構,所以這並不是那么重要)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM