본문 바로가기

Development/AWS

[AWS] Elastic Beanstalk - Linux 플랫폼 확장

728x90

Elastic Beanstalk logo

AWS Elastic Beanstalk Linux 플랫폼은 애플리케이션 개발 및 실행을 지원하기 위해 다양한 기능을 기본적으로 제공합니다. 필요한 경우 여러 가지 방법으로 플랫폼을 확장하여 옵션을 구성하고, 소프트웨어를 설치하고, 파일 및 시작 명령을 추가하고, 빌드 및 런타임 지침을 제공하고, 환경의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 대한 다양한 프로비저닝 단계에서 실행되는 초기화 스크립트를 추가할 수 있습니다.

Buildfile 및 Procfile

Procfile

애플리케이션을 시작하고 실행하기 위한 사용자 지정 명령을 지정하려면 애플리케이션 소스의 루트 디렉터리에 Procfile이라는 파일을 배치합니다. 파일 이름은 대/소 문자를 구분합니다. Procfile에 대해 다음 구문을 사용합니다. 하나 이상의 명령을 지정할 수 있습니다.

<process_name1>: <command1>
<process_name2>: <command2>
...

Procfile의 각 줄은 ^[A-Za-z0-9_-]+:\s*[^\s].*$ 정규식과 일치해야 합니다.

종료하면 안되는 장기 실행 애플리케이션 프로세스의 경우 Procfile을 사용합니다. Elastic Beanstalk는 프로세스가 Procfile에서 계속 실행될 것으로 기대합니다. Elastic Beanstalk는 이러한 프로세스를 모니터링하고 종료되는 프로세스를 다시 시작합니다. 단기 실행 프로세스의 경우 Buildfile을 사용합니다.

Procfile의 모든 경로는 소스 번들의 루트에 상대적입니다. 다음 예제 Procfile은 세 가지 프로세스를 정의합니다. 예제의 첫 줄에 있는 web은 기본 웹 애플리케이션입니다.

예 Procfile

web: bin/myserver
cache: bin/mycache
foo: bin/fooapp

Elastic Beanstalk는 포트 5000의 주 웹 애플리케이션에 요청을 전달하도록 프록시 서버를 구성하며 이 포트 번호를 구성할 수 있습니다. Procfile의 일반적인 용도는 이 포트 번호를 애플리케이션에 명령 인수로 전달하는 것입니다. 프록시 구성에 대한 자세한 내용을 보려면 이 페이지의 역방향 프록시 구성 섹션을 확장하십시오.

Elastic Beanstalk는 로그 파일의 Procfile 프로세스에서 표준 출력 및 오류 스트림을 캡처합니다. Elastic Beanstalk는 프로세스의 이름을 따서 로그 파일의 이름을 지정하고 /var/log에 저장합니다. 예를 들어 앞의 예제에서 web 프로세스는 web-1.log 및 web-1.error.log에 대해 각각 stdout 및 stderr라는 로그를 생성합니다.

다음으로 알아볼 폴더는 .platform/hooks입니다.

docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/platforms-linux-extend.html

 

Elastic Beanstalk Linux 플랫폼 확장 - AWS Elastic Beanstalk

Elastic Beanstalk Linux 플랫폼 확장 AWS Elastic Beanstalk Linux 플랫폼은 애플리케이션 개발 및 실행을 지원하기 위해 다양한 기능을 기본적으로 제공합니다. 필요한 경우 여러 가지 방법으로 플랫폼을 확

docs.aws.amazon.com

 

플랫폼 후크

 

플랫폼 후크는 환경의 플랫폼을 확장하도록 특별히 설계되었습니다. 플랫폼 후크는 애플리케이션 소스 코드의 일부로 배포되는 사용자 지정 스크립트 및 기타 실행 파일로서 다양한 인스턴스 프로비저닝 단계에서 Elastic Beanstalk에 의해 실행됩니다.

더보기

참고

Amazon Linux AMI 플랫폼 버전(이전 Amazon Linux 2)에서는 플랫폼 후크가 지원되지 않습니다.

참고

