Elastic Beanstalk 콘솔의 ECS 관리형 Docker 환경 - AWS Elastic Beanstalk

Elastic Beanstalk 콘솔의 ECS 관리형 Docker 환경

Elastic Beanstalk 콘솔을 사용하는 확장 가능 Elastic Beanstalk 환경 또는 단일 인스턴스에서 멀티컨테이너 인스턴스의 클러스터를 시작할 수 있습니다. 이 자습서에는 컨테이너 구성 및 컨테이너 두 개를 사용하는 환경의 소스 코드 준비에 대한 내용이 나와 있습니다.

컨테이너(PHP 애플리케이션 및 nginx 프록시)는 Elastic Beanstalk 환경의 각 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 나란히 실행됩니다. 환경을 생성하고 애플리케이션이 실행되는지 확인한 후에는 컨테이너 인스턴스에 연결하여 함께 정상적으로 작동되는지 살펴봅니다.

ECS 관리형 Docker 컨테이너 정의

새 Docker 환경을 생성하는 첫 번째 단계는 애플리케이션 데이터에 대한 디렉터리를 만드는 것입니다. 이 폴더는 로컬 시스템 어디든 있을 수 있으며 원하는 이름을 선택할 수 있습니다. 컨테이너 구성 파일 외에도 이 폴더는 Elastic Beanstalk에 업로드하고 환경에 배포할 내용을 포함하고 있습니다.

참고

이 자습서의 모든 코드는 GitHub의 awslabs 리포지토리(https://github.com/awslabs/eb-docker-nginx-proxy)에서 제공됩니다.

Elastic Beanstalk가 Amazon EC2 인스턴스에 컨테이너를 구성하는 데 사용하는 파일은 JSON 형식의 텍스트 파일로 이름은 Dockerrun.aws.json입니다. 애플리케이션 루트에 이 이름으로 된 텍스트 파일을 만들고 다음 텍스트를 추가합니다.

{ "AWSEBDockerrunVersion": 2, "volumes": [ { "name": "php-app", "host": { "sourcePath": "/var/app/current/php-app" } }, { "name": "nginx-proxy-conf", "host": { "sourcePath": "/var/app/current/proxy/conf.d" } } ], "containerDefinitions": [ { "name": "php-app", "image": "php:fpm", "essential": true, "memory": 128, "mountPoints": [ { "sourceVolume": "php-app", "containerPath": "/var/www/html", "readOnly": true } ] }, { "name": "nginx-proxy", "image": "nginx", "essential": true, "memory": 128, "portMappings": [ { "hostPort": 80, "containerPort": 80 } ], "links": [ "php-app" ], "mountPoints": [ { "sourceVolume": "php-app", "containerPath": "/var/www/html", "readOnly": true }, { "sourceVolume": "nginx-proxy-conf", "containerPath": "/etc/nginx/conf.d", "readOnly": true }, { "sourceVolume": "awseb-logs-nginx-proxy", "containerPath": "/var/log/nginx" } ] } ] }

다음 예제 구성에서는 PHP 웹 사이트와 그 앞의 nginx 프록시로 구성된 컨테이너 두 개를 정의합니다. 이들 두 컨테이너는 Elastic Beanstalk 환경의 각 인스턴스에 있는 Docker 컨테이너에서 나란히 실행되며, 역시 이 파일에 정의되어 있는 호스트 인스턴스의 볼륨에서 공유 내용(웹 사이트 내용)에 액세스합니다. 컨테이너 자체는 Docker Hub의 공식 리포지토리에서 호스팅하는 이미지로 만듭니다. 그 결과, 다음과 같은 환경이 됩니다.

구성에 정의된 볼륨은 다음에 만들고 애플리케이션 소스 번들의 일부로 업로드할 내용에 해당됩니다. 컨테이너는 컨테이너 정의의 mountPoints 섹션에 볼륨을 마운트하여 호스트 내용을 액세스합니다.

Dockerrun.aws.json 형식 및 해당 파라미터에 대한 자세한 내용은 컨테이너 정의 형식 단원을 참조하세요.

콘텐츠 추가

그 다음 방문자에게 표시될 PHP 사이트에 대한 일부 내용과 nginx 프록시에 대한 구성 파일을 추가합니다.

php-app/index.php

<h1>Hello World!!!</h1> <h3>PHP Version <pre><?= phpversion()?></pre></h3>

php-app/static.html

<h1>Hello World!</h1> <h3>This is a static HTML page.</h3>

proxy/conf.d/default.conf

server { listen 80; server_name localhost; root /var/www/html; index index.php; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_pass php-app:9000; fastcgi_index index.php; } }

