Docker 기반 CI·CD 파이프라인 구축

CI/CD - GitLab으로 AWS Cloud로의 지속적인 배포 (CD) - (2) / ECS로 Docker Application 배포 (Manually) /

wy-family 2024. 12. 7. 22:04

일단, AWS ECS로 가보자.

 

클러스터를 만들어야 한다.

일단은 AWS Fargate (serverless) 로 만든다

 

 

이제 컨테이너를 실행하기 위해서는 task definition 이 필요하다.

왼쪽 바에 보면 정의할 수 있는 버튼이 있다.

새로운 task definition을 생성해야 한다.

그런데, task role 을 선택할 때 ecsTaskExecutionRole 을 선택해야 하는데 나오지 않는다. 뭐지?

 


AWS ECS에서 ecsTaskExecutionRole을 선택할 수 없는 경우는 보통 해당 역할이 AWS 계정에 아직 생성되지 않았거나, 필요한 권한이 제대로 설정되지 않았기 때문입니다. 아래는 이 문제를 해결하는 단계별 가이드입니다.


1. ecsTaskExecutionRole이 무엇인가요?

  • ecsTaskExecutionRole은 ECS에서 작업(Task)을 실행할 때 필요한 IAM 역할입니다.
  • 주요 역할:
    • 컨테이너가 Amazon ECR에서 이미지를 가져올 수 있도록 권한 부여.
    • CloudWatch Logs로 컨테이너 로그를 전송할 수 있도록 권한 부여.

2. 왜 ecsTaskExecutionRole이 보이지 않나요?

  1. 역할이 생성되지 않음
    • ecsTaskExecutionRole은 기본적으로 AWS CLI, 콘솔, 또는 CloudFormation을 통해 ECS를 처음 설정할 때 자동 생성됩니다.
    • 하지만 경우에 따라 자동으로 생성되지 않을 수 있습니다.
  2. IAM 권한 문제
    • 현재 사용 중인 AWS 계정/사용자에게 IAM 역할을 볼 권한이 없을 수 있습니다.
  3. 리전 문제
    • IAM 역할은 리전과 무관하게 글로벌 리소스이지만, 작업 중인 리전과의 연결이 잘못되었을 가능성도 있습니다.

3. 해결 방법

1. ecsTaskExecutionRole 확인

먼저 ecsTaskExecutionRole이 이미 생성되어 있는지 확인하세요.

  1. AWS Management Console:
    • AWS 콘솔에서 IAM Roles 페이지로 이동.
    • 역할 이름 중 ecsTaskExecutionRole이 존재하는지 검색.

역할 명단에 없다. 그렇다면 만들던지 어떻게든 해야 한다.


2. 역할 생성 - AWS Management Console로 생성

  1. IAM 콘솔로 이동:
  2. 신뢰 엔터티 설정:
    • Trusted entity를 ECS로 선택.
    • 서비스 이름: ecs-tasks.amazonaws.com.
  3. 정책 연결:
    • AmazonECSTaskExecutionRolePolicy 정책을 연결.
  4. 역할 이름 지정:
    • 역할 이름: ecsTaskExecutionRole.
  5. 생성 완료:
    • 역할을 생성한 후 ECS Task Definition에서 선택할 수 있습니다.

4. 정리

  1. ecsTaskExecutionRole이 보이지 않으면 먼저 IAM 콘솔에서 역할이 존재하는지 확인.
  2. 존재하지 않는다면 콘솔을 사용해 역할을 생성.
  3. 역할 생성 후에도 보이지 않으면? 그건 또 다른 문제..

이 단계를 완료하면 ECS Task Definition에서 ecsTaskExecutionRole을 정상적으로 선택할 수 있을 것입니다.


 

use case 에서, elastic container service task 를 선택해야 할 것 같다.

그러고 나면

정책 연결에서 찾을 수 있다. AmazonECSTaskExecutionRolePolicy

만들어졌다.

이제 선택할 수 있는지 확인해보자.

옵션이 추가되었다.

