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