Amazon Linux AMI 플랫폼 버전(이전 Amazon Linux 2)에서는 플랫폼 후크가 지원되지 않습니다.


애플리케이션 배포 플랫폼 후크

애플리케이션 배포는 배포할 새 소스 번들을 제공하거나 모든 환경 인스턴스를 종료하고 재생성해야 하는 구성 변경을 수행할 때 발생합니다.

애플리케이션 배포 중에 실행되는 플랫폼 후크를 제공하려면 소스 번들의 .platform/hooks 디렉터리 아래에 있는 다음 하위 디렉터리 중 하나에 파일을 배치합니다.

  • prebuild - 파일은 Elastic Beanstalk 플랫폼 엔진이 애플리케이션 소스 번들을 다운로드하고 추출한 후 애플리케이션과 웹 서버를 설정하고 구성하기 전에 실행됩니다. prebuild 파일은 구성 파일의 commands 섹션에 있는 명령을 실행한 후 Buildfile 명령을 실행하기 전에 실행됩니다.
  • predeploy - 파일은 Elastic Beanstalk 플랫폼 엔진이 애플리케이션 및 웹 서버를 설정하고 구성한 후 최종 런타임 위치에 배포하기 전에 실행됩니다. predeploy 파일은 구성 파일의 container_commands 섹션에 있는 명령을 실행한 후 Procfile 명령을 실행하기 전에 실행됩니다.
  • postdeploy - 파일은 Elastic Beanstalk 플랫폼 엔진이 애플리케이션 및 프록시 서버를 배포한 후에 실행됩니다. 이것이 마지막 배포 워크플로우 단계입니다.

 

구성 배포 플랫폼 후크

구성 배포는 환경 인스턴스를 다시 만들지 않고 단지 업데이트하는 구성 변경을 수행할 때 발생합니다. 다음 옵션 업데이트 시 구성 업데이트가 이루어집니다.

  • 환경 속성 및 플랫폼별 설정
  • 정적 파일
  • AWS X-Ray 데몬
  • 로그 저장 및 스트리밍
  • 애플리케이션 포트(자세한 내용을 보려면 이 페이지의 역방향 프록시 구성 단원을 확장하십시오)

구성 배포 중에 실행되는 후크를 제공하려면 소스 번들의 .platform/confighook 디렉터리 아래에 후크를 배치합니다. 애플리케이션 배포 후크의 경우와 동일한 세 개의 하위 디렉터리가 적용됩니다.

 

플랫폼 후크에 대한 자세한 정보

후크 파일은 이진 파일 또는 해당 인터프리터 경로를 포함하는 #! 줄(#!/bin/bash)로 시작하는 스크립트 파일일 수 있습니다. 모든 파일에는 실행 권한이 있어야 합니다. 후크 파일에 대한 실행 권한을 설정하려면 chmod +x를 사용합니다.

나의 경우에는 .ebextensions 폴더에서 django.config 파일에서 이미 지정해주었다.

Elastic Beanstalk는 파일 이름의 사전 순서에 따라 각 디렉터리의 파일을 실행합니다. 모든 파일은 root 사용자로 실행됩니다. 플랫폼 후크의 현재 작업 디렉터리(cwd)는 애플리케이션의 루트 디렉터리입니다.

prebuild 및 predeploy 파일의 경우 application staging directory이고, postdeploy 파일의 경우 현재 application directory입니다.

더보기

Application staging directory

위와 같은 형식으로 platform.yaml 파일에서 명시할 수 있습니다. 

Application staging directory

container:
	app_staging_dir: "/var/app/staging"

위와 같은 형식으로 platform.yaml 파일에서 명시할 수 있습니다. 

파일 중 하나가 실패하면(0이 아닌 종료 코드로 종료)배포가 중단되고 실패합니다.

후크 파일은 application 옵션에서 정의한 모든 환경 속성 및 시스템 환경 변수 HOME, PATH 및 PORT에 액세스 할 수 있습니다.

