Amazon ECS 컨테이너 이미지 모범 사례 - Amazon Elastic Container Service

Amazon ECS 컨테이너 이미지 모범 사례

컨테이너 이미지는 컨테이너 빌드 방법에 대한 일련의 지침입니다. 컨테이너 이미지에는 애플리케이션 코드와 애플리케이션 코드를 실행하는 데 필요한 모든 종속성이 들어 있습니다. 애플리케이션 종속성에는 애플리케이션 코드가 사용하는 소스 코드 패키지, 해석되는 언어를 위한 언어 런타임, 동적으로 연결된 코드가 사용하는 바이너리 패키지 등이 포함됩니다.

컨테이너 이미지를 디자인하고 빌드할 때는 다음 지침을 따르세요.

  • 모든 애플리케이션 종속성을 컨테이너 이미지 내에 정적 파일로 저장하여 완전한 컨테이너 이미지를 만듭니다.

    컨테이너 이미지에서 변경할 사항이 있으면 변경 사항이 적용된 새 컨테이너 이미지를 구축합니다.

  • 컨테이너 내에서 단일 애플리케이션 프로세스를 실행합니다.

    컨테이너 수명은 애플리케이션 프로세스가 실행되는 동안입니다. Amazon ECS는 장애가 발생한 프로세스를 교체하고 교체 프로세스를 시작할 위치를 결정합니다. 전체 이미지를 지원하면 전체 배포의 복원력이 향상됩니다.

  • 애플리케이션에서 SIGTERM을 처리하게 합니다.

    Amazon ECS에서 작업을 중지하면 먼저 SIGTERM 신호를 작업에 보내 애플리케이션에 해당 작업을 완료 및 종료해야 함을 알립니다. 그러면 Amazon ECS에서 SIGKILL 메시지를 보냅니다. 애플리케이션에서 SIGTERM을 무시하는 경우 Amazon ECS 서비스는 프로세스를 종료하기 위한 SIGKILL 신호 전송을 기다려야 합니다.

    애플리케이션이 작업을 완료하는 데 걸리는 시간을 파악하고 애플리케이션이 SIGTERM 신호를 처리하는지 확인해야 합니다. 애플리케이션의 신호 처리에서는 애플리케이션이 새 작업을 받지 못하도록 하고 진행 중인 작업을 완료해야 합니다. 또는 완료하는 데 시간이 너무 오래 걸릴 경우 완료되지 않은 작업을 작업 외부의 스토리지에 저장해야 합니다.

  • stdoutstderr에 로그를 기록하도록 컨테이너화된 애플리케이션을 구성합니다.

    애플리케이션 코드에서 로그 처리를 분리하면 인프라 수준에서 로그 처리를 더욱 유연하게 조정할 수 있습니다. 한 가지 예로, 로깅 시스템을 변경할 수 있습니다. 서비스를 수정하고 새 컨테이너 이미지를 구축 및 배포하는 대신 설정을 조정할 수 있습니다.

  • 태그를 사용하여 컨테이너 이미지의 버전을 관리합니다.

    컨테이너 이미지는 컨테이너 레지스트리에 저장됩니다. 레지스트리의 각 이미지는 태그로 식별됩니다. latest라는 태그가 있습니다. 이 태그는 git 리포지토리의 HEAD와 마찬가지로 최신 버전의 애플리케이션 컨테이너 이미지를 가리키는 포인터 역할을 합니다. latest 태그는 테스트 용도로만 사용하는 것이 좋습니다. 가장 좋은 방법은 각 빌드의 고유한 태그로 컨테이너 이미지에 태그를 지정하는 것입니다. 이미지를 빌드하는 데 사용된 git 커밋에 대한 git SHA를 사용하여 이미지에 태그를 지정하는 것이 좋습니다.

    모든 커밋에 대해 컨테이너 이미지를 빌드할 필요는 없습니다. 하지만 특정 코드 커밋을 프로덕션 환경에 릴리스할 때마다 새 컨테이너 이미지를 빌드하는 것이 좋습니다. 또한 이미지 내에 있는 코드의 git 커밋에 해당하는 태그로 이미지에 태그를 지정하는 것이 좋습니다. 이미지에 git 커밋으로 태그를 지정한 경우 이미지가 실행 중인 코드 버전을 더 빨리 찾을 수 있습니다.

    또한 Amazon Elastic Container Registry에서 변경할 수 없는 이미지 태그를 켜는 것이 좋습니다. 이 설정을 사용하면 태그가 가리키는 컨테이너 이미지를 변경할 수 없습니다. 대신 Amazon ECR은 새 이미지를 새 태그로 업로드해야 합니다. 자세한 내용은 Amazon ECR 사용 설명서의 이미지 태그 변경 가능성을 참조하세요.

AWS Fargate에 실행하도록 애플리케이션을 설계하는 경우 동일 작업 정의에 여러 컨테이너를 배포하는 방식과 여러 작업 정의에 따로 컨테이너를 배포하는 방식 중에서 결정해야 합니다. 다음의 조건이 필요한 경우, 단일 태스크 정의에 여러 컨테이너를 배포하는 것이 좋습니다.

  • 컨테이너가 공통 수명 주기를 공유하는 경우(즉, 함께 시작하고 종료).

  • 컨테이너가 동일한 기본 호스트에서 실행되어야 하는 경우(즉, 로컬호스트 포트에서 한 컨테이너가 다른 컨테이너를 참조함)

  • 컨테이너가 리소스를 공유합니다.

  • 컨테이너가 데이터 볼륨을 공유하는 경우

다음의 조건이 필요한 경우, 여러 태스크 정의에 따로 컨테이너를 배포하는 것이 좋습니다. 그러면 컨테이너를 개별적으로 규모 조정, 프로비저닝 및 프로비저닝 해제할 수 있습니다.