2024.12.10 AWS ECS

장재영·2024년 12월 10일

클러스터 생성

  1. AWS Fargate(서버리스)
  • 인프라 관리를 해주는 aws 서비스
  • 대신 돈이듬
  1. Amazon EC2 인스턴스
  • 직접 관리를 해줘야함
  • 대신 조금 더 쌈
  1. Auto Scaling
  • 트래픽 변화에 따라 EC2 인스턴스를 자동으로 추가하거나 제거

  • 이하 내용들은 오토 스케일링 기능으로 생성될 인스턴스를 선택하는 작업

    • 프로 비저닝

      • 온디맨드: 시간당 고정 요금, 특이성 없음 <= 선택
      • 스팟: 시간당 온디맨드에 비해 저렴, 사용자 의지와 상관없이 중단될 가능성 있음
    • 컨테이너 인스턴스 AMI (Amazon Machine Image)
      => 컨테이너를 실행할 EC2 인스턴스의 운영체제와 기본 설정이 포함된 이미지

    • EC2 인스턴스 유형
      => EC2 인스턴스의 하드웨어 사양

    • 원하는 용량
      => ECS 클러스터에 실행할 EC2 인스턴스의 최소 및 최대 개수를 설정

      • 최소: 클러스터에서 항상 실행해야 하는 EC2 인스턴스의 개수
      • 최대: 필요할 때 Auto Scaling을 통해 확장할 수 있는 최대 인스턴스 개수
    • SSH 키 페어
      => EC2 인스턴스에 SSH로 접속할 때 사용하는 인증 키

    • 루트 EBS 볼륨 크기
      => EC2 인스턴스의 루트 볼륨(운영체제 설치 공간) 크기를 설정

  1. 항상성 관찰성을 갖춘 Container Insights
  • 컨테이너 수준에서 CPU, 메모리, 네트워크 성능 데이터를 지속적으로 수집
  • 수집되는 데이터양에 따라 추가 비용
  1. Container Insights
  • 클러스터 수준에서 데이터를 수집
  • 컨테이너 작업(Task) 수준의 세부 데이터는 제공하지 않음
  • 수집되는 데이터양에 따라 추가 비용
  1. 끄기
  • CloudWatch Container Insights를 사용하지 않음.
  • 추가비용 없음

작업 정의(Task Definition) 생성

  • ECS에서 실행할 컨테이너를 정의

  • 운영 체제/아키텍처: 컨테이너를 실행할 EC2 인스턴스의 운영체제와 아키텍처를 선택
    - 리눅스 운영체제와 x86_64 아키텍처(일반적인 Intel/AMD 기반 서버)를 사용

  • 네트워크 모드
    - awsvpc: 각 작업(Task)이 고유한 네트워크 인터페이스를 가져서 독립된 IP 주소를 할당
    => 보안특화

    • bridge: 여러 컨테이너가 같은 네트워크 인터페이스를 공유
      => 멀티 컨테이너
    • host: 컨테이너가 EC2 인스턴스의 네트워크 인터페이스를 공유
      => 단일 컨테이너
  • CPU: 컨테이너가 사용할 CPU 용량(코어사용량)

  • 메모리: 컨테이너가 사용할 메모리 용량

    태스크 크기는 컨테이너가 실행될 EC2 인스턴스의 자원과 일치해야함
    리소스 요구사항이 너무 크거나 작으면 EC2 인스턴스에 배치되지 않을 수 있음

  • 태스크 역할
    - 작업(Task) 내 컨테이너가 AWS 서비스(API, 리소스)에 접근할 때 사용하는 IAM 역할
    - ex: S3 버킷에 접근하거나 DynamoDB 데이터를 조회할 때 사용
    - IAM 콘솔에서 생성한 역할을 선택하거나 새 역할 생성 옵션을 사용

  • 태스크 실행 역할
    - 작업(Task)을 실행하는 AWS ECS 자체가 사용하는 IAM 역할
    - ECS가 EC2 인스턴스에서 작업을 실행하고, 로그를 수집하며, ECR에서 이미지를 가져오는 데 사용
    - 기본적으로 ECS 서비스가 실행에 필요한 권한을 AWS에서 자동으로 생성

  • 이름: 컨테이너의 고유한 이름을 지정

  • 이미지 URI: 컨테이너에서 실행할 Docker 이미지의 URI

    • ex: Docker Hub 이미지: nginx:latest
    • ex: AWS ECR 이미지: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
  • 프라이빗 레지스트리: Docker Hub 또는 AWS ECR 외의 프라이빗 레지스트리에서 이미지를 가져오는 경우, 인증 정보가 필요

  • 포트 매핑: 컨테이너 내부의 포트를 호스트(EC2 인스턴스)나 awsvpc 네트워크 모드로 노출

    • 컨테이너 포트와 호스트 포트 설정 작업
    • 포트 이름은 네트워크 구성이나 로드 밸런서와 통합 시 유용
  • 읽기 전용 루트 파일 시스템: 컨테이너의 루트 파일 시스템을 읽기 전용으로 설정할지 여부

  • 리소스 할당 제한 - 조건부: 컨테이너가 사용할 CPU, GPU, 메모리의 양을 정의
    => EC2 cpu용량을 초과할 수 없음 , GPU를 할당하려면 EC2 GPU 인스턴스가 필요


