지난 글에서 '컨테이너 오케스트레이션 툴'이란 무엇인지 확인했다.

요약하자면 우리가 띄운 여러개의 컨테이너를 관리해주고 조율하는 툴이었다.

이번에는 컨테이너의 오케스트레이션 툴 중의 하나인 ECS(Elastic Container Service)

그리고 그 방법 중 하나인 fargate방식을 이용하여 오케스트레이션 툴을 쓰는 방법을 확인해보자.

 

일단 가장 앞서서, 우리가 무엇을 하는 것인지를 확인해보자.

앞으로 할 일이 너무 길어서, 꼭 우리가 뭘 하는지를 알고 실행해야 한다.

1. AWS ECR Repository :  레지스트리에 우리가 도커파일로 만들어 줄 이미지를 퍼블리싱한다.

2. Task Definition : 태스크 정의를 작성해서 태스크가 어떤 이미지를 기반으로 어떻게 사용될것인지를 정의한다.

  • JSON 파일 형식이지만, 우리가 AWS의 UI에 맞게 설정하면 AWS가 자동으로 JSON으로 번역한다.

3. Task : Task Definition을 기반으로 만들어진 인스턴스로, 태스크는 클러스터에 속한 컨테이너/EC2 인스턴스나 fargate에 배포한다.

4. Service : 클러스터에서 지정된 수의 작업을 동시에 실행하고 관리할 수 있게 해주는 구성으로, 한 개 이상의 태스크가 서비스에 포함되어 있고, 태스크와 관련된 Auto-Scaling과 Load Balancing을 관리한다.

5. Cluster : Task나 Service의 논리적 그룹으로, 클러스터를 실행하여 작업을 실행한다.

 

결국 우리는 클러스터를 생성해서 관리할 것이므로, 시나리오는 다음과 같다.

5번 클러스터 생성 -> 1번 ECR 레지스트리에 이미지 등록 -> 2번 Task Definition 정의 -> 4번 Service 설정

 

5. Cluster 생성

> AWS > ECS > 클러스터 > 클러스터 생성

클러스터 생성 메뉴에서는 일단 클러스터 이름만 정해주도록 하자.

나는 현재 진행중인 프로젝트 이름으로, docker-pro-wanted로 설정했다.

VPC는 웬만하면 자동으로 잡혀 있을 것이고, 사용하고 있는 VPC가 아닌 새로 VPC를 만들어야 할 경우 새 vPC 생성을 해주면 된다.

 

인프라 탭에서는 fargate 방식을 사용할 것이므로 다른 체크박스를 건드리지 말도록 하자.

그리고 생성 버튼을 눌러주면 된다.

혹시 

다음과 같은 오류가 발생하는 경우, 그냥 무시하고 다시 생성해주면 정상적으로 생성된다.

 

1. AWS ECR Repository

이제 클러스터를 생성했으니, 리포지토리를 생성하고 이미지를 업로드해보자.

>AWS ECR > 리포지토리 > 리포지토리 생성

리포지토리에서도 똑같이 이름만 적어보자. 

나는 choincnp/new-httpd로 작성했다.

이 레포지토리는 프라이빗으로 작성하였으므로, AWS IAM을 업데이트 해야 한다. 

조금 전 사진을 보면 퍼블릭 / 프라이빗 리포지토리를 설정하는 과정에서

프라이빗 리포지토리를 보면 설명에 액세스는 IAM 및 리포지토리 정책 과정에 의해 관리됩니다. 가 있다.

 

그럼 이제 이 클러스터를 관리할 수 있는 IAM을 만들고, CLI에 이 IAM을 연동시켜보자.

IAM 설정은 이 글에서 다루지 않고, 참고 링크를 남긴다.

https://jhlee-developer.tistory.com/entry/AWS-AWS-CLI-%EC%84%A4%EC%B9%98-%EB%B0%8F-V2-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8

 

[AWS] IAM 사용자 생성하는법 - 액세스 키 발급

IAM 사용자 생성 AWS 계정에 대한 액세스 키를 생성하면 AWS CLI 또는 API에 액세스할 수 있다. 서비스 메뉴에서 IAM(AWS 리소스에 대한 액세스 관리) → 사용자 탭에서 사용자 추가를 클릭한다. 사용자

jhlee-developer.tistory.com

IAM에서는 ECS를 관리하기 위해서 다음 두 정책을 연결해줘야 한다.

그래야 ECS/ECR 관련한 리소스에 접근할 수 있다.

  • AmazonECS FullAccess
  • AmazonEC2ContainerRegistryFullAccess

 

IAM을 생성하고 리포지토리 이름을 누르면 우측 상단에

'푸시 명령 보기'가 있다.

설명도 잘 써져 있으니 읽어보면 된다.

shell을 열고, 이대로만 설정하면 바로 이미지가 올라가는 것을 확인할 수 있다.

나는 MacOS에서 하지않고 Windows 환경으로 했기에 windows를 선택해서 명령어를 쳤는데 되지 않았고,

aws cli가 떠있었기 때문에 powershell을 열어서 linux용 명령어를 집어넣었더니 됐다.

혹시나 shell에서

PS C:\Windows\system32> aws --version
aws-cli/2.13.8 Python/3.11.4 Windows/10 exe/AMD64 prompt/off

aws --version을 쳤을 때 명령이 실행되지 않는다면 aws cli를 설치하면 된다.

AWS CLI를 설치하거나, ver 1에서 2로 업그레이드하는 방법에 대해서는 블로그를 첨부한다.

https://jhlee-developer.tistory.com/entry/AWS-ECS-%EC%82%AC%EC%9A%A9

 

[AWS] AWS CLI 설치, 업데이트 방법(V1 → V2)

