我如何将 cdk python 部署到多个环境 self.node.try_get_context('env') 和一些逻辑来指定堆栈的部署位置

How can I deploy cdk python to multiple environment to self.node.try_get_context('env') and some logic to specify where the stack gets deployed

我使用 python aws cdk 创建了以下 vpc class,我需要帮助了解如何通过 self.node.try_get_context('env') 动态设置环境变量到表示将部署堆栈的环境,例如 prod、dev、stg 等。因为我在我的逻辑中重复使用它来制定堆栈的命名约定。

我在 cdk.json 中分配了 env 变量作为 "env_stg": "stg", "env_prd": "prd",

我可以单独调用它们,但不了解动态调用它们以动态影响我的环境。

非常感谢任何帮助

class VPC(Stack):

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

        env = self.node.try_get_context('env')

        self.vpc =ec2.Vpc(self, "Stg",
            cidr = '10.0.0.0/16',
            max_azs = 2,
            enable_dns_support = True,
            enable_dns_hostnames = True,
                subnet_configuration = [
                    ec2.SubnetConfiguration(
                        name = 'Public',
                        subnet_type = ec2.SubnetType.PUBLIC,
                        cidr_mask = 24
                    ),
                    ec2.SubnetConfiguration(
                        name = 'Isolated',
                        subnet_type = ec2.SubnetType.PRIVATE_ISOLATED,
                        cidr_mask = 24                      
                    )
                ]       
        )

        # Store all private subnets in Parameter store 

        private_subnets = [subnet.subnet_id for subnet in self.vpc.private_subnets]

        # public_subnets = [subnet.subnet_id for subnet in self.vpc.public_subnets]
        count = 1 
        for subnets in private_subnets:
            ssm.StringParameter(self, 'private-subnet-'+str(count),
            string_value = subnets,
            parameter_name = '/'+env+'/pivate-subnet-'+str(count)
            )
            count += 1

您不需要新的环境变量或上下文。 Stacks can introspect their Environment(= 帐户 + 区域)在 synth-time。使用 Python 的语言功能从 Stack 的帐户中获取 account-specific 标签。

# vpc_stack.py

env_label = "stg"

if self.account == "123456789012":
  env_label = "prod"

更好的是,使用 CDK-provided CDK_DEFAULT_ACCOUNT 环境变量将标签逻辑提升到应用级别。它的值根据 cli --profile 标志值设置为 synth-time。将标签向下传递到堆栈道具(kwargs)中的堆栈。这样,配置更加集中、可见并且可跨堆栈重用。

# app.py

account = os.environ["CDK_DEFAULT_ACCOUNT"]

env_label = "stg"

if account == "123456789012":
  env_label = "prod"

你可以得到比这更奇特的东西,但这些是一些基本模式。