환경 변수 및 기타 구성 옵션의 값을 플랫폼 후크 스크립트로 가져오려는 경우 환경 인스턴스에서 Elastic Beanstalk이 제공하는 get-config 유틸리티를 사용할 수 있습니다. 자세한 내용은 플랫폼 스크립트 도구를 참조하세요.

 

구성 파일

애플리케이션 소스 코드의 .ebextensions 디렉터리에 구성 파일을 추가하여 Elastic Beanstalk 환경의 다양한 측면을 구성할 수 있습니다. 구성 파일을 사용하면 환경 인스턴스에서 소프트웨어 및 기타 파일을 사용자가 지정하고 인스턴스에서 초기화 명령을 실행할 수 있습니다. 자세한 내용은 Linux 서버에서 소프트웨어 사용자 지정 단원을 참조하세요.

구성 파일을 사용하여 구성 옵션을 설정할 수도 있습니다. 플랫폼 동작을 제어하는 옵션에는 여러가지가 있으며 이러한 옵션 중 일부는 플랫폼에 따라 다릅니다.

Amazon Linux 2 플랫폼에서는 Buildfile을 사용하는 것이 좋습니다. 인스턴스 프로비저닝 중에 환경 인스턴스에서 사용자 지정 코드를 구성 및 실행하려면 Procfile 및 플랫폼 후크를 사용합니다. 이러한 매커니즘은 이 페이지의 이전 섹터에 설명되어 있습니다. .ebextensions 구성 파일에서 명령과 컨테이너 명령을 계속 사용할 수 있지만 작업하기가 쉽지 않습니다. 예를 들어, YAML 파일 내에 명령 스크립트를 작성하는 것은 구문 관점에서 어려울 수 있습니다. AWS CloudFormation 리소스에 대한 참조가 필요한 스크립트에 대해서는 .ebextensions 구성 파일을 사용해야 합니다.

 

역방향 프록시 구성

모든 Amazon Linux 2 플랫폼 버전은 nginx를 기본 역방향 프록시 서버로 사용합니다

더보기

Amazon Linux 2 소개

Amazon Linux 2는 차세대 Amazon Linux 운영 체제입니다. 클라우드 및 엔터프라이즈 애플리케이션에 우수한 성능, 안정적이고 안전한 실행 환경을 제공합니다. Amazon Linux 2는 5년에 걸친 장기 지원을 통해 핵심 운영 체제에 대한 소프트웨어 업데이트의 가용성을 높이고 Amazon Linux Extras 리포지토리를 통해 최신 소프트웨어 패키지에 대한 액세스를 제공합니다.

Amazon Linux 2는 Amazon Elastic Compute Cloud(AmazonEC2)에서 사용할 수 있는 Amazon 머신 이미지(AMI)와 Amazon Elastic Container Service(Amazon ECS)를 비롯한 모든 Docker 기반 환경에서 사용할 수 있는 Docker 컨테이너 이미지로 제공됩니다. 온프레미스 개발 및 테스트를 위한 VMware, Oracle VM VirtualBox 및 Microsoft Hyper-V 가상화 솔루션에 가상 머신 이미지로 사용할 수도 있습니다. Amazon Linux 2는 Amazon Web Services(AWS)의 성능 최적화, systemd 지원, 최신 도구(gcc 7.2.1, glibc 2.25, binutils 2.27) 사용을 위해 조정된 LTS Kernel(4.9)을 사용하여 최신 실행 환경을 제공합니다. Python, MariaDB, Node.js 등 인기 있는 소프트웨어 패키지의 최신 버전을 포함한 추가 소프트웨어 패키지는 Amazon Linux Extras 리포지토리를 통해 설치할 수 있습니다.

Amazon Linux 2 LTS 릴리스 후보는 오늘부터 모든 퍼블릭 리전에서 사용할 수 있습니다. LTS 빌드는 제공 예정입니다. Amazon Linux 2는 추가 비용 없이 제공됩니다. 표준 Amazon EC2 및 AWS 요금은 Amazon EC2 인스턴스 및 기타 서비스 실행에 적용됩니다.