Elastic Beanstalk에 배포

이제 애플리케이션 폴더에 다음 파일이 포함되어 있습니다.

├── Dockerrun.aws.json ├── php-app │   ├── index.php │   └── static.html └── proxy └── conf.d └── default.conf

다음은 Elastic Beanstalk 환경을 생성할 때 필요한 모든 사항입니다. 위 파일과 폴더의 .zip 아카이브를 만듭니다(최상위 프로젝트 폴더는 해당되지 않음). Windows explorer에 아카이브를 만들려면 프로젝트 폴더의 내용을 선택하고 마우스 오른쪽 버튼을 클릭한 후 Send To(전송 대상)를 선택하고 Compressed (zipped) Folder(압축된 폴더)를 클릭합니다.

참고

다른 환경에서 아카이브를 만드는 방법에 대한 지침과 필수 파일 구조에 대한 정보는 단원을 참조하십시오애플리케이션 소스 번들 생성

그 다음 Elastic Beanstalk에 소스 번들을 업로드하고 환경을 생성합니다. [Platform]에서 [Docker]를 선택합니다. 플랫폼 브랜치의 경우, 64비트 Amazon Linux 2에서 실행되는 ECS를 선택합니다.

환경을 시작하려면(콘솔)
  1. 미리 구성된 다음 링크를 사용하여 Elastic Beanstalk 콘솔을 엽니다. console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. 플랫폼에서 애플리케이션에 사용되는 언어와 일치하는 플랫폼 및 플랫폼 브랜치를 선택하거나 컨테이너 기반 애플리케이션을 위한 Docker 플랫폼을 선택합니다.

  3. [애플리케이션 코드]에서 [코드 업로드]를 선택합니다.

  4. [로컬 파일], [파일 선택]을 차례로 선택한 다음 소스 번들을 엽니다.

  5. 검토 및 시작을 선택합니다.

  6. 사용 가능한 설정을 검토한 후 앱 생성을 선택합니다.

그러면 Elastic Beanstalk 콘솔에서 새로운 환경의 관리 대시보드로 리디렉션됩니다. 이 화면에는 환경의 상태와 Elastic Beanstalk 서비스에 의한 이벤트 출력이 표시되어 있습니다. 상태가 녹색이면 환경 이름 옆의 URL을 클릭하여 새 웹 사이트를 확인합니다.

컨테이너 인스턴스에 연결

이제 Elastic Beanstalk 환경의 Amazon EC2 인스턴스에 연결하여 실행 중인 동적 요소 몇 가지를 확인해 보겠습니다.

사용자의 환경에서 인스턴스에 연결하는 가장 쉬운 방법은 EB CLI를 사용하는 것입니다. 아직 사용하지 않은 경우 사용하려면 EB CLI를 설치하십시오. 또한 Amazon EC2 SSH 키 페어를 사용하여 환경을 구성해야 합니다. 환경을 구성하려면 콘솔의 보안 구성 페이지 또는 EB CLI eb init 명령을 사용합니다. 환경 인스턴스에 연결하려면 EB CLI eb ssh 명령을 사용합니다.

Docker 컨테이너를 호스팅하는 Amazon EC2 인스턴스에 연결되어 있기 때문에 어떤 식으로 설정되어 있는지 확인할 수 있습니다. ls에서 /var/app/current를 실행합니다.

[ec2-user@ip-10-0-0-117 ~]$ ls /var/app/current Dockerrun.aws.json php-app proxy

이 디렉터리에는 환경이 생성되는 동안 Elastic Beanstalk에 업로드한 소스 번들의 파일이 포함되어 있습니다.

[ec2-user@ip-10-0-0-117 ~]$ ls /var/log/containers nginx-proxy nginx-proxy-4ba868dbb7f3-stdouterr.log php-app php-app-dcc3b3c8522c-stdouterr.log rotated

다음은 컨테이너 인스턴스에 생성되고 Elastic Beanstalk에 의해 수집된 로그의 위치입니다. Elastic Beanstalk는 각 컨테이너의 이 디렉터리에 볼륨을 생성하고, 사용자는 로그가 기록되는 컨테이너 위치에 이 볼륨을 마운트합니다.

Docker를 살펴보고 docker ps로 실행 중인 컨테이너를 확인할 수도 있습니다.

