본문 바로가기
Infra, Cloud/AWS

[AWS] ECS 사용하기 (2) - ECS 생성하여 배포하기 (with. EC2)

by J4J 2022. 11. 9.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 ECS 사용하기 두 번째인 ECS 생성하여 배포하는 방법에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

이전 글

 

[AWS] ECS 사용하기 (1) - GitLab으로 ECR에 이미지 push하기

 

 

 

ECS란?

 

ECS는 Elastic Container Service의 약어로 AWS에서 제공하는 완전 관리형 컨테이너 오케스트레이션 서비스입니다.

 

ECS는 컨테이너화된 서비스를 간편하게 배포 및 관리할 수 있도록 도와주기 때문에 ECS를 사용한다면 단순하게 EC2 인스턴스를 각각 생성해서 사용하는 것보다 더 효율적으로 서버 관리를 할 수 있습니다.

 

 

 

ECS를 사용할 땐 다음과 같이 크게 2가지로 구분하여 사용할 수 있습니다.

 

  • EC2 인스턴스
  • Fargate

 

 

 

EC2 인스턴스는 다들 아실 거라고 생각되기에 따로 설명하지 않겠습니다.

 

Fargate는 서버리스로써 활용되기 때문에 EC2를 사용하는 것처럼 부가적인 인스턴스 관리가 필요 없이 사용될 수 있으며 사용되는 만큼 금액을 지불하고, 모든 서버 관리를 AWS에서 해줍니다.

 

 

 

이번 글에서는 EC2 인스턴스를 이용하여 ECS 사용 환경을 구축할 예정이기에, 나중에 기회가 된다면 Fargate를 이용해서 ECS 사용 환경도 구축해보겠습니다.

 

 

 

ECS 사용 방법 (1) - ALB 생성

 

ECS를 사용하기 위해서는 로드 밸런서가 필요합니다.

 

다음의 절차를 통해 ECS에 사용할 ALB를 생성해보겠습니다.

 

 

 

[ 1. VPC 접속 ]

 

VPC 접속

 

 

 

[ 2. ALB 보안그룹 생성 ]

 

좌측 메뉴에서 보안 그룹을 선택한 뒤 우측에 있는 보안 그룹 생성 버튼을 클릭해줍니다.

 

ALB 보안그룹 생성

 

 

 

[ 3. ALB 보안그룹 설정 ]

 

보안 그룹 이름, 설명, VPC를 순서대로 원하는 값을 입력 및 선택해줍니다.

 

그리고 인바운드 규칙을 하나 추가한 뒤 포트 범위는 80, 소스는 Anywhere로 선택하여 80 포트를 어디서든 접근 가능하도록 설정합니다.

 

모든 설정이 완료되었다면 아래에 있는 보안 그룹 생성 버튼을 클릭해줍니다.

 

ALB 보안그룹 설정

 

 

 

[ 4. 로드 밸런서 접속 ]

 

로드 밸런서 접속

 

 

 

[ 5. 로드 밸런서 생성 ]

 

상단에 있는 로드 밸런서 생성 버튼을 클릭해줍니다.

 

로드 밸런서 생성

 

 

 

[ 6. 로드 밸런서 정보 입력 - 밸런서 타입 선택 ]

 

로드 밸런서 타입은 ALB로 선택해서 Create를 눌러줍니다.

 

로드 밸런서 정보 입력 - 밸런서 타입 선택

 

 

 

[ 7. 로드 밸런서 정보 입력 - 기본 설정 ]

 

기본 설정에서는 로드 밸런서 이름을 입력해주시고 스킴은 Internet-facing, IP주소 유형은 IPv4로 선택해줍니다.

 

로드 밸런서 정보 입력 - 기본 설정

 

 

 

[ 8. 로드 밸런서 정보 입력 - 네트워크 설정 ]

 

네트워크 설정에서는 사용할 VPC를 선택해줍니다.

 

