Elastic Beanstalk 環境カスタマイズメモ

# 概要
Elastic Beanstalk 使ってますか？
アプリケーションのデプロイがとても簡便になるため、オススメです。

最近では Docker にも対応し、Immutable Infrastructure とも相性が良いです。

本稿では Docker on Elastic Beanstalk で作成した環境をカスタマイズする方法について述べます。

# 前提

- Elastic Beanstalk を利用してアプリケーションが動作する状態であること
- [AWS Elastic Beanstalk Command Line Tool](http://aws.amazon.com/code/6752709412171743) をインストール済みであること

# 環境のカスタマイズ① - オートスケーリング等インフラ全体の設定

## カスタマイズ方法

`.elasticbeanstalk` 配下に生成される `optionsettings.yourapp-env` ファイルを変更します。

設定可能なパラメータはこちらから: [オプションの値 - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options.html)

### 例: autoscaling の MaxSize/MinSize を変更

```bash:.elasticbeanstalk/optionsettings.yourapp-env
[aws:autoscaling:asg]
MaxSize=4
MinSize=1
```

### 例: ELB の subnet を変更

```bash:.elasticbeanstalk/optionsettings.yourapp-env
[aws:ec2:vpc]
VPCId=vpc-xxxxxxxx
ELBScheme=public
ELBSubnets=subnet-xxxxxxxx
```

## 反映方法

`eb update` を実行することで反映されます。

```bash
$ eb update
Warning. File "config" has incorrect access permission and can be accessed by other users.
Update environment? [y/n]: y
Updating environment "yourapp-env". This may take a few minutes.
2014-09-30 14:31:27	INFO	Updating environment yourapp-env's configuration settings.
2014-09-30 14:32:10	INFO	Successfully deployed new configuration to environment.
2014-09-30 14:32:10	INFO	Environment update completed successfully.
Update of environment "yourapp-env" has completed.
```

![スクリーンショット 2014-09-30 14.38.08.png](https://qiita-image-store.s3.amazonaws.com/0/7823/9a3876dd-09aa-9080-4d3b-661310658cda.png)


# 環境のカスタマイズ② - ミドルウェアのインストール等、インスタンス単位の設定

サーバに共通した設定やミドルウェアをインストールしたい場合があるかと思います。
わざわざ IMAGE を作成せずとも、設定ファイルを作成するだけで対応することが可能です。

## カスタマイズ方法

`.ebextensions` 配下に `*.config` というファイルを配置することで、環境のカスタマイズが行われます。
これらはファイル名の昇順で実行されます。

参考: [AWS Elastic Beanstalk 環境のカスタマイズと設定 - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers.html)

### 例: swap 領域の確保

デフォルトでは t2.micro インスタンスには swap 領域がありません。
すぐに OOM エラーとなってしまうので作ってあげます。

```yaml:.ebextensions/00_add_swap.config
commands:
  01_enable_sudo:
    command: "echo Defaults:root !requiretty >> /etc/sudoers"
    test: "test ! -e /home/ec2-user/swapdone"
  02_dd:
    command: "sudo dd if=/dev/zero of=/swapfile bs=1M count=1024"
    test: "test ! -e /home/ec2-user/swapdone"
  03_mkswap:
    command: "sudo mkswap /swapfile"
    test: "test ! -e /home/ec2-user/swapdone"
  04_swapon:
    command: "sudo swapon /swapfile"
    test: "test ! -e /home/ec2-user/swapdone"
  05_swapdone:
    command: "touch /home/ec2-user/swapdone"
    test: "test ! -e /home/ec2-user/swapdone"
```

参考: [Amazon EC2 t1.micro インスタンスでswapを使用する - blogですかい](http://oh-sky.hatenablog.com/entry/2013/05/18/104416)


### 例: NewRelic のインストール

サーバ監視のため NewRelic エージェントを導入します。

```yaml:.ebextensions/01_newrelic.config
packages:
  yum:
    newrelic-sysmond: []
  rpm:
    newrelic: http://download.newrelic.com/pub/newrelic/el5/i386/newrelic-repo-5-3.noarch.rpm
commands:
  01_configure_new_relic:
    command: nrsysmond-config --set license_key=YOUR-LICENSE-KEY
  02_start_new_relic:
    command: /etc/init.d/newrelic-sysmond start

```

### 例: Shellshock 対応

2014-09-30 現在、EB 上のインスタンスが参照するリポジトリには最新版の bash が置かれていません。
手動で bash の rpm を追加し、インストールしてあげます。

```yaml:.ebextensions/02_update_bash.config
packages:
  yum:
    bash: []
  rpm:
    bash: http://packages.us-east-1.amazonaws.com/2014.03/updates/e10f5b547e18/x86_64/Packages/bash-4.1.2-15.19.amzn1.x86_64.rpm
```

参考: [ElasticBeanstalk - Shellshock 対応 @ Elastic Beanstalk - Qiita](http://qiita.com/kakipo/items/dc038768f04e4374f6e3)

## 反映方法

`git aws.push` を実行することで反映されます。

```bash
$ git aws.push
Updating the AWS Elastic Beanstalk environment yknot-staging...
Environment update initiated successfully.
```

![スクリーンショット 2014-09-30 14.27.01.png](https://qiita-image-store.s3.amazonaws.com/0/7823/484d82b2-abf3-0599-aed6-c750e063098b.png)



# 参考

- [AWS Elastic Beanstalk 環境のカスタマイズと設定 - AWS Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers.html)
- [ElasticBeanstalk - Shellshock 対応 @ Elastic Beanstalk - Qiita](http://qiita.com/kakipo/items/dc038768f04e4374f6e3)
- [AWS Elastic Beanstalk Command Line Tool : Sample Code & Libraries : Amazon Web Services](http://aws.amazon.com/code/6752709412171743)
- [Amazon EC2 t1.micro インスタンスでswapを使用する - blogですかい](http://oh-sky.hatenablog.com/entry/2013/05/18/104416)