Amazon ECS Service Connect 소개
- 2022년 12월 출시
- 클러스터 내부의 분산된 서비스 간의 연결을 손쉽게 구축하고 운영 가능
- ECS 클러스터와 VPC에 구축된 간편한 네트워크 설정과 원활한 서비스 통신 제공
- AWS Cloud Map에서 제공하는 네임스페이스를 사용하여 논리적 이름으로 서비스를 참조 및 연결하고 로드 밸런서를 배포 및 구성하지 않고도 ECS 작업 간 트래픽 자동 분산 가능
- 가시성 데이터를 통한 서비스 복원력 개선
- Service Discovery보다 빠른 배포시간
Amazon ECS의 서비스 간 통신 방법
- Amazon ECS Service Discovery
- Amazon Elastic Load Balancer
- AWS App Mesh
- Amazon ECS Service Connect
ECS Service Connect 적용 시 고려사항
- 작업 정의는 Service Connect를 사용하는 작업 메모리 제한을 설정해야 함
- 작업 메모리 제한을 설정하는 대신 모든 컨테이너에 대해 컨테이너 메모리 제한을 설정하는 작업 정의는 지원되지 않음
- 이 외에 고려해야 할 사항은 하단에 참고 자료 중 Service Connect 문서 참조
ECS Service Connect 실습을 위한 사전 준비(컨테이너 애플리케이션 배포)
a. CloudFormation 스택 배포(ap-northeast-2에서 진행)
- 템플릿 다운로드(클릭)

- OwnerArn에 AWS Cloud9 IDE에 액세스 가능한 IAM 역할 입력

- 체크박스 선택 후 제출

- 배포 확인

b. Cloud9
- Cloud9 IDE에서 Open 클릭

- 실습을 위한 코드 확인

c. Amazon ECR 프라이빗 리포지토리 생성

- cats, dogs, web repository 생성



- 리포지토리 생성 후 확인

d. 도커 이미지 생성(Cloud 9)
- 도커파일 확인 및 도커 빌드(cats, dogs, web 동일하게 진행)



e. 이미지 태그 및 ECR로 푸시
- 리포지토리에서 Push command 확인 후 이미지 태그 및 푸시(1, 3, 4 항목에 대해서 진행)
- 2번 항목의 경우 앞서 빌드했기 때문에 생략
- cats, dogs, web 동일하게 적용

- cats, dogs, web 이미지 확인



f. Amazon ECS 클러스터 생성

- Amazon EC2 instances 선택 및 Auto Scaling group 생성

- 프라이빗 서브넷 선택 및 보안 그룹 설정

- 생성된 ECS 클러스터 확인

g. ECS 작업 정의

- web작업 정의(webdef)
- 참고) Amazon ECS를 처음 사용하게 되면 ecsTaskExcutionRole IAM 역할이 존재하지 않기 때문에 Task execution role 설정에서 Create new role을 선택하면 자동으로 ecsTaskExcutionRole IAM 역할이 생성됨

- ECR에서 Image URI 복사

- Logging 설정

