[Hands on] ALB-Amazon ECS on Fargate , 멀티 타겟그룹 연결까지

1. Amazon ECS on Fargate 란?

AWS Fargate 는 EC2 인스턴스의 서버나 클러스터를 관리 할 필요 없이 서버리스 방식으로 Amazon ECS 에서 컨테이너를 실행할 수 있도록 만들어주는 서비스 입니다.

Amazon ECS on Fargate 를 사용하면 컨테이너를 실행하기 위해 가상 머신 서버의 클러스터를 프로비저닝하거나 구성하고, 관리할 필요가 없습니다. 또한 서버 사용량을 고려하여 유형을 선택하거나, 클러스터를 조정해야 할 시점을 고민하거나 클러스터 패킹을 최적화 할 필요가 없어지는 AWS 컨테이너 생성 및 관리 서비스 입니다.

2. Amazon ECS on Fargate Hands-on

  • 실습 목표

ECR 에 Push 한 컨테이너 이미지를 이용하여 AWS Fargate 방식으로 ECS 를 생성해보고, 이를 ALB 와 연결한 뒤에 추가적으로 멀티 타겟그룹을 등록하는 것을 본 실습의 목표로 합니다.

  • 실습 순서
    1. ECR 생성하고, 컨테이너 이미지 Push
    2. ECS 클러스터 생성 및 구성하기
    3. ALB 구성 및 생성
    4. ECS 서비스 배포하기
    5. 멀티 타겟그룹 등록하기

  • 실습 구성

ECR 에 업로드한 이미지를 사용하여 ECS 클러스터 및 Service 를 생성하고, ALB와 연결하여 접속하도록 합니다.

1.ECR 생성하고, 컨테이너 이미지 Push

1) Docker 파일 및 html 파일을 작성 합니다.

2) Dockerfile 을 build 하여 Docker Image를 생성합니다.

docker images 명령어를 통해 build 한 이미지 확인합니다. nginx라는 레포지토리 이름에 test-nginx 라는 태그가 붙은 이미지가 생성된 것을 확인할 수 있습니다.

3) ECR 프라이빗 리포지토리 생성

앞서 생성한 이미지를 ECS 가 사용할 수 있도록 ECR 프라이빗 리포지토리를 생성합니다.

4) ECR 에 로그인하기

ECR 서비스를 이용하려면 ECR 권한을 가진 IAM 으로 aws cli 로그인을 해야하기 때문에 먼저 IAM User 를 생성하고 액세스 키를 생성합니다.

-연결하는 권한 정책 : AmazonEC2ContainerRegistryFullAccess

aws cli 에 로그인 한 후 ecr 로그인을 위한 토큰 값을 출력합니다.

$ aws ecr get-login-password — region [ 해당 리전 ]

앞서 받은 토큰을 복사하여 ECR 에 로그인 합니다.

$ docker login -u AWS -p [토큰 값] [ ECR 리포지토리 URI]

5) ECR 에 이미지 Push

$ docker push [ECR URI] :[이미지태그]


콘솔의 ECR 프라이빗 리포지토리에 이미지가 Push 된 것을 확인 가능합니다.

2. ECS 클러스터 생성 및 구성하기

1) ECS 클러스터 생성하기

원하는 클러스터 이름과 클러스터가 위치할 VPC 및 서브넷을 지정하고, AWS Fargate 로 클러스터를 생성합니다.



** 인프라 유형

– AWS Fargate : 서버나 클러스터 관리가 필요 없는 서버리스 방식으로 Amazon ECS 클러스터 생성

– Amazon EC2 : Amazon EC2 위에 Amazon ECS 클러스터 생성, 수동 구성으로 구성 및 관리가 필요하고, 변동 가능성이 적은 일관된 리소스 요구가 있는 워크로드에 적합

– ECS Anywhere : 고객의 기존 인프라에서 Amazon ECS 클러스터를 생성 가능

사용자가 직접 서버나 클러스터의 구성 및 관리할 필요가 없는 서버리스 방식의 AWS Fargate 로 ECS 생성 선택합니다.

2) ECS 작업 정의 ( ECS Task ) 구성하기

ECS 태스크 실행 시 역할을 할 IAM Role 을 우선 생성합니다.

신뢰할 수 있는 엔터티 유형에서 ECS 서비스 자체에 권한을 부여하기 위한 “AWS서비스” 선택합니다.

-연결할 권한 정책 : AmazonECSTaskExecutionRolePolicy

이제 ECS 태스크 정의 및 구성을 설정합니다.

이때, 컨테이너 이미지 URI 는 앞서 ECR 생성 후 Push 한 이미지의 URI 를 입력하고, 태스크 역할 및 태스크 실행 역할 은 앞서 생성한 IAM Role 을 입력합니다.

3. ALB 구성 및 생성

Private subnet에 위치하는 ECS 와 연결하여 외부의 트래픽 진입점이 될 ALB 를 생성합니다.

1) 타겟그룹 생성하기

2) ALB 생성하기

외부 트래픽의 진입점이 되는 ALB 이므로 스키마는 Internet-facing 으로 설정합니다.

리스너는 HTTP:80으로 설정하고, 앞서 생성한 타겟그룹 ( ecs-test-tg ) 에 트래픽을 전달하도록 설정합니다.

4. ECS 서비스 배포하기

1) ECS 서비스 생성하기

“2.클러스터 생성 및 구성하기” 에서 생성한 클러스터(kico-ecs-test)를 선택하고, 서비스를 생성합니다.

컴퓨팅 옵션은 직접 태스크를 실행하고 조정 관리하기 위하여 “시작유형” 으로 선택 합니다.

