Linux OS 기반 AWS Elastic Beanstalk 환경을 위한 .ebextensions 구성 파일은 어떤 키를 지원하나요?

8분 분량
콘텐츠 수준: 기초
5

본 기사는 Linux OS 기반의 AWS Elastic Beanstalk 환경 수정 및 확장 시에 사용되는 .ebextensions 구성 파일이 제공하는 여러 키 (Keys)에 대해 설명합니다.

Amazon Web Services (AWS)는 100개 이상의 서비스로 구성되어 있으며 각 서비스를 통해 다양한 분야의 기능을 제공합니다.   

AWS에서는 다양한 서비스를 통해 AWS 클라우드 인프라를 관리하는 다양한 방법을 제공하고 있지만 특정 목적을 위해 어떤 서비스를 사용해야 하며 해당 서비스를 프로비저닝하는 방법을 이해하는 것이 까다로울 수 있습니다.  

AWS Elastic Beanstalk (EB) 서비스를 사용하면 애플리케이션을 실행하는 내부의 AWS 클라우드 인프라 구조 등에 대하여 자세히 알지 못해도 AWS 클라우드에서 애플리케이션을 신속하고 편리하게 배포하고 관리할 수 있습니다.

애플리케이션을 배포하기 위한 대부분의 내부 구조는 AWS에 의해 관리되므로 애플리케이션 소스 번들을 업로드하기만 하면 Elastic Beanstalk에서 애플리케이션을 배포하기 위하여 용량 프로비저닝, 로드 밸런싱, 조정, 애플리케이션 상태 모니터링과 같은 부분을 자동으로 처리합니다.

따라서 애플리케이션을 배포하기 위한 EB 환경과 그 환경에 의해 생성되는 자원들에 대하여 사용자가 수정 혹은 확장 작업 수행을 희망하는 경우를 위해 AWS에서는 .ebextensions 구성 파일과 같은 수단을 제공하고 있습니다.

지금부터 Linux OS 기반의 EB 환경 확장 및 수정 작업 수행을 위하여 .ebextensions 구성 파일에서 지원하는 키 (Keys)에 대하여 알아보도록 하겠습니다.

Linux 기반의 EB 환경의 경우, .ebextensions 구성 파일에서는 다음과 같은 키를 지원합니다.

1. 패키지 (packages)
2. 그룹 (groups)
3. 사용자 (users)
4. 소스 (sources)
5. 파일 (files)
6. 명령 (commands)
7. 서비스 (services)
8. 컨테이너 명령 (container_commands)

각 키에 대한 보다 자세한 내용은 아래 항목들을 통해 확인해보도록 하겠습니다.


1. 패키지 (packages)

packages 키를 사용하면 EC2 인스턴스에 사전에 패키지된 (prepackaged) 애플리케이션 및 구성 요소를 다운로드하고 설치할 수 있습니다.

예시: rpm용 버전 URL을 지정하고 yum 패키지 매니저를 통해 libmemcached, ruby-devel, gcc를 설치

packages: 
  yum:
    libmemcached: [] 
    ruby-devel: []
    gcc: []
  rpm:
    epel: http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm

2. 그룹 (groups)

groups 키를 사용하면 Linux/UNIX 그룹을 생성하고 그룹 ID를 정의할 수 있습니다.

새로운 그룹 생성을 위해서는 새 그룹의 이름과 그룹 ID (선택 사항)를 매핑하는 키-값 페어를 추가합니다. 

단, 그룹 ID 지정 시에 그룹 이름이 이미 존재하는 경우 그룹이 생성되지 않습니다.

또한 다른 그룹에 기존에 존재하는 그룹 ID를 지정한 경우 운영 체제에서 그룹 생성을 거부할 수도 있습니다.

예시: 그룹 ID를 할당하지 않은 groupOne 그룹과 그룹 ID 값을 45로 지정한 groupTwo라는 그룹 정의

groups:
  groupOne: {}
  groupTwo:
    gid: "45"

3. 사용자 (users)

users 키를 사용하면 EC2 인스턴스에 새로운 Linux/UNIX 사용자를 생성할 수 있습니다.

사용자 ID, 그룹, 홈 디렉토리 경로를 정의할 수 있으며, 기존에 존재하는 동일한 사용자 이름 혹은 사용자 ID를 사용하는 경우 운영 체제에서 새로운 사용자 생성 요청을 거부할 수 있습니다.

사용자는 /sbin/nologin 셸을 사용하여 비 대화식 시스템 사용자로 생성됩니다. 이러한 생성은 EB 서비스의 설계에 의한 것이므로 수정할 수 없습니다.

예시: 'group1', 'group2' 그룹에 속하며 사용자 ID는 50, 홈 디렉토리 경로는 '/tmp'를 사용하는 'myuser' 사용자 생성

users:
  myuser:
    groups:
      - group1
      - group2
    uid: "50"
    homeDir: "/tmp"

4. 소스 (sources)