그리고 Mappings에서는 사용할 AZ를 선택해주고 AZ에 속하는 사용할 Subnet까지 선택해주시면 됩니다.

 

로드 밸런서 정보 입력 - 네트워크 설정

 

 

 

[ 9. 로드 밸런서 정보 입력 - 보안 그룹 설정 ]

 

보안 그룹 설정에서는 위에서 생성한 보안 그룹을 선택해줍니다.

 

로드 밸런서 정보 입력 - 보안 그룹 설정

 

 

 

[ 10. 로드 밸런서 정보 입력 - 타겟 그룹 등록 ]

 

리스너 설정을 하기에 앞서 리스너 설정에 있는 Create target group를 먼저 클릭해줍니다.

 

Create target group

 

 

 

타겟 그룹의 기본 설정은 다음과 같이 유형으로는 Instances, 타겟 그룹 명 입력, 사용할 VPC를 선택해주고 프로토콜, 포트, 프로토콜 버전은 기본 값을 유지해줍니다.

 

타겟 그룹 기본 설정

 

 

 

그리고 Health checks는 다음과 같이 기본 값을 유지한 뒤 Next 버튼을 클릭합니다.

 

Health checks 설정

 

 

 

그러면 타겟을 등록하는 화면이 나오는데 이 부분은 ECS에서 자동으로 설정해주기 때문에 따로 설정 없이 아래에 있는 Create target group을 클릭해줍니다.

 

타겟 등록

 

 

 

[ 11. 로드 밸런서 정보 입력 - 리스너 설정 ]

 

타겟 그룹을 생성했다면 다음과 같이 새로 고침 버튼을 클릭한 뒤 위에서 생성한 타겟 그룹을 등록해줍니다.

 

로드 밸런서 정보 입력 - 리스너 설정

 

 

 

다른 설정 값은 필요하시면 추가 설정을 해주시고, 모든 설정이 완료되었다면 아래에 있는 Create load balancer를 클릭하여 ALB를 생성해줍니다.

 

 

반응형

 

 

ECS 사용 방법 (2) - ECS Cluster 생성하기

 

[ 1. VPC 접속 ]

 

VPC 접속

 

 

 

[ 2. ECS EC2 인스턴스 보안그룹 생성 ]

 

좌측 메뉴에서 보안 그룹을 선택한 뒤 우측에 있는 보안 그룹 생성 버튼을 클릭해줍니다.

 

ECS EC2 인스턴스 보안그룹 생성

 

 

 

[ 3. ECS EC2 인스턴스 보안그룹 설정 ]

 

보안 그룹 이름, 설명, VPC를 순서대로 원하는 값을 입력 및 선택해줍니다.

 

그리고 인바운드 규칙을 하나 추가한 뒤 유형은 모든 TCP, 소스는 ALB에 적용된 보안 그룹을 선택해줍니다.

 

모든 설정이 완료되었다면 아래에 있는 보안 그룹 생성 버튼을 클릭해줍니다.

 

ECS EC2 인스턴스 보안그룹 설정

 

 

 

[ 4. IAM 접속 ]

 

IAM 접속

 

 

 

[ 5. ECS EC2 인스턴스 역할 만들기 ]

 

좌측 메뉴에서 역할을 선택한 뒤 우측에 있는 역할 만들기를 클릭해줍니다.

 

ECS EC2 인스턴스 역할 만들기

 

 

 

[ 6. ECS EC2 인스턴스 역할 정보 입력 - 엔터티 설정 ]

 

엔터티 설정에서는 엔터티 유형으로 AWS 서비스, 사용 사례는 EC2를 선택해줍니다.

 

선택이 완료되었다면 다음을 클릭해줍니다.

 

ECS EC2 인스턴스 역할 정보 입력 - 엔터티 설정

 

 

 

[ 7. ECS EC2 인스턴스 역할 정보 입력 - 권한 설정 ]

 

권한 설정에서는 총 3개의 권한을 추가해줍니다.

 