- cat 작업 정의(catdef) – json 템플릿으로 생성
{
"requiresCompatibilities": [
"EC2"
],
"family": "catsdef",
"containerDefinitions": [
{
"name": "cats",
"image": "<YOUR CATS ECR IMAGE URI>",
"portMappings": [
{
"name": "cats-80-tcp",
"containerPort": 80,
"hostPort": 0,
"protocol": "tcp",
"appProtocol": "http"
}
],
"essential": true,
"environment": [],
"environmentFiles": [],
"mountPoints": [],
"volumesFrom": [],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-create-group": "true",
"awslogs-group": "/ecs/catsdef",
"awslogs-region": "<YOUR REGION>",
"awslogs-stream-prefix": "ecs"
}
}
}
],
"volumes": [],
"networkMode": "bridge",
"memory": "1024",
"cpu": "512",
"runtimePlatform": {
"cpuArchitecture": "X86_64",
"operatingSystemFamily": "LINUX"
},
"executionRoleArn": "arn:aws:iam::<YOUR ACCOUNT ID>:role/ecsTaskExecutionRole"
}
- dogs 작업 정의(dogsdef) – json 템플릿으로 생성
{
"requiresCompatibilities": [
"FARGATE"
],
"family": "dogsdef",
"containerDefinitions": [
{
"name": "dogs",
"image": "<YOUR DOGS ECR IMAGE URI>",
"portMappings": [
{
"name": "dogs-80-tcp",
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp",
"appProtocol": "http"
}
],
"essential": true,
"environment": [],
"environmentFiles": [],
"mountPoints": [],
"volumesFrom": [],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-create-group": "true",
"awslogs-group": "/ecs/dogsdef",
"awslogs-region": "<YOUR REGION>",
"awslogs-stream-prefix": "ecs"
}
}
}
],
"volumes": [],
"networkMode": "awsvpc",
"memory": "1024",
"cpu": "512",
"runtimePlatform": {
"cpuArchitecture": "X86_64",
"operatingSystemFamily": "LINUX"
},
"executionRoleArn": "arn:aws:iam::<YOUR ACCOUNT ID>:role/ecsTaskExecutionRole"
}
h. ecsTaskExecutionRole Policy 수정
- 기존 정책에 CloudWatchFullAccess 추가

i. ECS 서비스 생성
- ALB 생성

- Web 서비스 생성

- EC2 선택

- Family는 webdef 설정, Desired tasks는 2로 설정

- ALB 설정

- Web Service 확인


- cats 서비스 생성(EC2 선택)

- Family는 catsdef 설정, Desired tasks는 2로 설정

- ALB 설정(Path pattern, Health check path)

- cats Service 확인


- dogs 서비스 생성(FARGATE 선택)

- Family는 dogsdef 설정, Desired tasks는 2로 설정

- 프라이빗 서브넷 선택 및 보안 그룹 설정

- ALB 설정(Path pattern, Health check path)

- ECS 서비스 확인



ECS Service Connect 실습
a. Service Connect 설정 확인



b. Service Connect 활성화(cats, dogs)

- Discovery 및 DNS 설정

- Service Connect 활성화하게 되면 즉시 적용되는 것이 아니라 배포 후에 적용됨

- dogs는 Discovery names – Configure로 설정(Discovery 및 DNS 설정)

c. Cloud9 설정
- Web Service 설정값 수정
- 앞서 백엔드 서비스인 cats, dogs의 DNS를 설정했고 활용하기 위함

- Docker Build 및 Push

- 작업 정의 수정(revision)

b. Service Connect 활성화(web)

- Web Service는 Client side only로 선택
- 프론트 서비스인 Web Service는 서비스 디스커버리 정보를 업데이트 받아가지고 뒷단에 백엔드 서비스로 트래픽을 보내기만 하면 되고, 자신의 정보는 등록할 필요가 없기 때문

- Web Service는 Incoming traffic health 없음(Client side only로 선택했기 때문에 Outgoing traffic health만 보이게 됨)

- Service Connect 적용 후 dogs Traffic health 확인

결론
- Service Connect를 사용하면 다른 AWS 서비스의 추가 리소스 없이 애플리케이션 코드 수정 없이 클러스터 네임스페이스 범위 내에서 내부 통신을 쉽게 구축 가능
- awsvpc 및 bridge 네트워크 모드를 모두 지원하며, 각각의 경우 Amazon ECS가 자동으로 필요한 컨테이너를 추가로 생성
- 단, Service Connect 적용 시 고려사항에 대해 충분한 확인 필요
참고 자료
https://aws.amazon.com/ko/blogs/tech/run-microservices-easily-with-amazon-ecs-service-connect/
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html
https://catalog.us-east-1.prod.workshops.aws/workshops/8c9036a7-7564-434c-b558-3588754e21f5/ko-KR