cdk FargateService中如何指定VPC ID

How to specify VPC ID in cdk FargateService

我正在尝试创建多个 ECS 服务,每个服务作为不同的堆栈,这样我就可以 update/delete/recreate 单独地创建它们。我还有 2 个堆栈,一个用于 VPC,另一个用于 ECS 集群。

结构:

.
|-- README.md
|-- stacks
|   |-- __init__.py
|   |-- ecs.py
|   |-- iam.py
|   |-- tasks_services.py
|   |-- test.py
|   `-- vpc.py
|-- app.py
|-- cdk.context.json

在我的 app.py 中,我正在将它们融合在一起

vpc = vpcstack(app, "vpcstack", config,
         env=cdk_env
               )
cluster = ecsstack(app, "ecsstack",vpc,config,
               env =cdk_env
               )
ExecutionRole = executionRole (app, "role" , environment,
                            env=cdk_env)

service = mySvc (app,"initial",environment , config,cluster,vpc,
                         env =cdk_env)

我不确定如何将 VPC 值传递到 ecs.FargateService

    ecs.FargateService(self, "Service",
                       cluster=cluster,
                       task_definition=task_definition,
                       vpc_subnets = ec2.SubnetSelection(                             
                            subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT
                                    ),

报错 TypeError: Cannot read properties of undefined (reading 'selectSubnets') 是有道理的,因为它无法读取 VPC 属性。我在这里看不到任何指定 VPC 值的选项。

例如ec2.securitygroups有VPC参数 self.security_group = ec2.SecurityGroup(self, "SG", vpc=vpc) 如何为 ecs.FargateService

做同样的事情

将 VPC 构造传递到 ECS 集群,(我将 VPC 和集群组合在一起以便于使用)。

正在创建VPC/cluster: 在 ecs.py

            vpc = ec2.Vpc(self, "VPC",
                               max_azs=3,

            ecs.Cluster(self, "Cluster",
                              vpc=vpc

根据 the documentation,有关 VPC 的信息通过 Cluster 传递。因此,在创建集群时,您应该传入正确的 VPC 引用。

cluster = ecs.Cluster(self, "Cluster",
    vpc=vpc
)

感谢@gshpychka 指出确切的问题。花了一些时间才明白。

提取堆栈的VPC并将其传递给下一个堆栈

vpc = vpcstack(app, "vpcstack", config,
         env=cdk_env
               )
cluster = ecsstack(app, "ecsstack",vpc.vpc,config,
               env =cdk_env
               )

service = mySvc (app,"initial",environment , config,cluster.ecs_cluster,vpc,
                         env =cdk_env)

在VPC.py

class vpcstack(Stack):

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

        # VPC constructs
           self.vpc = ec2.Vpc(self, "VPC",

在ecs.py

class ecsstack(Stack):

    def __init__(self, scope: Construct, construct_id: str, config,vpc,**kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        # Cluster 
        self.ecs_cluster = ecs.Cluster(self, "Cluster"