권한 추가가 완료되면 다음을 클릭해줍니다.

 

  • 인스턴스 작업을 위한 AmazonEC2ContainerServiceforEC2Role (필수)
  • 오토스케일을 위한 AmazonEC2ContainerServiceAutoscaleRole (선택)
  • cloud watch log 기록을 위한 CloudWatchLogsFullAccess (선택)

 

 

AmazonEC2ContainerServiceforEC2Role

 

AmazonEC2ContainerServiceAutoscaleRole

 

CloudWatchLogsFullAccess

 

 

 

[ 8. ECS EC2 인스턴스 역할 정보 입력 - 세부 정보 설정 ]

 

세부 정보 설정에서는 역할 이름과 설명을 입력해줍니다.

 

모든 입력이 완료되었다면 아래에 있는 역할 생성을 클릭해줍니다.

 

ECS EC2 인스턴스 역할 정보 입력 - 세부 정보 설정

 

 

 

[ 9. ECS 접속 ]

 

ECS 접속

 

 

 

[ 10. 클러스터 생성 ]

 

좌측에 있는 클러스터 메뉴를 선택한 뒤 클러스터 생성 버튼을 클릭해줍니다.

 

클러스터 생성

 

 

 

[ 11. 클러스터 정보 입력 - 템플릿 설정 ]

 

템플릿 설정에서는 EC2 Linux + 네트워킹을 선택해줍니다.

 

선택이 완료되었다면 다음 단계를 클릭해줍니다.

 

클러스터 정보 입력 - 템플릿 설정

 

 

 

[ 12. 클러스터 정보 입력 - 인스턴스 설정 ]

 

인스턴스 설정에서는 클러스터 이름을 입력한 뒤 ECS에서 사용될 EC2 인스턴스에 대한 정보들을 기입해줍니다.

 

사용하고자 하는 EC2 인스턴스의 스펙 값에 맞게 설정해주시면 됩니다.

 

클러스터 정보 입력 - 인스턴스 설정

 

 

 

[ 13. 클러스터 정보 입력 - 네트워킹 설정 ]

 

네트워킹 설정에서는 사용하고자 하는 VPC, 서브넷을 선택하고 EC2에서의 퍼블릭 IP는 필요 없기 때문에 IP 자동 할당은 비활성을 선택합니다.

 

그리고 보안 그룹은 위에서 생성한 ECS EC2 인스턴스 보안 그룹을 선택해줍니다.

 

클러스터 정보 입력 - 네트워킹 설정

 

 

 

[ 14. 클러스터 정보 입력 - IAM 역할 설정 ]

 

IAM 역할 설정에서는 위에서 생성한 ECS EC2 인스턴스 역할을 선택해줍니다.

 

클러스터 정보 입력 - IAM 역할 설정

 

 

 

모든 설정이 완료되었다면 아래에 있는 생성 버튼을 클릭하여 ECS Cluster를 생성해줍니다.

 

 

 

ECS 사용 방법 (3) - Task 정의

 

ECS에서 Task는 Docker 컨테이너 설정을 위해 사용됩니다.

 

어떤 Docker 이미지를 가지고 Docker 컨테이너를 생성하는지를 Task에서 정의할 수 있고, 하나의 Task에 여러 개의 Docker 컨테이너 설정을 해줄 수 있습니다.

 

다음 절차를 통해 Task를 정의해보겠습니다.

 

 

 

[ 1. ECS 접속 ]

 

ECS 접속

 

 

 

[ 2. 작업 정의 생성 ]

 

좌측 메뉴에서 작업 정의를 선택한 뒤 새 작업 정의 생성 버튼을 클릭해줍니다.

 

작업 정의 생성

 

 

 

[ 3. 작업 정의 입력 - 호환성 선택 ]

 

호환성 선택에서는 EC2를 선택해줍니다.

 

선택이 완료되면 다음 단계를 클릭해줍니다.

 

작업 정의 입력 - 호환성 선택

 

 

 

[ 4. 작업 정의 입력 - 기본 설정 ]

 

