[145-149] 다중 컨테이너 앱 AWS ECS 배포 정리 / EFS 볼륨 추가

    728x90
    반응형

    다중 컨테이너 앱 AWS ECS 배포 정리

     

    핵심 개념 요약

    1. 다중 컨테이너 앱 구성
      • 백엔드 API와 MongoDB 컨테이너 두 개를 AWS ECS에 배포
      • 도커 컴포즈는 로컬 개발에 유용하지만 클라우드 배포에는 한계가 있음
    2. 컨테이너 네트워킹 차이점
      • 로컬 환경: 도커 컴포즈로 컨테이너 이름을 통한 네트워킹 (mongodb://mongodb:27017)
      • AWS ECS 환경: 동일한 테스크의 컨테이너는 localhost를 통해 통신 (mongodb://localhost:27017)
    3. 환경 변수 활용
      • 코드 내 환경 변수 사용으로 개발/프로덕션 환경 차이 해결
      • ${process.env.MONGODB_URL}로 수정하여 유연성 확보

     

    AWS ECS 배포 과정

    1. 이미지 준비
      • 백엔드 이미지 빌드: docker build -t goals-node ./backend
      • 이미지 태그 설정: docker tag goals-node asd0905/goals-node
      • Docker Hub에 푸시: docker push asd0905/goals-node
    2. ECS 클러스터 설정
      • Networking only 클러스터 생성 (Fargate 사용)
      • VPC 생성 옵션 선택
    3. 테스크 정의 생성
      • Fargate 서버리스 컨테이너 실행 환경 선택
      • CPU, 메모리 리소스 할당
    4. 백엔드 컨테이너 구성
      • 이미지 URL 지정 (Docker Hub의 이미지 주소)
      • 포트 매핑 (80)
      • 명령 지정: node, app.js (개발환경의 nodemon 대신 프로덕션용)
      • 환경 변수 설정: MONGODB_URL=localhost (프로덕션 환경)
    5. MongoDB 컨테이너 구성
      • 공식 MongoDB 이미지 사용
      • 포트 매핑 (27017)
      • 환경 변수 설정: 사용자명과 비밀번호
    6. 로드 밸런서 설정
      • 애플리케이션 로드 밸런서 생성
      • 타겟 타입을 'IP'로 설정 (Fargate 요구사항)
      • 상태 확인 경로를 애플리케이션 엔드포인트로 설정 (/goals)
      • 보안 그룹 구성

     

    주요 포인트 및 수정사항

    1. AWS ECS의 네트워킹 특징
      • 동일한 테스크에 속한 컨테이너는 같은 호스트에서 실행됨
      • 이러한 컨테이너들은 localhost를 통해 통신 가능
      • 각 컨테이너가 다른 물리적 서버에서 실행될 수 있어 도커 네트워크 접근 방식은 작동하지 않음
    2. 로드 밸런서의 중요성
      • 안정적인 DNS 이름 제공 (컨테이너 재배포 시 IP 변경 문제 해결)
      • 트래픽 분산 및 상태 확인 기능
      • 커스텀 도메인 매핑 가능성
    3. 상태 확인 설정 주의사항
      • 로드 밸런서 헬스 체크 경로를 애플리케이션 엔드포인트(/goals)로 올바르게 설정해야 함
      • 잘못된 경로 설정 시 컨테이너가 계속 재시작되는 문제 발생
    4. 볼륨 관리
      • 개발 환경: 바인드 마운트와 익명 볼륨 사용
      • 프로덕션 환경: AWS ECS에서는 바인드 마운트를 사용하지 않음

     

    ECS로 EFS 볼륨 사용하기

    문제점: 데이터 지속성 부족

    • 코드 변경 시 이미지 리빌드, 태그 적용, 도커허브 푸시 과정은 원활하게 작동
    • 로드밸런서를 통해 동일한 URL로 요청 전송 가능
    • 그러나 데이터베이스에 저장된 데이터가 컨테이너 재시작 시 손실됨
    • 컨테이너가 실행 중일 때만 데이터가 유지되며, 서비스 업데이트나 테스크 재시작 시 모든 데이터가 손실

     

    해결책: EFS 볼륨 추가하기

    1. 테스크 정의 업데이트
      • 테스크 정의에서 새 개정판(revision) 생성
      • Volume 섹션에서 Add volume 클릭
    2. EFS 볼륨 설정
      • 볼륨 이름 지정 (도커 컴포즈에서 사용한 이름과 달라도 무방)
      • 볼륨 타입으로 EFS(Elastic File System) 선택
      • Fargate 환경에서 서버리스 파일 시스템 연결 가능
    3. EFS 생성 과정
      • Amazon EFS 콘솔로 이동하여 새 파일 시스템 생성
      • ECS와 동일한 VPC 선택
      • Customize 옵션 선택하여 네트워크 액세스 설정
    4. EFS 보안 그룹 설정
      • EC2 서비스 페이지에서 새 보안 그룹 생성
      • 이름 지정 (예: efs-sc)
      • 동일한 VPC 선택
      • 인바운드 규칙 추가:
        • 타입: NFS 선택
        • 소스: 컨테이너 관리에 사용하는 보안 그룹 지정
        • 이 설정으로 포트 2049(EFS에서 사용)를 통한 통신 허용
    5. 볼륨 마운트 구성
      • 생성한 EFS를 테스크 정의의 볼륨으로 선택
      • MongoDB 컨테이너 설정에서 스토리지 섹션으로 이동
      • 마운트 포인트에서 EFS 볼륨을 선택하고 컨테이너 내부 경로 /data/db로 지정
      • 이 경로는 MongoDB가 데이터를 저장하는 기본 위치
    6. 서비스 업데이트
      • 새 테스크 정의로 서비스 업데이트
      • 필요시 플랫폼 버전을 EFS를 지원하는 버전으로 선택 (예: 1.4.0 이상)

     

    롤링 배포 관련 이슈

    발생 가능한 문제:

    • 새 테스크 배포 시 "Cannot lock file: /data/db/mongod.lock" 오류 발생
    • 원인: 롤링 배포 전략으로 인해 새 테스크와 기존 테스크가 동시에 실행됨
    • 두 MongoDB 인스턴스가 동일한 EFS 볼륨의 같은 파일에 동시에 접근 시도

    해결 방법:

    1. 임시 방법: 현재 실행 중인 테스크를 수동으로 중지한 후 새 테스크 배포
    2. 장기적 해결책: MongoDB를 관리형 데이터베이스 서비스(예: Amazon DocumentDB)로 교체
    3. 배포 설정 조정: 배포 방식을 "블루/그린" 또는 "모두 중지 후 시작"으로 변경

    참고: EFS 볼륨을 사용하면 컨테이너가 재시작되어도 데이터가 유지됩니다. 데이터베이스 파일이 컨테이너와 분리된 물리적 하드 드라이브에 저장되기 때문입니다.

     

    추가 정보 및 팁

    1. 명령어 사용 차이점
      • 개발 환경: CMD ["npm", "start"] (Dockerfile)
      • 프로덕션 환경: node, app.js (ECS 테스크 정의에서 명령 오버라이드)
    2. 테스크와 컨테이너 관계
      • ECS 테스크 정의 생성 후에는 컨테이너를 추가하기 위해 새 테스크 정의를 생성해야 함
      • 기존 실행 중인 테스크에 동적으로 컨테이너를 추가할 수 없음
    3. Auto Scaling
      • 트래픽 급증 시 자동으로 컨테이너 인스턴스 수를 조정할 수 있는 고급 기능
      • 필요에 따라 나중에 구성 가능
    4. 보안 그룹 설정
      • 로드 밸런서 및 ECS 서비스에 적절한 보안 그룹 할당 필요
      • 올바른 포트와 트래픽 허용 설정 중요
      • EFS 사용 시 NFS 포트(2049)에 대한 인바운드 규칙 필요

     

    이 정리는 AWS ECS에서 다중 컨테이너 애플리케이션을 배포하는 과정을 체계적으로 보여주며, 로컬 개발 환경과 클라우드 환경의 주요 차이점을 강조합니다.

    환경 변수와 네트워킹 구성을 통해 동일한 코드베이스를 다양한 환경에서 유연하게 실행할 수 있는 방법을 제시합니다.

     

     

     

     

     

     

    참고

    https://www.udemy.com/course/docker-kubernetes-2022

    728x90
    반응형

    댓글