※ 클러스터 컴퓨팅 옵션

-용량 공급자 전략 : 인프라의 조정을 관리하기 위하여 태스크가 클러스터의 용량 공급자에 분배되는 방식을 결정함. Amazon ECS 워크로드가 실행되는 인프라에 따라 사용할 수 있는 용량 공급자 유형이 결정됨

참고 ) Amazon ECS Anywhere에서 외부 컨테이너 인스턴스를 사용하는 경우 용량 공급자를 사용할 수 없음.

-시작 유형 : 용량 공급자 전략을 사용하지 않고 직접 태스크를 시작

1) ECS 서비스 배포구성 및 네트워크 설정하기

ECS 클러스터 서비스 배포 구성을 설정합니다. ALB 와 연결하고, 중지 및 다시 시작을 할 수 있도록 애플리케이션 유형은 “서비스”로 선택 합니다.

서비스 유형은 원하는 복수의 작업 수를 배치하기 위하여 “복제본”을 선택합니다.

** 애플리케이션 유형

-서비스 : 중지 및 다시 시작할 수 있는 장기 실행 컴퓨팅 작업을 처리 하는 태스크 그룹을 시작

-태스크 : 실행하고 종료하는 독립 실행형 태스크

참고 ) 태스크를 선택할 경우 로드밸런서와 연결할 수 없음

** 서비스 유형

-복제본 : 클러스터 전체에 원하는 작업 수를 배치하고 유지 관리

-대몬(Daemon) : 각 컨테이너 인스턴스에 작업 사본 하나를 배치하고 유지 관리

2) ECS서비스 네트워크 연결하기

ECS 클러스터 서비스를 배포할 VPC와 서브넷, 보안그룹 등의 네트워크 설정을 진행합니다.

3) 로드밸런서와 ECS 서비스 연결하기

“3.ALB 구성 및 생성” 단계에서 생성해 둔 로드밸런서를 선택하고, 로드밸런싱할 컨테이너, 대상그룹까지 연결하여 최종적으로 서비스를 생성합니다.

4) ECS 서비스 및 태스크 실행 확인하기

로드밸런서와 연결된 타겟그룹에도 자동으로 IP 기반의 태스크가 등록된것을 확인할 수 있습니다.

외부 트래픽의 진입점이 되는 ALB 의 DNS 로 접속 결과 Dockerfile 로 작성한 컨테이너 이미지 페이지를 확인 가능합니다.

5. 멀티 타겟그룹 등록하기

하나의 ECS 클러스터에 여러 컨테이너가 생성되거나, 여러 포트를 사용하고 있다면 타겟 그룹을 분리하여 트래픽을 전달 해야 하는 경우가 발생합니다.

AWS 콘솔에서는 하나의 서비스에 하나의 타겟그룹을 등록 하는 것만 지원하고 있어 여러 개의 타겟 그룹을 연결하고 싶은 경우 aws cli 를 통해 별도의 설정을 해주어야 합니다.

1)새로운 타겟 그룹 추가 생성 및 로드밸런서 리스너 추가 설정하기

로드밸런서 리스너에 새로운 타겟그룹 추가합니다.

2) 작업을 진행 할 EC2 에 ECS 에 관한 권한 주기

aws cli 작업을 진행할 EC2 에 ECS에 관한 권한을 부여합니다.
-인라인 정책 권한 : ListServices, ListServicesByNamespace, UpdateServices

필요한 권한을 부여한 IAM Role 을 EC2 인스턴스 IAM 역할 수정을 통해 적용하여 EC2 권한을 업데이트 합니다.

3) ECS update-service 작업 진행

EC2 인스턴스에 접속하여 aws cli 를 통해 ECS update-service 작업을 진행합니다.

** aws cli 버전은 v2 여야하고, cli 로그인하는 IAM 에 ECS 에 대한 권한이 있어야 ECS update-service 작업이 가능합니다.

연결할 ECS 컨테이너 정보와 두 타겟그룹에 대한 정보를 입력한 input.json 파일을 생성합니다.

aws ecs update-service 커맨드를 통해 input.json 에서 명시한 두 타겟 그룹을 연결합니다.

$ aws ecs update-service –cluster [클러스터명] –service [ 서비스 네임 ] –cli-input-json file://input.json –region [ 해당리전 ]

4) 멀티 타겟그룹 등록 확인

두개의 타겟 그룹 모두 연결되었고, 헬스체크 역시 두 그룹 모두 healthy 로 확인되었다.

3. 마무리

AWS Fargate 를 이용하여 ECS 를 생성할 때 복잡한 구성이나 별도의 서버를 생성할 필요 없이 네트워크만 잘 설정해 준다면 손쉽게 AWS 위에 컨테이너를 올릴 수 있는 실습이었습니다. 하지만 멀티 타겟그룹 등록과 같은 추가 설정이나 복잡한 다수의 서비스와 컨테이너 생성이 필요한 경우에는 생성 시 설정하는 옵션 값들의 의미와 기능을 정확하게 파악하고, 컨테이너의 네트워크 플로우를 정확히 인지하고 있어야 네트워크의 복잡도를 줄이고, 실패 없는 작업이 가능합니다.

참고자료

https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/AWS_Fargate.html

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html

https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/cluster-capacity-providers.html

“[Hands on] ALB-Amazon ECS on Fargate , 멀티 타겟그룹 연결까지”의 1개의 댓글

  1. 안녕하세요

    2. ECS 클러스터 생성 및 구성하기
    1) ECS 클러스터 생성하기

    저는 이 부분에서 네트워킹 항목이 뜨지 않는데 이유가 무엇인지 모르겠습니다..

댓글 달기

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