AWS Beanstalk 구성파일(.ebextensions)을 사용하여 환경 구성하기
AWS Elastic Beanstalk
Beanstalk를 사용하여 어플리케이션을 인프라에 상관없이 AWS클라우드에 배포하고 어플리케이션을 관리할 수 있습니다. 어플리케이션(ex. .war .zip)을 업로드하여 Elastic Beanstalk에서 인스턴스 갯수의 프로비저닝, 로드 밸런싱, 어플리케이션의 상태 모니터링을 손쉽게 설정할 수 있습니다.지원 언어
- Java
- PHP
- .NET
- Node.js
- Python
- Ruby
<AWS Elastic Beanstalk 워크플로우>
구성파일(.ebextensions)
Elastic Beanstalk(이하 EB)는 어플리케이션의 제어 및 관리에 큰 장점이 있지만, 시스템 라이브러리 추가 및 설정 변경 및 Scouter 와 같은 써드파티 프로그램 설치가 어렵다는 단점도 있습니다. 이러한 단점을 보완하기 위해 EB 구성파일(실제로는 디렉토리임)인 .ebextensions을 추가하여 별도의 환경을 구성할 수 있습니다. 구성 파일은.config
파일 확장명을 사용하는 YAML 형식 문서로, .ebextensions
폴더에 놓고 애플리케이션 원본 번들로 배포합니다. 설저파일 추가하기
배포할 어플리케이션 .ebextensions 설정을 추가하고 싶으면 배포될 어플리케이션의 root 디렉토리에 .ebextensions 폴덜르 추가하고 폴더하래에 설정파일을 추가하면 됩니다.
< EB 디텍토리 구조 >
구성파일(.ebextensions)을 어프리케이션(.war) 파일과 하나로 묶어서 배포하면 적용할 수 있습니다.zip -r application.zip application.war .ebextensions
소프트웨어 커스터마이징
어플리케이션이 실행되는 서버에 패키지를 설치하거나, 사용자 혹은 그룹을 생성하거나, 파일을 다운로드하는 등 어플리케이션에서 사용하는 소프트웨어를 설정하기 위해 다음의 키를 사용하여 커스터마이징 할수 있습니다.구성파일(.ebextensions) 다음의 항목의 키를 사용하여 커스터마이징 할수 있습니다.
- 패키지
- 그룹
- 사용자
- 원본
- 파일
- 명령
- 서비스
- 컨테이너 명령
패키지
packages
키를 사용하여 사전 패키지된 애플리케이션 및 구성 요소를 다운로드하고 설치할 수 있습니다.Syntax
packages:
name of package manager:
package name: version
지원되는 패키지
Elastic Beanstalk는 현재 yum, rubygems, python 및 rpm 등의 패키지 관리자를 지원예제코드
packages:
yum:
libmemcached: []
ruby-devel: []
gcc: []
rpm:
epel: http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rubygems:
chef: '0.10.2'
그룹
groups
키를 사용하여 Linux/UNIX 그룹을 생성하고 그룹 ID를 할당할 수 있습니다. 그룹을 생성하려면 새 그룹 이름을 그룹 ID(선택 사항)로 매핑하는 새 키-값 페어를 추가합니다. groups 키에는 하나 이상의 그룹 이름이 포함될 수 있습니다. 다음 표에는 가용 키가 나열되어 있습니다.syntax
groups:
name of group: {}
name of group:
gid: "group id"
option
gid : 그룹 ID 번호, 그룹 ID를 지정했으며 그룹 이름이 이미 존재하는 경우 그룹이 생성되지 않습니다. 다른 그룹에 해당 그룹 ID를 지정한 경우 운영 체제에서 그룹 생성을 거부할 수도 있습니다예제코드
groups: groupOne: {} groupTwo: gid: "45"
user(사용자)
users
키를 사용하여 EC2 인스턴스에서 Linux/UNIX 사용자를 생성할 수 있습니다.syntax
users: name of user: groups: - name of group uid: "id of the user" homeDir: "user's home directory"
option
uid
- 사용자 ID. 다른 사용자 ID의 사용자 이름이 존재하는 경우 생성 프로세스가 실패합니다. 해당 사용자 ID가 기존 사용자에게 이미 할당된 경우 운영 체제에서 생성 요청을 거부할 수 있습니다.
groups
- 그룹 이름 목록. 사용자는 목록의 각 그룹에 추가됩니다.
homeDir
- 사용자의 홈 디렉터리.
/sbin/nologin
셸을 사용하여 비 대화식 시스템 사용자로 생성됩니다. 이러한 생성은 설계에 따른 것이므로 수정할 수 없습니다.예제코드
users: myuser: groups: - group1 - group2 uid: "50" homeDir: "/tmp"
소스(source)
sources
키를 사용하여 퍼블릭 URL에서 아카이브 파일을 다운로드한 후 EC2 인스턴스의 대상 디렉터리에 압축을 풉니다.syntax
sources: target directory: location of archive file
지원되는 형식
지원되는 형식은 tar, tar+gzip, tar+bz2 및 zip입니다. URL에 공개적으로 액세스할 수 있는 한, Amazon Simple Storage Service(Amazon S3)(예:https://s3.amazonaws.com/mybucket/myobject
) 등의 외부 위치를 참조할 수 있습니다예제코드
다음 예제에서는 Amazon S3 버킷에서 퍼블릭 .zip 파일을 다운로드하여/etc/myapp
에 압축을 풉니다.
sources: /etc/myapp: https://s3.amazonaws.com/mybucket/myobject
파일
files
키를 사용하여 EC2 인스턴스에서 파일을 생성할 수 있습니다. 콘텐츠는 구성 파일의 인라인이거나 URL에서 내용을 가져올 수 있습니다. 파일은 사전 순서로 디스크에 작성됩니다.files
키로 권한 부여를 위한 인스턴스 프로파일을 제공하여 Amazon S3에서 프라이빗 파일을 다운로드합니다.syntax
files: "target file location on disk": mode: "six-digit octal value" owner: name of owning user for file group: name of owning group for file source: URL authentication: authentication name: "target file location on disk": mode: "six-digit octal value" owner: name of owning user for file group: name of owning group for file content: | this is my content encoding: encoding format authentication: authentication name:
option
content
content
또는 source
중 하나를 지정하며 둘 다 지정하지 않습니다.source
content
또는 source
중 하나를 지정하며 둘 다 지정하지 않습니다.encoding
content
옵션으로 지정된 문자열의 인코딩 형식.유효한 값:
plain
| base64
group
owner
mode
000444
). symlink에는 처음 세 자리를 사용하고 파일의 설정 권한에는 마지막 세 자리를 사용합니다.authentication
symlink를 사용하는 예제. 기존 파일
/tmp/myfile1.txt
를 가리키는 링크 /tmp/myfile2.txt
를 생성합니다.
files: "/tmp/myfile2.txt" : mode: "120400" content: "/tmp/myfile1.txt"
명령(Command)
commands
키를 사용하여 EC2 인스턴스에서 명령을 실행할 수 있습니다. 명령은 이름을 기준으로 사전순으로 처리되며, 애플리케이션 및 웹 서버를 설정하고 애플리케이션 버전 파일을 추출하기 이전에 실행됩니다.지정된 명령은 루트 사용자로 실행됩니다. 기본적으로 명령은 루트 디렉터리에서 실행됩니다. 다른 디렉터리에서 명령을 실행하려면
cwd
옵션을 사용합니다.syntax
commands: command name: command: command to run cwd: working directory env: variable name: variable value test: conditions for command ignoreErrors: true
option
command
env
cwd
test
command
키에 포함된 셸 스크립트 등 Elastic Beanstalk에서 명령을 처리하려면 반드시 true
값(종료 코드 0)을 반환해야 하는 명령입니다.ignoreErrors
command
키에 포함된 명령이 실패할 경우 다른 명령이 실행되는지 여부를 결정하는 부울 값(0이 아닌 값 반환). 명령이 실패하더라도 명령을 계속 실행하려면 이 값을 true
로 설정합니다. 명령이 실패할 경우 실행 중인 명령을 중지하려면 false
로 설정합니다. 기본 값은 false
입니다.예제코드
commands: python_install: command: myscript.py cwd: /home/ec2-user env: myvarname: myvarvalue test: "[ -x /usr/bin/python ]"
서비스
services
키를 사용하여 인스턴스가 시작될 때 시작하거나 중지할 서비스를 정의할 수 있습니다. services
키를 사용하면 소스, 패키지 및 파일에 대한 종속 항목을 지정할 수 있으므로 설치하려는 파일로 인해 재시작해야 하는 경우 Elastic Beanstalk가 서비스 재시작을 처리합니다.syntax
services: sysvinit: name of service: enabled: "true" ensureRunning: "true" files: - "file name" sources: - "directory" packages: name of package manager: "package name[: version]" commands: - "name of command"
option
ensureRunning
true
로 설정합니다.Elastic Beanstalk가 완료된 후에도 서비스를 실행 중이지 않은 상태로 유지하려면
false
로 설정합니다.서비스 상태를 변경하지 않으려면 이 키를 생략합니다.
enabled
true
로 설정합니다.서비스가 부팅 시 자동으로 시작되지 않도록 하려면
false
로 설정합니다.이 속성을 변경하지 않으려면 이 키를 생략합니다.
files
sources
packages
commands
예제코드
services: sysvinit: myservice: enabled: true ensureRunning: true
컨테이너 명령
container_commands
키를 사용하여 애플리케이션 소스 코드에 영향을 주는 명령을 실행할 수 있습니다. 컨테이너 명령은 애플리케이션과 웹 서버를 설정하고 애플리케이션 버전 아카이브의 압축을 푼 후 애플리케이션 버전을 배포하기 이전에 실행됩니다. 비컨테이너 명령과 기타 사용자 지정 작업은 추출하려는 애플리케이션 소스 코드보다 먼저 수행됩니다.컨테이너 명령은 준비 디렉터리에서 실행됩니다. 준비 디렉터리는 소스 코드를 애플리케이션 서버에 배포하기 이전에 추출하는 곳입니다. 컨테이너 명령을 사용하여 준비 디렉터리에서 소스 코드를 변경한 경우 변경 사항은 코스를 최종 위치에 배포할 때 포함됩니다.
테스트 명령이
true
로 평가될 때 test
를 구성하거나, leader_only
를 사용하여 단일 인스턴스에서 명령을 실행하기만 하면 됩니다. Leader-only 컨테이너 명령은 환경을 생성하고 배포하는 중에만 실행되고, 다른 명령 및 서버 사용자 지정 작업은 인스턴스를 프로비저닝하거나 업데이트할 때마다 수행됩니다. Leader-only 컨테이너 명령은 시작 구성을 변경(예: AMI ID 또는 인스턴스 유형 변경)하더라도 실행되지 않습니다.syntax
container_commands: name of container_command: command: "command to run" leader_only: true name of container_command: command: "command to run"
option
command
env
cwd
leader_only
test
를 포함할 수 있으나, 둘 다 사용할 수 없습니다(leader_only
가 우선 적용됨).test
true
를 반환해야 하는 테스트 명령을 실행합니다. 명령은 leader-only이거나 test
를 포함할 수 있으나, 둘 다 사용할 수 없습니다(leader_only
가 우선 적용됨).ignoreErrors
true
로 설정합니다.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"
댓글
댓글 쓰기