기본 설정에서는 태스트 정의 이름을 입력하고, 네트워크 모드를 브리지로 선택해줍니다.

 

작업 정의 입력 - 기본 설정

 

 

 

[ 5. 작업 정의 입력 - IAM 역할과 작업 크기 ]

 

IAM 역할은 AWS에서 자동 생성하도록 해줍니다.

 

작업 크기는 어떻게 설정하냐에 추후 에러가 발생될 수 있습니다.

 

이 부분에 대한 자세한 사항은 아래에서 추가 설명할 예정이니 지금은 서버의 최대 크기보다 여유롭게 메모리와 CPU 설정을 해주시면 됩니다. (적어도 컨테이너가 실행될 메모리와 CPU는 필요합니다.)

 

작업 정의 입력 - IAM 역할과 작업 크기

 

 

 

[ 6. 작업 정의 입력 - 컨테이너 설정 ]

 

컨테이너 설정에서는 컨테이너 추가 버튼을 클릭해줍니다.

 

컨테이너 추가

 

 

 

그리고 표준에서 사용할 컨테이너 이름과 도커 이미지 URI, 포트 매핑을 입력해줍니다.

 

이미지 같은 경우 ECR이나 Docker Hub 등을 활용하면 되는데 저는 [AWS] ECS 사용하기 (1) - GitLab으로 ECR에 이미지 push하기에서 만들어 둔 ECR URI를 등록했습니다.

 

포트 매핑에서는 호스트 포트를 0으로 해야 ECS에서 자동으로 ALB의 타겟 그룹 포트를 설정해줍니다.

 

컨테이너 포트는 등록한 이미지가 nginx 동작되는 이미지이기 때문에 80 포트로 등록해줬습니다.

 

컨테이너 표준 설정

 

 

 

다음으로는 위에서 생성한 역할에 cloud watch logs를 위한 권한을 추가했다면 스토리지 및 로깅에서 로그 구성을 선택해줍니다.

 

로그 구성 설정

 

 

 

설정이 모두 완료되었다면 아래에 있는 추가 버튼을 클릭하여 컨테이너 추가를 완료해줍니다.

 

컨테이너까지 추가가 완료되고 나머지 추가 설정이 필요 없다면 아래에 있는 생성 버튼을 클릭하여 최종적으로 Task 정의를 생성해줍니다.

 

 

728x90

 

 

ECS 사용 방법 (4) - 서비스 생성

 

ECS에서 서비스는 ECS Cluster에서 지정된 수만큼의 Task를 등록하여 EC2 인스턴스 내부에 컨테이너가 생성 및 동작, 관리될 수 있도록 도와줍니다.

 

다음 절차를 통해 서비스를 생성해보겠습니다.

 

 

 

[ 1. ECS 접속 ]

 

ECS 접속

 

 

 

[ 2. 서비스 생성 ]

 

위에서 생성한 ECS Cluster를 클릭한 뒤 서비스 탭에 있는 생성 버튼을 클릭해줍니다.

 

서비스 생성

 

 

 

[ 3. 서비스 정보 입력 - 서비스 구성과 배포 설정 ]

 

먼저 서비스 구성은 다음과 같이 해줍니다.

 

시작 유형은 EC2, 작업 정의는 위에서 생성한 Task 정의 선택, 서비스 이름은 자유롭게 기입해줍니다.

 

서비스 유형은 REPLICA와 DAEMON이 있는데 각각 다음과 같은 역할을 수행합니다.

 

  • REPLICA → 클러스터에 속하는 EC2 인스턴스 내부에 작업 개수만큼 Task 정의에 속하는 컨테이너를 모두 생성
  • DAEMON → 인스턴스 별 컨테이너에 Task 정의에 속하는 컨테이너를 하나씩만 생성

 

 

 

작업 개수는 클러스터 내에 만들어질 Task 정의 개수입니다.

 

최소 정상 상태 백분율과 최대 백분율은 아래에 있는 배포 유형과 연계됩니다.

 

