'How to specify VPC ID in cdk FargateService
I'm trying to create multiple ECS services each service as a different stack so I can update/delete/recreate them individually. I have 2 more stacks one for VPC and another one for the ECS cluster.
Structure:
.
|-- README.md
|-- stacks
| |-- __init__.py
| |-- ecs.py
| |-- iam.py
| |-- tasks_services.py
| |-- test.py
| `-- vpc.py
|-- app.py
|-- cdk.context.json
In my app.py I'm fusing thig together
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)
I'm not sure how to pass the VPC values into the ecs.FargateService
ecs.FargateService(self, "Service",
cluster=cluster,
task_definition=task_definition,
vpc_subnets = ec2.SubnetSelection(
subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT
),
It gives the error
TypeError: Cannot read properties of undefined (reading 'selectSubnets') makes sense because it was not able to read the VPC properties. I don't see any option to specify the VPC values here.
For example ec2.securitygroups has the VPC paramerter
self.security_group = ec2.SecurityGroup(self, "SG", vpc=vpc) How to do the same for ecs.FargateService
Passing the VPC construct to the ECS cluster, (i have combined the VPC and clustre togather for ease of use ).
Creating VPC/cluster: in ecs.py
vpc = ec2.Vpc(self, "VPC",
max_azs=3,
ecs.Cluster(self, "Cluster",
vpc=vpc
Solution 1:[1]
Thanks to @gshpychka for pointing out the exact issue. Took some time to understand.
Extract VPC for the stack and pass it to the next stack
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)
In 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",
in 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"
Solution 2:[2]
As per the documentation the information about VPC is passed through a Cluster. Thus when creating a cluster you should pass in a correct VPC reference.
cluster = ecs.Cluster(self, "Cluster",
vpc=vpc
)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | AJR |
| Solution 2 | miensol |
