멀티컨테이너 Docker 플랫폼(Amazon Linux AMI) - AWS Elastic Beanstalk

멀티컨테이너 Docker 플랫폼(Amazon Linux AMI)

참고

이 플랫폼은 Amazon Linux AMI 운영 체제(이전 Amazon Linux 2)만 지원합니다. Amazon Linux 2의 멀티컨테이너 Docker 기능은 Docker 플랫폼에서 제공하며 장기 지원을 받습니다.

Elastic Beanstalk Docker 환경에서 Amazon Linux AMI 플랫폼 버전(이전 Amazon Linux 2)을 사용하는 경우 Elastic Beanstalk의 멀티컨테이너 Docker 플랫폼을 사용하여 Amazon EC2 인스턴스당 컨테이너를 여러 개 지원하는 Docker 환경을 생성할 수 있습니다.

Elastic Beanstalk는 Amazon Elastic Container Service(Amazon ECS)를 사용하여 멀티컨테이너 Docker 환경에 맞게 컨테이너 배포를 조정합니다. Amazon ECS는 Docker 컨테이너를 실행하는 인스턴스 클러스터를 관리하기 위한 도구를 제공합니다. Elastic Beanstalk는 클러스터 생성, 작업 정의 및 실행을 비롯한 Amazon ECS 작업을 처리합니다. 환경에서 각 인스턴스는 동일한 컨테이너 세트를 실행하며, 이는 Dockerrun.aws.json 파일에 정의되어 있습니다.

참고

일부 리전에서는 Amazon ECS를 제공하지 않습니다. 이러한 리전에서는 멀티컨테이너 Docker 환경이 지원되지 않습니다.

각 리전에서 제공되는 AWS 서비스에 대한 자세한 내용은 리전 표를 참조하십시오.

멀티컨테이너 Docker 플랫폼

Elastic Beanstalk의 일반 및 미리 구성된 표준 Docker 플랫폼은 Elastic Beanstalk 환경당 Docker 컨테이너 하나만 지원합니다. Docker를 최대한 활용하기 위해, Elastic Beanstalk를 통해 Amazon EC2 인스턴스가 여러 Docker 컨테이너를 나란히 실행하는 환경을 생성할 수 있습니다.

다음 다이어그램은 Auto Scaling 그룹의 각 Amazon EC2 인스턴스에서 실행되는 Docker 컨테이너 세 개로 구성된 Elastic Beanstalk 환경 예를 보여 줍니다.

Dockerrun.aws.json 파일

컨테이너 인스턴스(Elastic Beanstalk 환경에서 멀티컨테이너 Docker를 실행하는 Amazon EC2 인스턴스)에는 Dockerrun.aws.json이라는 구성 파일이 필요합니다. 이 파일은 Elastic Beanstalk에 고유하며 단독으로 사용하거나 소스 번들의 내용 및 소스 코드와 함께 사용하여 Docker 플랫폼에서 환경을 생성할 수 있습니다.

참고

Dockerrun.aws.json 형식의 버전 1은 Elastic Beanstalk 환경에 대해 단일 Docker 컨테이너를 시작하는 데 사용됩니다. 버전 2는 Amazon EC2 인스턴스당 여러 개의 컨테이너를 추가로 지원하며, 멀티컨테이너 Docker 플랫폼에서만 사용할 수 있습니다. 형식은 Docker 구성 아래에 자세히 설명된 이전 버전과 상당히 다릅니다.

업데이트된 형식에 대한 세부 정보 및 파일 예제는 Dockerrun.aws.json v2 단원을 참조하십시오.

Docker 이미지

Elastic Beanstalk의 멀티컨테이너 Docker 플랫폼에서는 이미지를 미리 빌드하고 퍼블릭 또는 프라이빗 온라인 이미지 리포지토리에 저장해야 합니다.

참고