먼저 배포 유형에 있는 롤링 업데이트는 새로운 배포가 이루어질 때 기존에 Task 정의된 컨테이너들을 유지한 상태로 새로운 컨테이너들을 생성하는 배포 방식입니다.

 

또한 새로운 컨테이너들이 모두 배포가 완료되면 기존 컨테이너들을 자동으로 종료시켜줍니다.

 

즉, 새롭게 배포하는 경우 새로운 컨테이너들이 모두 생성되기 전까지 기존 컨테이너를 유지시켜주기 때문에 사용자 입장에서 배포에 의해 서비스 사용이 불가해지는 상황을 해결해줍니다.

 

결국 롤링 업데이트를 하게 된다면 몇 개의 컨테이너들을 유지할지에 대한 설정이 필요한데 그럴 때 사용되는 게 최소 정상 상태 백분율과 최대 백분율입니다.

 

 

 

최소 정상 상태 백분율은 서비스되는 컨테이너의 최솟값을 위한 설정으로 작업 개수 x 최소 정상 상태 백분율의 값을 최솟값으로 가지며 소수 값은 반올림이 됩니다.

 

예를 들어 작업 개수가 3개고 최소 정상 상태 백분율이 95이면 3 x 95% = 2.85 값이어서 최소 3개의 컨테이너를 유지시켜줍니다.

 

 

 

최대 백분율은 서비스되는 컨테이너의 최댓값을 위한 설정으로 작업 개수 x 최대 백분율의 값을 최댓값으로 가지며 소수 값은 반내림이 됩니다.

 

예를 들어 작업 개수가 3개고 최대 백분율이 140이면 3 x 140% = 4.2 값이어서 최대 4개의 컨테이너를 유지시켜 줍니다.

 

 

 

결국 위의 설정대로라면 최소 3개, 최대 4개의 컨테이너를 유지하기 때문에 새롭게 배포가 이루어질 때 다음과 같은 동작이 이루어지며 배포됩니다.

 

  • 새로운 컨테이너 1개 생성
  • 기존 컨테이너 1개 제거
  • 새로운 컨테이너 1개 생성
  • 기존 컨테이너 1개 제거
  • 새로운 컨테이너 1개 생성
  • 기존 컨테이너 1개 제거

 

 

 

그리고 이런 배포 방식 때문에 Task 정의할 때 메모리와 CPU 설정을 주의 깊게 해야 됩니다.

 

만약 최대 작업 개수가 ECS에 할당된 인스턴스들이 감당할 수 없는 만큼 설정된다면 배포가 정상적으로 이루어지지 않습니다.

 

그러므로 배포 방식이 무엇인지와 설정 값에 따라 Task 정의를 유동적으로 설정해줘야 합니다.

 

서비스 정보 입력 - 서비스 구성 설정

 

서비스 정보 입력 - 배포 설정

 

 

 

[ 4. 서비스 정보 입력 - 작업 배치 설정 ]

 

작업 배치 설정은 자유롭게 설정해주시면 됩니다.

 

참고로 제가 선택한 AZ 균형 분산은 AZ별로 분포되어 있는 ECS EC2 인스턴스들에 균형 있게 분산하여 Docker 컨테이너가 생성될 수 있도록 도와줍니다.

 

설정이 모두 완료되었다면 다음 단계를 클릭해줍니다.

 

서비스 정보 입력 - 작업 배치 설정

 

 

 

[ 5. 서비스 정보 입력 - 로드 밸런싱 설정 ]

 

로드 밸런싱 설정에서는 위에서 생성한 로드 밸런서를 등록해줍니다.

 

유형은 ALB, IAM 역할은 자동 생성되는 AWSServiceRoleForECS, 로드 밸런서 이름은 위에서 생성한 로드 밸런서를 선택해줍니다.

 

서비스 정보 입력 - 로드 밸런싱 설정

 

 

 

[ 6. 서비스 정보 입력 - 로드 밸런싱할 컨테이너 설정 ]

 