해결했다. 가보자.

 

클러스터도 만들었고, 테스크 정의서도 생성했다.

이제 클러스터 안에 서비스를 하나 만들게 될것이다.

그 서비스가 어플리케이션, 즉 컨테이너를 실행할 것이다.

그 컨테이너는 테스크 정의서의 사양을 이용해서 실행을 하게 된다.

 

아까 만들었던 클러스터에 들어가보면 서비스를 만들 수 있는 공간을 확인할 수 있다.

 

서비스 만드는 과정은, 굉장히 상세하게 하나 하나씩 뭔가를 선택을 해야 했는데, 각각의 선택의 이유를 모두 다 알고 넘어가고 싶지만, 지금은 일단 하라는대로 하고 넘어가보자.

분명 다시 공부할 기회가 올 것이라 생각한다.

 

저기 보면, (Application Load Balancer) sparta-app-alb 라는 부분이 보일 것이다.

ALB, 이거는 EC2 서비스에서 확인할 수 있다.

 

로드밸런서 활성화된걸 확인할 수 있고, 클릭해서 설정 정보를 보자.

보면 Listeners and rules 라는 곳이 있다.

아까 cluster 내에서 service를 만들때, 자세하게 보여주진 않았지만,

만들때 listener 설정하는 게 있었다.

80번 포트로 클라이언트 연결을 받기 위한 리스너 설정을 했었다.

80번 포트로 들어온 연결은, sparta-app-tg 이라는 이름의 타겟 그룹으로 보내라는 뜻.

(forward to target group이라고 하는데, service 만들때 마찬가지로 target group도 설정했었다.)

 

타겟 그룹을 클릭해보면,

 

등록된 타겟들 2개가 보일 것이다. 2개의 컨테이너가 등록되어 있는 것이다.

이것도 service를 만들때 설정했었던 것들.

 

자, 이제 연결 테스트를 해보자.

load balancer에서 DNS name 을 이용할 것이다.

 

curl sparta-app-alb-1144140955.ap-northeast-2.elb.amazonaws.com

라고 해볼 것이다.

 

이렇게 해서 매뉴얼하게 컨테이너를 배포하는 걸 확인해봤다.

이제 이 과정을 자동화하면 된다. (다음 게시글에서)

 


계속 나아가기 전에, 추가로 잠깐 공부하고 넘어가고 싶은게 있어서 기록하고 가겠다.


Fargate란 무엇인가?

AWS Fargate는 Amazon ECS와 Amazon EKS에서 제공하는 서버리스 컴퓨팅 엔진으로, 컨테이너를 실행하기 위해 서버(EC2 인스턴스)를 직접 관리할 필요가 없는 방식입니다. 사용자는 클러스터를 구성하고 EC2 인스턴스를 관리하는 대신, 필요한 리소스를 정의하고 AWS가 자동으로 해당 컨테이너를 실행, 관리합니다.


Fargate의 특징

  1. 서버리스 방식
    • Fargate는 EC2 인스턴스 관리를 완전히 제거합니다.
    • 사용자는 컨테이너의 CPU 및 메모리 요구 사항만 정의하고, AWS가 필요한 리소스를 자동으로 프로비저닝합니다.
  2. 컨테이너 중심 아키텍처
    • 애플리케이션에 필요한 컨테이너 단위로만 작업을 정의합니다.
    • 이를 통해 세부적인 인프라 설정 없이 컨테이너 실행이 가능합니다.
  3. 정확한 과금
    • 사용한 만큼만 비용을 지불합니다.
    • Task의 CPU와 메모리 사용량에 따라 과금되며, EC2 인스턴스의 지속적인 비용 부담이 없습니다.
  4. 확장성
    • Fargate는 트래픽 변화에 따라 컨테이너를 자동으로 확장/축소합니다.
  5. 보안 강화
    • Fargate는 각 Task를 자체적으로 격리된 환경에서 실행하므로 보안성이 향상됩니다.
    • 각 컨테이너는 개별 VPC 네트워크 인터페이스를 가질 수 있습니다.