Elastic Beanstalk의 멀티컨테이너 Docker 플랫폼에서는 Dockerfile을 사용하여 배포 중에 사용자 지정 이미지를 빌드할 수 없습니다. Elastic Beanstalk 환경을 생성하기 전에 이미지를 빌드한 후 이를 온라인 리포지토리에 배포하십시오.

Dockerrun.aws.json에 이미지를 이름으로 지정합니다. 다음 규칙에 유의하십시오.

  • Docker Hub 공식 리포지토리 안의 이미지는 단일 이름을 사용합니다(예: ubuntu 또는 mongo).

  • Docker Hub의 다른 리포지토리에 저장된 이미지는 조직 이름으로 한정됩니다(예: amazon/amazon-ecs-agent).

  • 다른 온라인 레지스트리 안의 이미지는 도메인 이름을 사용하여 추가로 한정됩니다(예: quay.io/assemblyline/ubuntu).

프라이빗 리포지토리를 인증하도록 Elastic Beanstalk를 구성하려면 Dockerrun.aws.json 파일에 authentication 파라미터를 포함시킵니다.

컨테이너 인스턴스 역할

Elastic Beanstalk는 Docker 컨테이너에서 실행되는 Amazon ECS 컨테이너 에이전트에 Amazon ECS에 최적화된 AMI를 사용합니다. 에이전트는 Amazon ECS와 통신하여 컨테이너 배포를 조정합니다. Amazon ECS와 통신하려면 각 Amazon EC2 인스턴스는 IAM에 해당 권한이 있어야 합니다. Elastic Beanstalk Management Console에서 환경을 생성할 때 기본 인스턴스 프로파일에 이러한 권한이 연결됩니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ECSAccess", "Effect": "Allow", "Action": [ "ecs:Poll", "ecs:StartTask", "ecs:StopTask", "ecs:DiscoverPollEndpoint", "ecs:StartTelemetrySession", "ecs:RegisterContainerInstance", "ecs:DeregisterContainerInstance", "ecs:DescribeContainerInstances", "ecs:Submit*" ], "Resource": "*" } ] }

자체 인스턴스 프로파일을 생성하는 경우, 권한이 최신으로 유지되도록 AWSElasticBeanstalkMulticontainerDocker 관리형 정책을 연결할 수 있습니다. IAM에서 정책과 역할을 만드는 방법에 대한 자세한 내용은 IAM 사용 설명서의 IAM 역할 생성을 참조하십시오.

Elastic Beanstalk에서 생성한 Amazon ECS 리소스

멀티컨테이너 Docker 플랫폼을 사용하여 환경을 생성하면 Elastic Beanstalk가 여러 Amazon Elastic Container Service 리소스를 자동으로 생성하고 구성하는 동시에 각 Amazon EC2 인스턴스에 필요한 컨테이너를 만들기 위해 환경을 구축합니다.

  • Amazon ECS 클러스터 – Amazon ECS의 컨테이너 인스턴스는 클러스터로 구성되어 있습니다. Elastic Beanstalk에서 사용할 경우 각 멀티컨테이너 Docker 환경마다 항상 클러스터 하나가 생성됩니다.

  • Amazon ECS 작업 정의 - Elastic Beanstalk는 프로젝트의 Dockerrun.aws.json 파일을 사용하여 환경의 컨테이너 인스턴스를 구성하는 데 사용되는 Amazon ECS 작업 정의를 생성합니다.

  • Amazon ECS 작업 – Elastic Beanstalk는 Amazon ECS와 통신하여 환경의 모든 인스턴스에서 작업을 실행하여 컨테이너 배포를 조정합니다. 확장 가능 환경에서 Elastic Beanstalk는 인스턴스가 클러스터에 추가될 때마다 새 작업을 시작합니다. 드문 경우지만 컨테이너와 이미지를 위해 예약된 공간의 양을 늘려야 할 수 있습니다. Docker 환경 구성 단원에서 자세히 알아보십시오.

  • Amazon ECS 컨테이너 에이전트 – 이 에이전트는 환경에 있는 인스턴스의 Docker 컨테이너에서 실행됩니다. 이 에이전트는 Amazon ECS 서비스를 폴링하고 작업이 실행되기를 기다립니다.

  • Amazon ECS 데이터 볼륨 – Elastic Beanstalk는 (Dockerrun.aws.json에서 정의한 볼륨 외에도) 볼륨 정의를 작업 정의에 삽입하여 로그 수집을 용이하게 합니다.

    Elastic Beanstalk는 /var/log/containers/containername의 각 컨테이너에 하나씩 컨테이너 인스턴스에 로그 볼륨을 만듭니다. 이러한 볼륨의 이름은 awseb-logs-containername이고, 컨테이너를 탑재하기 위해 제공됩니다. 탑재 방법에 대한 세부 정보는 컨테이너 정의 형식 단원을 참조하십시오.