AWS Command Line Interface (AWS CLI) AWS 서비스를 관리하는 통합 도구 여러 개의 AWS 서비스를 명령줄에서 제어하고 스크립트를 통해 자동화 가능 AWS CLI 설치 Linux $ curl "https://awscli.amazonaws.com/awscli-exe-linux-

jhlee-developer.tistory.com

 

혹시나,

Unable to locate credentials.
You can configure credential by running “aws configure”.

라는 문구가 뜨면, AWS CLI 초기 세팅을 해주면 된다.

보통 aws --configure에서 아이디와 비밀번호를 설정해주면 된다.

https://kimjingo.tistory.com/209

위의 블로그를 참고하자 :-)

 

이미지를 푸시하고, 이 화면까지 왔다면 이제 다음으로는 태스크 정의(Task Definition)을 설정하자.

 

2. Task Definition

> ECS > 태스크 정의 > 새 태스크 정의 생성

과거에 ECS를 썼던 사람이나, 새 ECS환경이 너무 복잡하다고 생각하는 사람은

좌측 상단의

새로운 ECS환경을 on/off로 해서 본인에게 편리한 설정으로 자유롭게 이동할 수 있다. 물론 옵션은 똑같고 UI의 변경만 있다.

태스크 정의 이름 / OS는 설정할 수 있지만, 태스크 역할이 비어있는 것을 볼 수있다.

IAM에서 설정을 해주자.

 

>IAM > 역할 > 역할 만들기

ECS TASK를 설정하고 넘어가자.

권한에 ECSTaskExecutionRole을 설정하고 넘어간다.

이름도 바꿔주자.

 

이제 다시 돌아와서 새로고침을 누르면 태스크 역할에 만든 role이 보인다.

 

메모리와 vCPU는 가장 작게 설정해준다.

이제, 컨테이너 추가를 해보자.

컨테이너의 이미지는 베이스로 할 이미지를 선택해야 한다. 이 이미지를 베이스로 컨테이너를 띄우겠다는 뜻.

아까 레지스트리에서 push해준 이미지의 URI를 집어넣으면 된다. 못 찾겠으면 새 창을 띄우고

> ECR > 리포지토리 > 이미지 > 상세 이미지

의 정보에서 이미지 URI를 복사해서 붙여넣기 하면 된다.

 

포트 매핑도 80, 8080, 3000 등 본인이 원하는 포트로 매핑을 하자.

다른 설정은 건드리지 않고 생성을 누르면

task-definition이 생성되었다. 이 작업 정의로 태스크만 만들수도 있고, 서비스도 만들 수 있다.

우리는 서버에서 서비스를 돌려볼 것이므로 서비스 생성을 누른다.

4. Service

시작 유형은 아까와 같이 fargate, 

이름과 작업 개수를 설정해주고, 다음을 누른다.

아까 생성했던 클러스터와 서브넷까지 설정해주고, 보안 그룹도 편집해준다.

보안그룹에서 중요한 것은

포트 매핑이 제대로 되지 않아서 나는 오류가 많으므로, 포트 매핑을 신경써서 해주자.

보통 기본적으로 잘 되어있다. 

로드 밸런서에는 다양한 로드 밸런서가 있으나, 우리는 이것저것 관리를 다 해주는 ALB를 선택할 것이다.

로드 밸런서를 만들러 가보자.

ELB(Elastic Load Balancer)

>EC2 > 로드 밸런서

아까와 같은 로드 밸런서 타입이 있는데, 우리는 ALB를 고른다.

 

아까 선택했던 VPC와 매핑까지 해주자.

이제, 대상 그룹을 지정해야 한다.

ALB는 로드 밸런서를 만들어서 그 대상에 대해 조정해야 하는데,

우리는 사실 아직 컨테이너를 띄우지 않았으므로 가짜 대상 그룹을 만들어서 넣어주고 삭제한 뒤 클린한 로드 밸런서를 만들어서 그 로드 밸런서를 ECS 서비스에서 ALB로 지정할 것이다.

콘솔의 맹점이라고도 볼 수 있지만, 일단 대상 그룹을 설정하지 않으면 진행이 불가능하므로

대상 그룹 생성을 해 준다. 대신 옵션은 그냥 아무거나 넣어준다.

> EC2 > 대상 그룹 > 대상 그룹 생성

대상 그룹 이름을 적어주고, 다음으로 넘어간다.

ip주소도 아무거나 써주고 생성한다.

그러면 이렇게 대상 그룹이 생성됨을 확인할 수 있다.

 

다시 ECS 설정으로 넘어가자.

새로고침 버튼을 누르면, 우리가 만든 ALB를 넣을 수 있다.

이제 로드 밸런서 생성 버튼을 눌러보자.

이제 파란 링크를 통해서 아까 만들어준 가짜 리스너와 타겟 그룹을 지워주자.

리스너를 지웠으면, 타겟도 지워주자.

이제 클린한 상태의 ALB를 만들었다. 이제 이 ALB를 서비스에 붙이면서, 타겟 그룹을 다시 우리 컨테이너로 연결한다.

 

다시 ECS 설정으로 되돌아가자. 이 때 즈음 나는 내가 어느 뎁스까지 기어들어간건지도 헷갈리기 시작했다.

>ECS 

이 컨테이너를 로드밸런싱 할 것이므로, 로드 밸런서에 추가 버튼을 눌러준다.

리스너 포트를 설정해주고, 다음을 누른다.

이제 거의 다 왔다.

오토스케일링에서 최소 태스크의 개수, 최대 태스크의 개수 등을 설정할 수 있다.

다음을 누르면 

서비스가 만들어지고, 

 

이제 이렇게 우리의 클러스터가 만들어졌다. 박수! :)

클러스터를 호출도 해보고, 다양한 테스트를 만들어보자.

+ Recent posts