로드 밸런싱할 컨테이너 설정에서는 Task 정의에 추가했던 컨테이너들이 다음과 같이 보입니다.

 

여기서 로드 밸런서에 추가 버튼을 클릭해주시면 됩니다.

 

로드 밸런서에 컨테이너 추가

 

 

 

다음으로 여러 가지 정보를 입력해야 되는 상황이 만들어지는데 이때는 대상 그룹 이름에 위에서 만든 타겟 그룹을 선택해주면 자동으로 값들이 매핑됩니다.

 

모든 정보 기입이 완료되었다면 다음 단계 버튼을 클릭해줍니다.

 

타겟 그룹 추가

 

 

 

[ 7. 서비스 정보 입력 - 오토스케일링 설정 ]

 

오토스케일링 설정에서는 오토스케일링이 필요할 경우 추가 설정해주면 됩니다.

 

필요하신 분은 위에서 ecs-ec2-instance-role에 오토스케일 권한까지 추가가 되었기 때문에 추가 설정하는데 문제가 없을 것입니다.

 

다만 저는 스킵하도록 하겠습니다.

 

정보 기입이 완료되면 다음 단계를 클릭해주고 최종적으로 서비스 생성을 해주시면 됩니다.

 

서비스 정보 입력 - 오토스케일링 설정

 

 

 

ECS 사용 방법 (5) - EC2 인스턴스에 EIP 할당

 

위의 설정이 모두 완료되면 서비스의 이벤트 탭에 다음과 같이 로그가 찍히는 걸 확인할 수 있습니다.

 

서비스 이벤트 로그

 

 

 

하지만 메시지를 보면 클러스터 내부에 인스턴스가 없다고 나옵니다.

 

즉, ECS Cluster를 생성할 때 인스턴스가 다음과 같이 생성되었지만 Cluster는 해당 인스턴스를 아직 인지하지 못하고 있는 상황입니다.

 

ECS EC2 인스턴스 생성 확인

 

 

 

이럴 때는 [AWS] EC2 고정 IP 사용하기를 참고하여 ECS EC2 인스턴스에 IP를 할당해줍니다.

 

IP를 할당하고 나면 다음과 같이 ECS Cluster에서 인스턴스를 인지하기 시작합니다.

 

ECS 인스턴스 동작 확인

 

 

 

또한 위에서 확인했던 서비스 로그도 다음과 같이 배포가 완료되었다는 기록이 남아있습니다.

 

서비스 이벤트 로그

 

 

 

테스트

 

모든 작업이 완료되었다면 배포가 정상적으로 되었는지 테스트해보겠습니다.

 

Route53을 이용하여 도메인을 통해 확인해볼 수도 있지만 ALB DNS 이름을 통해서도 간단하게 확인이 가능합니다.

 

ALB 목록으로 가서 사용하고 있는 ALB를 클릭하면 다음과 같이 DNS 이름이 확인됩니다.

 

ALB DNS 확인

 

 

 

DNS 이름을 복사하여 브라우저에 입력해보면 다음과 같이 배포가 정상적으로 이루어진 것을 확인할 수 있습니다.

 

배포 확인

 

 

 

번외 (1) - 타겟 그룹 타겟 자동 매핑

 

위에서 타겟 그룹을 생성할 때 타겟을 따로 등록해주지 않았었습니다.

 

만약 ECS 설정이 정상적으로 되었고 배포까지 성공했다면 다음과 같이 타겟이 자동으로 매핑되어 있는 것을 확인할 수 있습니다.

 

타겟 자동 매핑 확인

 

 

 

번외 (2) - 로그 그룹 생성

 

위의 Task 정의에서 컨테이너를 등록할 때 로그 구성을 선택했다면 다음과 같이 cloud watch 로그 그룹이 생성된 것을 확인할 수 있습니다.

 

로그 그룹 생성

 

 

 

 

 

 

 

 

이상으로 ECS 사용하기 두 번째인 ECS 생성하여 배포하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글