[AWS] Elastic Container Service (ECS) 사용법 - (2) 작업 정의 및 서비스 배포

2020. 7. 10. 09:59Engineering/AWS

 

AWS Elastic Container Service (ECS)로 서비스를 배포하는 방법을 알아봅니다. 

 

* 미리 알아두면 좋은 내용

- ECS 기초 개념 <자세히 알아보기>

- ECS 사용법 (1) - Prerequisite & EC2 Launch Type 클러스터 생성 <자세히 알아보기>


 

이전글에서 ECS 클러스를 생성했습니다.

이번엔 클러스터 위에 작업(Task) 서비스라는 객체로 배포해보겠습니다.

 

 

1. 작업 정의 (Task Definition) 생성

먼저 작업 정의를 생성해야 합니다.

ECS 콘솔에서 작업 정의 메뉴를 누르고,

' 작업 정의 생성' 누릅니다.

 

 

 

시작 유형 호환성 선택에서는

작업을 배포할 클러스터 유형을 선택하면 됩니다.

저희는 EC2 클러스터를 생성했으니, 아래 것으로 선택.

 

 

다음 부터는 작업 정의의 필드값을 UI 통해 입력하는 창이 노출 됩니다.

 

 

이전글에서 말씀드렸는데, 사실 작업정의는 json 형태 파일입니다.

그래서 UI 쓰지 않고 json 형식 파일을 복사해다가 작업을 생성할 있습니다.

 

 

저희는 AWS에서 예제로 제공한 아래 작업 정의 파일사용 겁니다.

조금만 살펴보면 httpd 컨테이너 이미지를 80 포트로 노출시킨 간단한 서버 입니다.

{
    "containerDefinitions": [
        {
            "entryPoint": [
                "sh",
                "-c"
            ],
            "portMappings": [
                {
                    "hostPort": 80,
                    "protocol": "tcp",
                    "containerPort": 80
                }
            ],
            "command": [
                "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
            ],
            "cpu": 10,
            "memory": 300,
            "image": "httpd:2.4",
            "name": "simple-app"
        }
    ],
    "family": "console-sample-app-static"
}

 

 

 

그러니 UI 입력값들은 건너 뛰고 스크롤을 내려서, 'json을 통한 구성' 버튼 눌러줍니다.

 

 

그리고 위의 작업 정의 json 파일을 복사해 넣고, 저장>생성 까지 완료합니다.

 

 

 

작업 정의가 생성 되었네요.

이 작업 정의(Task Definition)는 아직 인스턴스화 된 작업(TasK) 객체가 아닙니다.

실제로 러닝중인 컨테이너가 아닌 이죠.

이 작업 정의를 실제 러닝하도록 하려면,

작업정의(Task Definition)를 작업(Task) 인스턴스화하여 관리해주는 서비스 객체를 배포해야 합니다. 

 

 

 

 

2. 서비스 배포 

서비스란 특정 작업(Task) 인스턴스가 일정 갯수를 항상 유지할 있도록 관리해주는 객체 입니다.

따라서 하나의 인스턴스에 장애가 발생해 다운되더라도, 자동으로 새로운 인스턴스를 생성해줍니다.

Kubernetes의 Replicaset과 유사 개념입니다.

 

 

서비스 객체를 만들기 위해서 ECS 콘솔로 진입합니다.

클러스터 메뉴를 선택하고, 자신의 클러스터를 눌러 상세 페이지를 조회하면.

하단에 '서비스' 메뉴 보입니다.

여기서 '생성'버튼 눌러 새로운 서비스를 만들 있습니다.

 

 

 

이제 필드값들을 본인이 원하는대로 입력하시면 됩니다.

하나씩 살펴보면서 ECS 제공하는 서비스 기능들을 확인해보겠습니다.

 

'서비스 구성' 에서 특별한 기능은 없습니다.

작업정의에 위에서 만든 작업정의를 선택하고, 클러스터에 생성해 ECS 클러스터를 선택합니다.

 

 

배포 방법 선택할 있네요.

롤링 업데이트 블루/그린 배포 2가지 옵션이 있습니다.

블루/그린 배포를 선택하고 싶었는데, 몇가지 사전 절차가 필요하네요.

우선 롤링 업데이트로 진행하겠습니다.

 

 

작업 배치 전략 여러가지를 지원하네요.

컨테이너 인스턴스와 작업(Task) 어떻게 배치하는가 대한 전략입니다.