sources 키를 사용하면 퍼블릭 URL에서 파일을 다운로드하여 EC2 인스턴스의 대상 디렉터리에 압축을 풉니다.

지원되는 형식은 tar, tar+gzip, tar+bz2 및 zip 이며, 퍼블릭 액세스가 허용된 Amazon S3의 URL (예: https://mybucket.s3.amazonaws.com/myobject) 등의 URL을 참조할 수 있습니다.

예시: EC2 인스턴스의 '/etc/myapp' 경로에 S3 버킷의 URL로부터 파일을 다운로드하여 압축 해제

sources:  
  /etc/myapp: https://mybucket.s3.amazonaws.com/myobject

5. 파일 (files)

files 키를 사용하면 EC2 인스턴스에 파일을 생성하거나 다운로드할 수 있습니다.

생성할 파일의 내용을 직접 정의하거나 위 source 키와 유사하게 URL에서 내용을 가져올 수 있습니다.

추가로, files 키를 통해서는 인스턴스 프로파일을 통한 인증으로 Amazon S3 버킷의 프라이빗 파일을 다운로드할 수도 있습니다.

파일은 사전 순서로 처리되며, 지정한 파일 및 경로가 인스턴스에 이미 존재하는 경우, 기존 파일의 이름에 .bak 확장자를 추가하여 새 파일과 기존 파일을 모두 보존합니다.

예시: 위에서부터 차례로 특정 URL으로부터 파일을 다운받는 방법, 'this is my file content'를 담는 파일을 생성하는 방법, 특정 파일을 참조하는 심볼릭 링크 파일을 생성하는 방법

files:
  "/home/ec2-user/myfile0" :
    mode: "000755"
    owner: root
    group: root
    source: http://foo.bar/myfile
 
  "/home/ec2-user/myfile1" :
    mode: "000755"
    owner: root
    group: root
    content: |
      this is my
      file content

  "/home/ec2-user/myfile2" :
    mode: "120400"
    content: "/home/ec2-user/myfile0"

추가 예시: 인스턴스 프로파일을 통한 인증으로 Amazon S3 버킷의 프라이빗 파일 다운로드

Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:				<-- 'Authentication' 자원 정의
          type: "s3"
          buckets: ["S3_BUCKET_NAME"]	<-- 파일을 받을 S3 버킷 이름 명시
          roleName:			<-- S3 버킷 권한 인증에 사용할 인스턴스 프로파일 정의
            "Fn::GetOptionSetting":
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role"

files:
  "/tmp/data.json" :
    mode: "000755"
    owner: root
    group: root
    authentication: "S3Auth"	<-- 위 'Authentication' 자원을 통한 인증 후 파일 다운로드
    source: https://S3_BUCKET_NAME.s3-REGION.amazonaws.com/FILE_NAME

6. 명령 (commands)

commands 키를 사용하면 EC2 인스턴스에서 명령어를 실행할 수 있습니다. 본 키에서 정의된 명령어는 애플리케이션 및 웹 서버가 설정되고 애플리케이션 버전 파일이 추출되기 전에 실행됩니다.

명령어는 루트 사용자로 실행되며, 여러 명령어가 정의된 경우 알파벳 (사전) 순서대로 실행됩니다.

또한 명령어는 기본적으로 루트 디렉터리에서 실행되지만, cwd 옵션을 사용하면 이를 변경할 수 있습니다.

env 옵션을 사용하면 기본 환경 변수 목록을 새로운 환경 변수 목록으로 덮어쓸 수 있으며, test 옵션을 사용하면 EB 환경 운영을 위해 꼭 true (0)를 exit code로 반환해야 하는 명령어를 지정할 수 있습니다.

예시: commands 키를 활용하여 python을 설치하는 방법

commands:
  python_install:
    command: myscript.py	<-- 실행할 명령어 정의
    cwd: /home/ec2-user		<-- 기본 루트 경로에서 '/home/ec2-user'으로로 실행 경로 변경
    env:					<-- 기본 환경 변수 목록을 아래 변수 목록으로 덮어씌우기
      myvarname: myvarvalue
    test: "[ -x /usr/bin/python ]"	<-- EB 환경 운영을 위해 꼭 0을 반환해야 하는 명령어 정의

추가 예시 1: 여러 명령어 목록을 정의하는 방법

commands:
  command1:
    command: git commit -m "This is a comment."
  command2:
    command: "git commit -m \"This is a comment.\""
  command3:
    command: 'git commit -m "This is a comment."'
  command4:
    command:
      - git
      - commit
      - -m
      - This is a comment.

추가 예시 2: 여러 명령어를 한번에 정의하는 방법

commands:
  command block:
    command: |
      git commit -m "This is a comment."
      git push

7. 서비스 (services)

services 키를 사용하면 EC2 인스턴스 부팅 시에 시작하거나 중지할 서비스를 정의할 수 있습니다.

services 키 하위에 정의된 files, sources, packages 등의 항목에 정의된 내용에 해당하는 이벤트 발생 시에 서비스가 시작/중지될 필요가 있는 경우 본 키를 활용합니다.

예시: 특정 서비스에 대하여 services 키를 정의하여 서비스 Run/Start 여부와 Restart 트리거 설정

services:
  sysvinit:
    service_to_start:
      ensureRunning: true	<-- 'true' 정의 시 EB 환경 작업 완료 후 서비스 Run
      enabled: true			<-- 'true' 정의 시 인스턴스 부팅 이후 서비스 Start
      files:				<-- 'files' 목록의 파일에 변화가 생기면 서비스 Restart
        - "/etc/init.d/service_to_start"
      sources:				<-- 'sources' 목록의 디렉토리에 파일 압축을 풀면 서비스 Restart
        - "/var/app/current/"
      packages:				<-- 'packages' 항목의 패키지 업데이트 시 서비스 Restart
        yum:
          nginx: []
          libcurl: []
      commands:				<-- 'commands' 목록의 명령어 실행 시 서비스 Restart
        - "nginx"
        - "curl"

8. 컨테이너 명령 (container_commands)

container_commands 키를 사용하면 commands 키와 같이 EC2 인스턴스에서 명령어를 실행합니다.

다만 본 키에서 정의된 명령어는 '애플리케이션과 웹 서버를 설정하고 애플리케이션 버전 아카이브의 압축을 해제'한 이후, 그리고 '애플리케이션 버전을 배포'하기 전에 실행됩니다.

commands 키의 명령어와 다른 커스텀 작업은 애플리케이션 소스 코드 압축 해제 작업 이전에 수행되므로 애플리케이션 소스 코드에 대하여 작업을 수행하려면 container_commands 키를 활용해야 합니다.

container_commands 명령어 역시 루트 사용자로 실행되며, 여러 명령어를 정의하는 경우 알파벳 (사전) 순서대로 실행됩니다.

실행 경로는 기본적으로 준비 디렉토리 (소스 코드를 애플리케이션 서버에 배포하기 이전에 압축 해제하는 경로)이지만 cwd 옵션을 사용하면 이를 변경할 수 있습니다.

또한 env 옵션을 사용하여 기본 환경 변수 목록을 새로운 환경 변수 목록으로 덮어쓰거나 test 옵션으로 주어진 명령어의 결과가 true (0)일 때에만 container_commands 명령어가 실행되도록 할 수 있습니다.

만약 여러 EC2 인스턴스가 있어 리더로 선출된 하나의 인스턴스에서만 명령어가 수행되길 희망하시는 경우에는 leader_only 옵션을 사용할 수 있습니다.

단, test 옵션과 leader_only 옵션은 함께 사용될 경우 leader_only 옵션이 우선하므로 이 점에 유의해야 합니다.

또한 leader_only 옵션이 사용된 container_commands 명령어는 EB 환경 생성과 배포 시에만 실행되며, 인스턴스가 새로 프로비저닝되거나 AMI ID나 인스턴스 유형 변경과 같은 업데이트 작업이 있더라도 실행되지 않음 역시 유의해야 합니다.

예시: container_commands 명령어를 정의하는 다양한 방법

container_commands:
  collectstatic:
    command: "django-admin.py collectstatic --noinput"
  01syncdb:
    command: "django-admin.py syncdb --noinput"
    leader_only: true
  02migrate:
    command: "django-admin.py migrate"
    leader_only: true
  99customize:
    command: "scripts/customize.sh"
    test: 

.ebextensions 구성 파일을 Linux OS 기반의 EB 환경에 적용하는 방법

위의 여러 키를 활용하여 정의한 .ebextensions 구성 파일은 EB 애플리케이션 소스 번들의 루트 디렉토리의 '.ebextensions' 아래에 위치하도록 하면 EB 환경에서 자동으로 소스 번들 파일에서 이를 확인하여 처리합니다.

~/your-app-directory/
|— .ebextensions	← *.config 파일을 다음 위치 아래에 위치하도록 합니다.
|     |-- 00_init_jobs.config
|     |-- 50_set_env.config
|     └-- 99_backup_app.config
| 
└-- other application files or directories

이상 본 기사에서는 Linux OS 기반의 EB 환경에 대해서 수정 및 확장 작업을 수행할 수 있도록 해주는 .ebextensions 구성 파일에서 지원하는 여러 키에 대하여 알아보았습니다.

일반적으로 사용되는 .ebextensions 구성 파일의 예제는 Elastic Beanstalk 구성 파일 리포지토리 문서를 통해서도 찾아볼 수 있습니다.

본 기사가 re:Post 커뮤니티의 모든 사용자에게 도움이 되길 바라며, .ebextensions 구성 파일 사용과 관련하여 보다 전문적인 지원이 필요한 경우 AWS Premium Support에 도움을 요청해 주시길 바랍니다.

profile pictureAWS
지원 엔지니어
게시됨 2달 전780회 조회
댓글 없음

관련 콘텐츠