![](/img/trans.png)
[英]How can I delete and recreate a CDK Stack (Cloudformation) using a lambda?
[英]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中定義的參數值呢?
#!/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()
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.