Amazon Linux 2 LTS 릴리스 후보에 대한 피드백은 지명된 AWS 담당자 또는 Amazon Linux 토론 포럼을 통해 제출할 수 있습니다. LTS 릴리스 후보 빌드의 제한 사항을 비롯해 Amazon Linux 2에 대한 자세한 내용은 Amazon Linux 웹페이지  FAQ를 참조하십시오.

Amazon Linux 2 소개

Amazon Linux 2는 차세대 Amazon Linux 운영 체제입니다. 클라우드 및 엔터프라이즈 애플리케이션에 우수한 성능, 안정적이고 안전한 실행 환경을 제공합니다. Amazon Linux 2는 5년에 걸친 장기 지원을 통해 핵심 운영 체제에 대한 소프트웨어 업데이트의 가용성을 높이고 Amazon Linux Extras 리포지토리를 통해 최신 소프트웨어 패키지에 대한 액세스를 제공합니다.

Amazon Linux 2는 Amazon Elastic Compute Cloud(AmazonEC2)에서 사용할 수 있는 Amazon 머신 이미지(AMI)와 Amazon Elastic Container Service(Amazon ECS)를 비롯한 모든 Docker 기반 환경에서 사용할 수 있는 Docker 컨테이너 이미지로 제공됩니다. 온프레미스 개발 및 테스트를 위한 VMware, Oracle VM VirtualBox 및 Microsoft Hyper-V 가상화 솔루션에 가상 머신 이미지로 사용할 수도 있습니다. Amazon Linux 2는 Amazon Web Services(AWS)의 성능 최적화, systemd 지원, 최신 도구(gcc 7.2.1, glibc 2.25, binutils 2.27) 사용을 위해 조정된 LTS Kernel(4.9)을 사용하여 최신 실행 환경을 제공합니다. Python, MariaDB, Node.js 등 인기 있는 소프트웨어 패키지의 최신 버전을 포함한 추가 소프트웨어 패키지는 Amazon Linux Extras 리포지토리를 통해 설치할 수 있습니다.

Amazon Linux 2 LTS 릴리스 후보는 오늘부터 모든 퍼블릭 리전에서 사용할 수 있습니다. LTS 빌드는 제공 예정입니다. Amazon Linux 2는 추가 비용 없이 제공됩니다. 표준 Amazon EC2 및 AWS 요금은 Amazon EC2 인스턴스 및 기타 서비스 실행에 적용됩니다.

Amazon Linux 2 LTS 릴리스 후보에 대한 피드백은 지명된 AWS 담당자 또는 Amazon Linux 토론 포럼을 통해 제출할 수 있습니다. LTS 릴리스 후보 빌드의 제한 사항을 비롯해 Amazon Linux 2에 대한 자세한 내용은 Amazon Linux 웹페이지  FAQ를 참조하십시오.

Tomcat, Node.js, PHP 및 Python 플랫폼은 Apache HTTPD도 대안으로 지원합니다. 이러한 플랫폼에서 Apache를 선택하려면 aws:elasticbeanstalk:environment:proxy 네임스페이스의 ProxyServer 옵션을 apache로 설정합니다. 모든 플랫폼에서는 이 단원에 설명된 것처럼 일관된 방식으로 프록시 서버를 구성할 수 있습니다.