AZ균형분산은 여러 AZ 걸쳐 작업(Task) 분산시키고, AZ내부에서는 컨테이너 인스턴스를 분산시킨다고 하네요.

다른 전략들에대한 설명은 가이드 참고하세요.

 

 

 

 

다음 단계는 네트워크 구성 관련 기능들에 대한 설정입니다.

로드밸런서와 연동 가능하네요. 작업(Task) 부하 분산을 여기서 설정한 로드밸런서가 수행하게 됩니다.

저는 로드밸런서와 연동을 안하는 경우가 궁금해서 없음으로 선택 했습니다.

 

 

 

App Mesh 라는 기능도 있고, 서비스 검색 기능 있다고 하네요.

뭔지 모르겠습니다. 일단 써보면서 익혀 보기 위해 둘다 신청 하겠습니다.

서비스 검색을 신청하니 이래저래 입력하라는 것이 많은데 default값 그대로 사용 하겠습니다.

나중에 공부해보고 따로 글로 정리하겠습니다.

 

 

 

 

마지막은 오토스케일링 기능이네요.

작업(Task) 개수를 오토스케일링 해주는 것으로 보입니다.

최소/원하는/최대 작업 개수를 입력해주었습니다.

오토스케일링이 일어나도 작업의 수가 1개미만 or 3 초과 없습니다.

 

 

 

자동으로 스케일 in/out 되는 시점을 설정하기 위한 자동 작업 조정 정책 입력해주었습니다.

저는 CPUutilization 80 넘어가면 스케일 in/out 발생하도록 설정하였습니다.

 

 

 

이제 마지막 검토 하시고, 바로 서비스 생성을 해줍니다.

여러 단계가 순차적으로 수행되고,

모든 단계가 초록색 체크 표시로 노출되며 정상 완료된 것을 있습니다.

 

 

 

 

'서비스 보기' 눌러 서비스 정보를 상세 조회 해봅시다.

작업 탭을 눌러보면 제가 입력했던 대로 2개의 작업이 실행중 것을 있습니다.

 

 

 

 

3. 서비스 동작 확인

서비스가 정상 동작하고 있는지 확인 해야겠죠?

 

작업 정의 파일에서 확인했듯이, 저희가 서비스로 배포한 작업은

Amazon ECS Sample App이라는 문구를 출력해주는 간단한 서비스 입니다.

서비스를 위한 컨테이너 포트는 80포트를 사용하고 있었죠.

 

그래서 가장 먼저 일은, 보안그룹에서 80포트를 열어주는 작업입니다.

EC2 콘솔 가서 ECS 클러스터의 보안그룹 인바운드 규칙

HTTP/HTTPS 포트 (80/443) 포트로 모든 소스IP 접근을 허가 하겠습니다.

((현 예제에서는 80포트 오픈으로 충분합니다. 저는 나중을 생각해서 443도 한번에 열어 두는 것 뿐입니다.))

 

 

 

그럼 이제 서비스에 접속할 준비가 되었습니다.

작업 객체가 실행되고 있는 EC2 인스턴스의 공인 IP를 먼저 확인하셔야 합니다.

작업 상세 조회 돌아오셔서 컨테이너인스턴스 링크 > EC2 인스턴스 링크 > 하단 설명에 IPv4퍼블릭 IP 확인합니다.

 

*저희가 로드밸런서 연동을 안했기 때문에 이런 번거로운 일을 하고 있습니다.

로드밸런서 연동을 한다면 로드밸런서 IP로 서비스가 노출 되고,

각 작업 컨테이너로 부하 분산이 자동으로 수행됩니다.

따라서 이때, 저희는 로드밸런서 IP만 확인하면 되죠.

그런데 로드밸런서를 연동하지 않은 상태에서 서비스가 노출되는 IP는 각 작업 컨테이너가 실행중인 EC2 인스턴스의 IP입니다. 

그래서 작업 컨테이너가 실행되고 있는 EC2 인스턴스가 어딘지 확인하고, 그 인스턴스 IP까지 확인하는 번거로운 작업이 필요하죠.

 

 

 

 

 

 

확인하셨으면!!

웹브라우저를 통해 {EC2 인스턴스 퍼블릭 IP}:80 으로 접속합니다.

아래와 같은 화면이 나오면 정상동작 확인 !

축하합니다 ! ECS 통해 Sample App 배포하기를 완료하셨습니다!