[ec2-user@ip-10-0-0-117 ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ba868dbb7f3 nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp ecs-awseb-Tutorials-env-dc2aywfjwg-1-nginx-proxy-acca84ef87c4aca15400 dcc3b3c8522c php:fpm "docker-php-entrypoi…" 4 minutes ago Up 4 minutes 9000/tcp ecs-awseb-Tutorials-env-dc2aywfjwg-1-php-app-b8d38ae288b7b09e8101 d9367c0baad6 amazon/amazon-ecs-agent:latest "/agent" 5 minutes ago Up 5 minutes (healthy) ecs-agent

이렇게 하면 배포를 조정한 Amazon ECS 컨테이너 에이전트를 비롯하여 배포한 실행 컨테이너 두 개가 표시됩니다.

Amazon ECS 컨테이너 에이전트 검사

Elastic Beanstalk에서 ECS 관리형 Docker 환경의 Amazon EC2 인스턴스는 Docker 컨테이너에 에이전트 프로세스를 실행합니다. 이 에이전트는 Amazon ECS 서비스에 연결되어 컨테이너 배포를 조정합니다. 이러한 배포는 Amazon ECS에서 작업으로 실행되며, 이 작업은 작업 정의 파일에 구성되어 있습니다. Elastic Beanstalk는 소스 번들에 업로드하는 Dockerrun.aws.json을 기준으로 이러한 작업 정의 파일을 만듭니다.

http://localhost:51678/v1/metadata에 대한 HTTP get 요청으로 컨테이너 에이전트의 상태를 확인합니다.

[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/metadata { "Cluster":"awseb-Tutorials-env-dc2aywfjwg", "ContainerInstanceArn":"arn:aws:ecs:us-west-2:123456789012:container-instance/awseb-Tutorials-env-dc2aywfjwg/db7be5215cd74658aacfcb292a6b944f", "Version":"Amazon ECS Agent - v1.57.1 (089b7b64)" }

이 구조는 클러스터 인스턴스(연결되어 있는 Amazon EC2 인스턴스)의 ARN(Amazon 리소스 이름) 및 Amazon ECS 클러스터의 이름을 나타냅니다.

자세한 내용을 보려면 http://localhost:51678/v1/tasks에 HTTP get 요청을 수행하십시오.

[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/tasks { "Tasks":[ { "Arn":"arn:aws:ecs:us-west-2:123456789012:task/awseb-Tutorials-env-dc2aywfjwg/bbde7ebe1d4e4537ab1336340150a6d6", "DesiredStatus":"RUNNING", "KnownStatus":"RUNNING", "Family":"awseb-Tutorials-env-dc2aywfjwg", "Version":"1", "Containers":[ { "DockerId":"dcc3b3c8522cb9510b7359689163814c0f1453b36b237204a3fd7a0b445d2ea6", "DockerName":"ecs-awseb-Tutorials-env-dc2aywfjwg-1-php-app-b8d38ae288b7b09e8101", "Name":"php-app", "Volumes":[ { "Source":"/var/app/current/php-app", "Destination":"/var/www/html" } ] }, { "DockerId":"4ba868dbb7f3fb3328b8afeb2cb6cf03e3cb1cdd5b109e470f767d50b2c3e303", "DockerName":"ecs-awseb-Tutorials-env-dc2aywfjwg-1-nginx-proxy-acca84ef87c4aca15400", "Name":"nginx-proxy", "Ports":[ { "ContainerPort":80, "Protocol":"tcp", "HostPort":80 }, { "ContainerPort":80, "Protocol":"tcp", "HostPort":80 } ], "Volumes":[ { "Source":"/var/app/current/php-app", "Destination":"/var/www/html" }, { "Source":"/var/log/containers/nginx-proxy", "Destination":"/var/log/nginx" }, { "Source":"/var/app/current/proxy/conf.d", "Destination":"/etc/nginx/conf.d" } ] } ] } ] }

이 구조는 이 자습서의 예제 프로젝트에서 Docker 컨테이너 두 개를 배포할 때 실행하는 작업을 보여 줍니다. 다음 정보가 표시됩니다.

  • KnownStatusRUNNING 상태는 컨테이너가 여전히 활성화되어 있다는 것을 나타냅니다.

  • 패밀리 – Elastic Beanstalk가 Dockerrun.aws.json에서 생성한 작업 정의 이름입니다.

  • 버전 – 작업 정의 버전입니다. 작업 정의 파일이 업데이트될 때마다 버전이 증가합니다.

  • 컨테이너 – 인스턴스에서 실행 중인 컨테이너에 대한 정보입니다.

더 자세한 내용은 Amazon ECS 서비스에서 확인할 수 있으며, 를 사용하여 호출할 수 있습니다AWS Command Line Interface Amazon ECS에서 AWS CLI를 사용하는 방법에 대한 지침과 일반적인 Amazon ECS 정보는 Amazon ECS 사용 설명서를 참조하세요.