[Hands On] ECS Service Connect 활용하기

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://aws.amazon.com/ko/blogs/korea/new-amazon-ecs-service-connect-enabling-easy-communication-between-microservices/

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

https://static.us-east-1.prod.workshops.aws/public/657a7dd5-1773-49cc-aacd-903efff8577c/static/ecs-demogo.yaml

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다