여러 Elastic Load Balancing 리스너 사용

기본 HTTP 포트에서 실행되지 않는 프록시 또는 다른 서비스에 대한 인바운드 트래픽을 지원하도록 멀티컨테이너 Docker 환경에서 여러 개의 Elastic Load Balancing 리스너를 구성할 수 있습니다.

소스 번들에 .ebextensions 폴더를 만들고 파일 확장명이 .config인 파일을 추가합니다. 다음 예제에서는 포트 8080에서 Elastic Load Balancing 리스너를 생성하는 구성 파일을 보여 줍니다.

.ebextensions/elb-listener.config

option_settings: aws:elb:listener:8080: ListenerProtocol: HTTP InstanceProtocol: HTTP InstancePort: 8080

환경이 사용자가 생성한 사용자 지정 Amazon Virtual Private Cloud(Amazon VPC)에서 실행 중인 경우 Elastic Beanstalk가 나머지를 처리합니다. 기본 VPC에서 로드 밸런서로부터의 수신을 허용하도록 인스턴스의 보안 그룹을 구성해야 합니다. 보안 그룹에 수신 규칙을 추가하는 두 번째 구성 파일을 추가합니다.

.ebextensions/elb-ingress.config

Resources: port8080SecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]} IpProtocol: tcp ToPort: 8080 FromPort: 8080 SourceSecurityGroupName: { "Fn::GetAtt": ["AWSEBLoadBalancer", "SourceSecurityGroup.GroupName"] }

구성 파일 형식에 대한 자세한 내용은 Elastic Beanstalk 환경 리소스 추가 및 사용자 지정옵션 설정 단원을 참조하십시오.

Elastic Load Balancing 구성에 리스너를 추가하고 보안 그룹에서 포트를 여는 것 외에도, Dockerrun.aws.json 파일의 containerDefinitions 섹션에서 호스트 인스턴스의 포트를 Docker 컨테이너의 포트에 매핑해야 합니다. 다음 발췌문은 한 가지 예를 보여줍니다:

"portMappings": [ { "hostPort": 8080, "containerPort": 8080 } ]

Dockerrun.aws.json 파일 형식에 대한 세부 정보는 Dockerrun.aws.json v2 단원을 참조하십시오.

실패한 컨테이너 배포

Amazon ECS 작업에 실패하면 Elastic Beanstalk 환경의 하나 이상의 컨테이너가 시작되지 않습니다. Elastic Beanstalk는 실패한 Amazon ECS 작업으로 인해 멀티컨테이너 환경을 롤백하지 않습니다. 컨테이너가 환경에서 시작되지 않는 경우 Elastic Beanstalk 콘솔에서 현재 버전 또는 이전 작업 버전을 다시 배포합니다.

기존 버전을 배포하려면

  1. 환경의 리전에서 Elastic Beanstalk 콘솔을 엽니다.

  2. 애플리케이션 이름 오른쪽의 작업을 클릭한 후 View application versions(애플리케이션 버전 보기)를 클릭합니다.

  3. 애플리케이션 버전을 선택하고 배포를 클릭합니다.