Fargate와 EC2의 차이점

     
특징 Fargate EC2
서버 관리 서버리스 (AWS가 관리) 사용자가 직접 EC2 인스턴스를 관리
사용 사례 간단한 애플리케이션, 빠른 배포 세부적인 제어가 필요한 대규모 시스템
비용 구조 Task 단위로 사용한 만큼 과금 EC2 인스턴스는 실행 중인 시간 동안 과금
확장성 완전 자동화 사용자가 확장 설정 및 관리를 직접 수행
네트워크 및 보안 컨테이너 단위로 격리 및 관리 EC2 인스턴스 레벨에서 보안 관리 필요

Fargate의 동작 방식

  1. Task Definition 작성
    • Fargate에서 실행할 작업(Task)에 대한 정의를 작성합니다.
    • 컨테이너 이미지, CPU/메모리 리소스, 네트워크 설정 등을 지정합니다.
  2. ECS 클러스터에서 실행
    • Fargate를 실행 방식으로 선택하고, ECS가 Task를 실행합니다.
    • AWS가 필요한 리소스를 자동으로 할당하고 관리합니다.
  3. 컨테이너 실행 및 관리
    • Fargate는 작업을 실행하고, 트래픽 변화에 따라 자동으로 확장/축소합니다.
  4. 종료 후 비용 정산
    • 컨테이너가 실행되는 동안만 비용이 발생하며, 종료되면 과금이 중지됩니다.

Fargate를 사용할 때 적합한 시나리오

  1. 빠른 시작과 간편한 관리
    • 서버 관리를 신경 쓰지 않고 빠르게 컨테이너를 실행해야 할 때.
    • 예: 개발 환경, 프로토타이핑.
  2. 비정기적인 워크로드
    • 항상 실행되지 않고, 간헐적으로 트래픽이 발생하는 작업.
    • 예: 정기적인 데이터 처리 작업, 이벤트 기반 애플리케이션.
  3. 자동 확장 필요
    • 수요에 따라 작업(Task) 수를 자동으로 조정해야 할 때.
    • 예: 실시간 데이터 스트리밍, API 서버.
  4. 복잡한 배포를 피하고 싶을 때
    • EC2 클러스터를 관리하고 설정할 필요 없이 컨테이너 중심의 작업에만 집중하고 싶을 때.

Fargate 사용의 한계

  • 비용: 장기적으로 계속 실행되는 작업에는 EC2 인스턴스를 사용하는 것이 비용적으로 유리할 수 있습니다.
  • 제한된 제어: EC2 기반의 ECS 클러스터에 비해 네트워크 및 호스트 구성의 세부 제어가 제한됩니다.
  • 지원 리소스 제한: CPU 및 메모리 리소스가 고정된 선택지로 제한됩니다(현재 최대 4 vCPU, 30GB RAM).

Fargate를 사용하는 방법

  1. ECS 클러스터 생성:
    • AWS ECS 콘솔 또는 CLI를 사용하여 클러스터를 생성합니다.
    • 클러스터 생성 시 Fargate를 선택합니다.
  2. Task Definition 작성:
    • 컨테이너 이미지(ECR 또는 Docker Hub), 리소스 요구 사항, 네트워크 설정 등을 포함한 Task Definition을 작성합니다.
  3. 서비스(Service) 또는 작업(Task) 실행:
    • 서비스로 배포하거나 단일 Task로 실행합니다.

요약

AWS Fargate는 서버리스 방식으로 컨테이너를 실행하는 데 적합한 강력한 도구입니다. 서버 관리를 완전히 AWS에 맡길 수 있어 운영 부담을 줄이고, 애플리케이션 개발에 집중할 수 있도록 지원합니다.
Fargate는 간편한 배포, 자동 확장, 보안 강화 등 많은 이점을 제공하지만, 장시간 실행되는 작업이나 세부적인 제어가 필요한 경우에는 EC2 기반 ECS 클러스터가 더 적합할 수 있습니다.