[AWS] Let's build ECR with CDK ECS Cluster version Please refer to Previous article as I will omit the assumptions: pray:
pipenv install aws_cdk.aws_ec2 aws_cdk.aws_ecs
props/ecs_cluster.py
If you want to use an existing VPC when creating an ECS Cluster, you need to look up based on your VPC ID and make the existing VPC available in the Stack. Therefore, parameter management is performed by a class called VpcForEcsCluster.
After that, the parameters that can be set are defined by referring to the API Reference. Container Insights is set to True by default because it is useful for monitoring if it is enabled.
props/ecs_cluster.py
from dataclasses import dataclass
from typing import Optional
from aws_cdk.aws_ecs import CloudMapNamespaceOptions
from src.props.base import Base
@dataclass(frozen=True)
class VpcForEcsCluster(Base):
id: str
vpc_id: str
@dataclass(frozen=True)
class EcsCluster(Base):
id: str
cluster_name: str
container_insights: bool = True
default_cloud_map_namespace: Optional[CloudMapNamespaceOptions] = None
entity/ecs_cluster.py
In the case of ECS Cluster, the parameters are different depending on the environment, specifically, the VPC ID is different, so create an entity for each environment. This time I'm writing only staging, but in production you can define the ProdEcsCluster class in the same file.
entity/ecs_cluster.py
from src.entity.base import Base
from src.props.ecs_cluster import EcsCluster, VpcForEcsCluster
class EcsClusterBase(Base):
vpc: VpcForEcsCluster
cluster: EcsCluster
class StgEcsCluster(EcsClusterBase):
id = 'StgEcsCluster'
vpc = VpcForEcsCluster(
id='StgVpc',
vpc_id='vpc-xxxxxxxx'
)
cluster = EcsCluster(
id='StgEcsCluster',
cluster_name='sample'
)
stack/ecs_cluster.py
The stack is designed to be used in any environment.
In Cluster, if you want to use an existing VPC, you need to specify vpc
as an argument, so you use a class method called Vpc.from_lookup to get it based on the VPC ID.
stack/ecs_cluster.py
from typing import Any, Type
from aws_cdk.aws_ec2 import Vpc
from aws_cdk.aws_ecs import Cluster
from aws_cdk.core import Construct, Stack
from src.entity.ecs_cluster import EcsClusterBase
class EcsClusterStack(Stack):
def __init__(
self,
scope: Construct,
entity: Type[EcsClusterBase],
**kwargs: Any) -> None:
super().__init__(scope, entity.id, **kwargs)
vpc = Vpc.from_lookup(self, **entity.vpc.to_dict())
Cluster(self, **entity.cluster.to_dict(), vpc=vpc)
app.py
Now let's add the stack of resources we want to build to app.py. If you want to build an ECS Cluster using an existing VPC, pass the region / account environment settings to ʻEcsClusterStack`. The CDK will automatically create a Context and keep the bad data (in this case the existing VPC) if it changes during deployment. It also has a cache-like meaning.
app.py
#!/usr/bin/env python3
from aws_cdk import core
from src.entity.ecr import SampleEcr
from src.entity.ecs_cluster import StgEcsCluster
from src.stack.ecr import EcrStack
from src.stack.ecs_cluster import EcsClusterStack
app = core.App()
#Tags to set for all resources
tags = {'CreatedBy': 'iscream'}
#Environmental setting(Required to use existing VPC)
env_stg = {'region': 'ap-northeast-1', 'account': 'xxxxxxxx'}
#ECR created last time
EcrStack(app, entity=SampleEcr, tags=tags)
# ECS Cluster
EcsClusterStack(app, StgEcsCluster, tags=tags, env=env_stg)
app.synth(skip_validation=False)
Now deploy !!!
pipenv run cdk deploy StgEcsCluster
Reference
Recommended Posts