서비스 생성

  1. 컴퓨팅 옵션
  • 용량 공급자 전략 <= 선택
    • 작업(Task)을 실행할 리소스의 우선순위와 비율을 설정하는 전략
  • 시작 유형
    • ECS 서비스가 실행되는 방식을 직접 정의
  1. 용량 공급자 전량
  • 클러스터 기본값 사용 <= 선택
    • 처음 클러스터를 만들 때 정의한 내용을 따라감
  • 사용자 지정 사용(고급)
    • 용량 공급자를 직접 지정하고 가중치도 직접 지정


3. 어플리케이션 유형: ECS 클러스터에서 실행할 애플리케이션의 유형을 정의

  • 서비스: 애플리케이션이 중지 없이 계속 실행되어야 할 경우
  • 테스크: 한 번 실행하고 종료되는 작업(Task)에 적합, 작업이 실패하거나 완료되면 다시 실행되지 않음
  1. 태스크 정의
  • ECS에서 실행할 작업(Task)에 대한 정의
  • 개정: 작업 정의가 업데이트되면 새로운 개정 번호가 생성되며, 이 중 특정 버전을 실행 가능
  1. 서비스 이름: 서비스 이름

  2. 서비스 유형: 작업(Task)을 ECS 클러스터에 배포하는 방식

  • 복제본
    • 클러스터 전체에서 작업(Task)의 복제본을 배포하고 유지 관리
    • 원하는 작업 수(Replica 수)를 지정하면, ECS가 해당 작업 수를 유지
  • 데몬
    • 클러스터의 각 컨테이너 인스턴스(EC2)에 하나의 작업을 배포
  1. 원하는 태스크
  • 서비스가 실행할 작업(Task)의 수를 정의
  1. 가용 영역 리밸런싱
  • ECS 서비스가 특정 가용 영역에서 작업(Task)이 너무 많거나 부족할 경우, 작업을 다른 가용 영역으로 이동

  1. 롤링 업데이트
  • 기존 작업(Task)을 점진적으로 교체
  • 새 작업이 정상적으로 실행되면 기존 작업을 종료
  1. 블루/그린 배포
  • 기존 작업(Task)을 유지한 채 새 작업(Task)을 병렬로
  • 새 작업이 성공하면 트래픽을 기존 작업에서 새 작업으로 전환
  1. 최소 실행 작업 비율 (%)
  • 서비스 배포 중 서비스에서 실행 중인 작업(Task)의 최소 백분율을 설정
  • 기본값: 100% = 작업(Task)이 실행되기 전까지 기존 작업(Task)이 중단되지 않음
  1. 최대 실행 작업 비율 (%)
  • 동시에 실행 가능한 작업(Task)의 최대 백분율
  • 기본값: 200% = 기존 작업(Task)와 새 작업(Task)을 모두 실행하여 최대 2배의 작업을 실행

EC2를 사용하는 ECS를 하려면?

1. EC2 인스턴스 생성

- 클러스터에 연결할 VPC와 서브넷 선택
- 보안 그룹에서 ECS 작업에 필요한 포트를 허용

2. 생성된 EC2 터미널(bash) ECS 에이전트 설치

  • ECS-Optimized AMI를 사용중이라면 상관없지만 비싸서 안쓰는걸로 예시를 들겠다.(2$/hr)

3. ECS 에이전트 구성

  • ECS 에이전트는 /etc/ecs/ecs.config 파일을 통해 클러스터와 통신
    • 구성 파일 생성 및 편집

      sudo mkdir -p /etc/ecs
      sudo nano /etc/ecs/ecs.config

    • 클러스터 이름 추가

      ECS_CLUSTER=<클러스터 이름>

    • 에이전트 실행

      Linux
      sudo systemctl start ecs
      sudo systemctl enable ecs

      Ubuntu
      sudo docker run --name ecs-agent \
      --detach=true \
      --restart=always \
      --volume=/var/run/docker.sock:/var/run/docker.sock \
      --volume=/var/log/ecs/:/log \
      --volume=/var/lib/ecs/data:/data \
      --network=host \
      amazon/amazon-ecs-agent:latest

4. ECS 클러스터 생성(상단 참조)

  • EC2 인스턴스 클러스터에 연결 확인

    aws ecs list-container-instances --cluster my-cluster

  • 결과가 비어 있으면 /etc/ecs/ecs.config를 다시 확인하고 에이전트를 재시작

5. 작업 정의(Task Definition) 생성(상단 참조)

  • 용량공급자 클러스터 기본값을 해놨으면 1,2,3 필요없음

6. 서비스(Service) 생성

profile
개발 하고 싶은 비버

0개의 댓글