文章目录
- aws(学习笔记第三十五课) aws service connect with ecs/ecr
- 学习内容:
-
- 1. 整体架构
- 2. 代码解析
-
- 2.1 `CdkExamplesServiceConnectStack.py`整体入口
- 2.2 `ecr_stack.py`创建`docker image`
- 2.3 `frontend`内部结构
- 2.4 `backend`内部结构
- 2.5 `ecrs_stack.py`创建`fargate`的`ECS`服务
-
- 2.5.1 创建`ECS`的`cluster`
- 2.5.2 开启`ECS cluster`内部服务的`service connect`
- 2.5.3 创建`ECS cluster task`需要的`role`
- 2.5.4 创建`ECS cluster`中`service`的`security group`
- 2.5.5 创建`ECS cluster`中`task definition`
- 2.5.6 对`ECS cluster`中`task definition`,追加`container`
- 2.5.7 创建`ECS cluster`中`frontend service`和`backend service`
- 2.5.8 创建`Application Loader Balancer`
- 3 部署整个应用
aws(学习笔记第三十五课) aws service connect with ecs/ecr
- 在
ecs
使用aws service connect
在ecs
学习内容:
- 使用
aws service connect
- 使用
ecs
和ecr
1. 整体架构
1.1 代码链接
1.2 整体架构
整体分为EcrStack
和EcsStack
两个主要stack
。
EcrStack
负责构成docker
容器。EcsStack
负责构成fargate
的service
。fargate
的service
分为frontend
和backend
frontend
是负责前端展示的project
backend
是负责后端展示的project
1.2 执行环境
这里,windows
本地安装docker
有些问题,但是整个cdk
工程需要docker
进行本的的docker build
,所以windows
会depoly
失败。这里采用cloudshell
进行练习。
2. 代码解析
2.1 CdkExamplesServiceConnectStack.py
整体入口
2.1.1 创建vpc
super().__init__(scope, construct_id, **kwargs)
# Creating a shared VPC with public subnets and private subnets with NAT Gateways
vpc = ec2.Vpc(self, "ServiceConnectVPC",
ip_addresses=ec2.IpAddresses.cidr("10.0.0.0/16"),
create_internet_gateway=True,
max_azs=2,
nat_gateways=2,
enable_dns_hostnames=True,
enable_dns_support=True,
vpc_name="App-Mesh-VPC",
subnet_configuration=[
ec2.SubnetConfiguration(
subnet_type=ec2.SubnetType.PUBLIC,
name="Public",
cidr_mask=24
),
ec2.SubnetConfiguration(
subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS,
name="Private",
cidr_mask=24
)
]
)
2.1.2 创建nested stacks
AWSRegion=Stack.of(self).region
AWSStackId=Stack.of(self).stack_id
ecr_stack = EcrStack(self, "EcrStack")
ecs_stack = EcsStack(self, "EcsStack", vpc=vpc, frontend_repository=ecr_stack.frontend_docker_asset, backend_data_repository=ecr_stack.backend_data_docker_asset)
注意,这里在整体的CdkExamplesServiceConnectStack
里面,可以继续嵌套调用nested stack
。但是需要继承NestedStack
父类
class EcrStack(NestedStack):
class EcsStack(NestedStack):
2.2 ecr_stack.py
创建docker image
2.2.1 创建repository(docker image)
super().__init__(scope, id, **kwargs )
# Creates two ecr repositories that will host the docker images for the color teller gateway app and color teller app
FrontendRepository = ecr.Repository(self, "FrontendRepository", repository_name="frontend")
BackendDataRepository = ecr.Repository(self, "BackendDataRepository", repository_name="backend_data")
# The docker images were built on a M1 Macbook Pro, you may have to rebuild your images
frontendAsset = DockerImageAsset(self, "frontendAsset",
directory="./services/frontend",
build_args={
"SERVICE_B_URL_BUILD_ARG": "data.scapp.local" # This argument will be passed to the dockerfile and is the URL that the frontend app will use to call the backend
},
platform=Platform.LINUX_AMD64
)
dataAsset = DockerImageAsset(self, "dataAsset",
directory="./services/data",
)
# Deploying images to ECR
ecrdeploy.ECRDeployment(self, "DeployFrontendImage",
src=ecrdeploy.DockerImageName(frontendAsset.image_uri),
dest=ecrdeploy.DockerImageName(f"{
Aws.ACCOUNT_ID}.dkr.ecr.{
Aws.REGION}.amazonaws.com/frontend:latest")
)
ecrdeploy.ECRDeployment(self, "DeployBackendImage",
src=ecrdeploy.DockerImageName(dataAsset