Elastic Beanstalk은 환경의 루트 URL(예: http://my-env.elasticbeanstalk.com)에 에 있는 기본 웹 어플리케이션으로 웹 트래픽을 전달하도록 환경 인스턴스에서 프록시 서버를 구성합니다.

기본적으로 Elastic Beanstalk는 포트 80에서 수신되는 요청을 포트 5000의 기본 웹 애플리케이션에 전달되도록 프록시를 구성합니다. 다음 예제와 같이 구성 파일에서 aws:elasticbeanstalk:application:environment 네임스페이스를 사용하는 PORT 환경 속성을 설정하여 이 포트 번호를 구성할 수 있습니다.

option_settings:
  - namespace: aws:elasticbeanstalk:application:environment
    option_name: PORT
    value: <main_port_number>

애플리케이션 환경 변수 설정에 대한 자세한 내용은 옵션 설정을 참조하세요.

syntax

애플리케이션은 프록시에 구성된 포트에서 수신 대기해야 합니다. PORT 환경 속성을 사용하여 기본 포트를 변경하면 코드에서 PORT 환경 변수의 값을 읽어 해당 포트에 액세스할 수 있습니다. 예를 들어 Go에서 os.Getenv("PORT")를 호출하거나 Java에서 System.getenv("PORT")를 호출합니다. 여러 애플리케이션 프로세스로 트래픽을 보내도록 프록시를 구성하는 경우 여러 환경 속성을 구성하고 프록시 구성 및 애플리케이션 코드 모두에서 해당 값을 사용할 수 있습니다.

또 다른 옵션은 포트 값을 Procfile의 명령 인수로 프로세스에 전달하는 것입니다. 자세한 내용은 이 페이지의 Buildfile 및 Procfile 섹션을 참고하세요.

nginx 구성

Elastic Beanstalk은 nginx를 기본 역방향 프록시로 사용하여 애플리케이션을 Elastic Load Balancing 로드 밸런서에 매핑합니다. Elastic Beanstalk은 확장하거나 자체 구성으로 완전히 재정의할 수 있는 기본 nginx 구성을 제공합니다.

더보기

! 참고

nginx .conf 구성 파일을 추가하거나 편집할 때는 UTF-8로 인코딩해야 합니다.

! 참고

nginx .conf 구성 파일을 추가하거나 편집할 때는 UTF-8로 인코딩해야 합니다.

Elastic Beanstalk의 기본 nginx 구성을 확장하려면 애플리케이션 소스 번들의 .platform/nginx/conf.d/라는 폴더에 .conf 구성 파일을 추가합니다. ElasticBeanstalk nginx 구성에는 이 폴더의 .conf 파일이 자동으로 포함됩니다.

~/workspace/my-app/
    .platform
        nginx
            conf.d
                myconf.conf
    other source files

Elastic Beanstalk의 기본 nginx 구성을 완전히 재정의하려면, .platform/nginx/nginx.conf의 소스 번들에 구성을 포함시킵니다.

~/workspace/my-app/
    .platform
        nginx
            nginx.conf
    other source files

Elastic Beanstalk의 nginx 구성을 재정의하는 경우 nginx.conf에 다음 줄을 추가하여 향상된 상태 보고 및 모니터링, 자동 애플리케이션 매핑 및 정적 파일에 대한 Elastic Beanstalk 구성을 가져옵니다.

include conf.d/elasticbeanstalk/*.conf;

 

확장자가 있는 애플리케이션 예제

다음 예제에서는 Elastic Beanstalk Amazon Linux 2 플랫폼이 지원하는 여러 확장 기능이 있는 애플리케이션 소스 번들(Procfile, .ebextensions 구성 파일, 사용자 지정 후크 및 프록시 구성 파일)을 보여줍니다.

~/my-app/
|-- web.jar
|-- Procfile
|-- readme.md
|-- .ebextensions/
|   |-- options.config        # Option settings
|   `-- cloudwatch.config     # Other .ebextensions sections, for example files and container commands
`-- .platform/
    |-- nginx/                # Proxy configuration
    |   |-- nginx.conf
    |   `-- conf.d/
    |       `-- custom.conf
    |-- hooks/                # Application deployment hooks
    |   |-- prebuild/
    |   |   |-- 01_set_secrets.sh
    |   |   `-- 12_update_permissions.sh
    |   |-- predeploy/
    |   |   `-- 01_some_service_stop.sh
    |   `-- postdeploy/
    |       |-- 01_set_tmp_file_permissions.sh
    |       |-- 50_run_something_after_app_deployment.sh
    |       `-- 99_some_service_start.sh
    `-- confighooks/          # Configuration deployment hooks
        |-- prebuild/
        |   `-- 01_set_secrets.sh
        |-- predeploy/
        |   `-- 01_some_service_stop.sh
        `-- postdeploy/
            |-- 01_run_something_after_config_deployment.sh
            `-- 99_some_service_start.sh
728x90