# Elastic Beanstalk

Elastic Beanstalk (EB)는 인프라에 대한 지식 없이 웹 어플리케이션을 배포하고 조정할 수 있는 서비스이다. 템플릿에 따라 필요한 AWS 컴포넌트가 자동으로 설치된다.

### EB CLI

콘솔에서 작업해도 되지만, Elastic Beanstalk CLI를 설치해 터미널에서 작업할 수도 있다.

```
eb init # EB를 새로 시작한다.
eb create dev-env # 현재 폴더를 압축해 S3에 업로드한다. 해당 압축 파일을 가지고 새 환경을 만든다. 
eb deploy # 현재 폴더를 압축해 S3에 업로드한다. 해당 압축 파일을 가지고 기존 환경을 업데이트한다.

eb open # app이 실행 중인 창을 띄운다.
eb status # 현재 상태를 표시한다.
eb health # --refresh # 리소스 health 정보를 표시한다.
eb logs # 인스턴스들의 모든 어플리케이션 로그를 가져온다.
```

### 환경 구성 공유하기

우리는 환경별로 구성을 변경해 어플리케이션을 제어한다. EB는 현재 환경 구성을 스냅샷 찍을 수 있는 기능을 제공한다.

```
eb config save <env> -cfg <config_name> # 현재 환경 구성을 저장하고 구성 파일을 로컬에 저장한다.
eb config <env> -cfg <config_name> # 현재 환경에 원하는 '저장된 구성'을 적용한다.
eb setenv ENABLE_BLABLA=true # 현재 환경의 구성을 변경한다.

# 환경 구성 파일을 변경하고 해당 명령을 실행하면, 환경 구성이 업데이트된다.
eb config put <config_name> 
```

리전을 옮기거나 새로운 어플리케이션에 구성을 적용할 때, ‘저장된 구성'을 활용하면 빠르게 적용할 수 있다.

### .ebextensions

EB의 고급 설정 파일이다. 어플리케이션의 설정을 변경할 수 있고, CFN으로 생성할 수 있는 모든 리소스를 생성할수 있다.

```
Resources:
	... # 리소스 생성
option_settings:
	... # EB 설정 변경
```

- `.ebextensions` 폴더에 `config` 확장자 파일에만 적용

- `get-config` : 인스턴스에서 EB 설정을 확인하는 명령어

**구성 우선순위**

1. 환경에 직접 적용된 설정 : 생성, 업데이트할 때 설정

2. 저장된 구성

3. 구성 파일 (.ebextensions)

4. 디폴트 값

5. 

**commands & container_commands**

- **commands** : app이나 웹 서버가 설정되기 전 / app 버전 파일이 추출되기 전에 실행

- **container_commands** : app이나 웹 서버가 설정된 후 / app 버전 파일이 추출된 후 / app 버전을 배포하기 이전에 실행

```
# .ebextensions/
commands:
  python_install:
    command: myscript.py
    cwd: /home/ec2-user

container_commands:
	database_migration:
    command: 'echo "do migration"'
		leader_only: true # 오직 한 인스턴스에서만 실행
```

### 배포 전략

> 배포 과정과 장단점을 외우기보다 느껴야 한다…!

- **All at once** : 인스턴스들 전부 한 번에 업데이트

- **Rolling** : 인스턴스들 중 몇 개씩 묶어서 한 묶음 끝나면 다음 거 업데이트

- **Rolling with additional batches** : 새 인스턴스 몇 개 배포한 후 Rolling을 진행. 전체 실행 중인 인스턴스 수가 늘 동일하다.

- **Immutable** : 새 ASG 안에 새 인스턴스를 만들고, 기존의 ASG와 완전히 교체

- **Blue / Green **: Immutable처럼 ASG를 하나 만들고, Route53을 통해 트래픽을 조절하는 방식. 기존 ASG로 가는 트래픽을 점진적으로 줄인다. EB에서 **Swap Env URLs** 기능을 지원한다.

### Worker Environment

- **Web server env** : 웹 서버용

- **Worker env** : cron 작업 혹은 장시간 동작해야 하는 워크로드용

워커 환경은 SQS queue와 DLQ가 기본으로 설치된다. 어플리케이션은 queue에서 작업을 가지고 온다.

### Docker

EB Platform에는 두 가지 도커 플랫폼을 지원한다.

- **Docker** : 하나의 컨테이너만 돌린다.

- **Multi-container Docker** : 하나의 EC2에 여러 도커 컨테이너를 돌린다. `Dockerrun.aws.json`에 컨테이너 정보를 정의한다.

### 추가 내용

- RDS 같이 EB가 지워질 때 같이 지워지면 안되는 리소스는 어떻게 해야 할까? → 따로 RDS를 만들고 arn이나 name을 주입한다.

- 최대 1000개의 버전까지만 저장 가능 → 버전 생명 주기를 설정해야 한다.

- **Rebuild :** 전부 지우고 다시 만들 수 있다.

- **Manged update** : 특정 시간대에 자동으로 업데이트 가능하다

For the site tree, see the [root Markdown](https://slashpage.com/kaonmir.md).
