ElasticBeanstalk .ebextensions 逆引き辞典


ElasticBeanstalkの設定やカスタマイズをする .ebextensions 以下のファイルですが、
これをやるにはどうすんの？というのをいちいち調べないとできないので、調べてやってみた結果を逆引き形式でまとめます。複数のやり方があるので、これがイケてるかどうかは分かりません。

思いつき次第追記していきます。

# 01. yumでパッケージをインストールする

書くファイル: .ebextensions/01.xxx.config

```
packages:
  yum:
    git: []

```

# 02. timezone を変更する

書くファイル: .ebextensions/01.xxx.config

```
commands:
  01-set_timezone:
    command: cp /usr/share/zoneinfo/Japan /etc/localtime
```

# 03. td-agentをインストールする

* [td-agent2をAWS Elastic Beanstalkにデプロイする ｜ Developers.IO](http://dev.classmethod.jp/cloud/td-agent2-elastic-beanstalk/)
* [github:treasure-data/elastic-beanstalk-td-agent](https://github.com/treasure-data/elastic-beanstalk-td-agent)



# 04. newrelic のagentをインストールする

[Amazon Web Services (AWS) users | New Relic Documentation](https://docs.newrelic.com/docs/accounts-partnerships/partnerships/partner-based-installation/amazon-web-services-aws-users)

書くファイル: .ebextensions/01.newrelic-install.config

```
packages:
  yum:
    newrelic-php5: []
  rpm:
    newrelic: http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
commands:
  configure_new_relic:
    command: newrelic-install install
    env:
      NR_INSTALL_SILENT: true
      NR_INSTALL_KEY: [INSERT LICENSE KEY]
```

# 05. mackerelのagentをインストールする

https://gist.github.com/hakobera/897fd96ba2d3c7b112a6


# 06. ドキュメントルートを指定する

書くファイル: .ebextensions/01.xxx.config

```
option_settings:
  - namespace: aws:elasticbeanstalk:container:php:phpini
    option_name: document_root
    value: /public
```

# 07. root volume のサイズを変更する

デフォルトだと 8GBですが、少なすぎる場合は大きくする。

書くファイル: .ebextensions/01-change-root-volume-size.config

```
option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: RootVolumeSize
    value: "20"
  - namespace: aws:autoscaling:launchconfiguration
    option_name: RootVolumeType
    value: gp2
```

※ 2015/06/19 書き方が古いとのことで修正しました。

# 08. php.ini を設定する

### option_settings で指定する場合



いくつかの設定項目は、option_settings で指定できる。
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html#command-options-php


指定できる項目は下記

* document_root
* memory_limit
* zlib.output_compression
* allow_url_fopen
* display_errors
* max_execution_time
* composer_options


（記述例）

```
option_settings:
  - namespace: aws:elasticbeanstalk:container:php:phpini
    option_name:＜オプション名＞
    value: ＜値＞
```

### 独自の php.ini を設置する場合

上記の option_settingsにない項目を設定したい場合は、独自のiniファイルを作って、php.ini置き場に置けばよい。

（あとで書く）



# 09. cronを設定する

書くファイル: .ebextensions/99.install-crontab.config

```
    "/opt/elasticbeanstalk/hooks/appdeploy/enact/99-install-crontab.sh" :
        mode: "000777"
        owner: ec2-user
        group: ec2-user
        content: |
            #!/usr/bin/env bash

            cp -f /var/app/ondeck/crontab/ec2-user /etc/cron.d/ec2-user
            chmod 644 /etc/cron.d/ec2-user
```

これは、＜プロジェクトディレクトリ＞/crontab/ec2-user というファイルに cronの内容を書いておいて、それを /etc/cron.d/ にコピーする方法です。

crontab/ec2-user のファイルの中身は普通の crontabの記述とは違って下記のような感じです。

```
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=ec2-user
HOME=/

*/30 * * * * ec2-user ＜実行するコマンド＞
```


# 10. ec2インスタンスにタグ付けする

(あとで書く）

# 11. instance profile を指定する

```
$ eb create ＜環境名＞ \
    --instance_profile   ＜IAMロール＞ \
```

# 12. vpc 内に起動する

Environment生成時に指定する方法

```
$ eb create ＜環境名＞ \
    --vpc.id             vpc-xxxxxxxx \
    --vpc.ec2subnets     subnet-xxxxxxxx \
```


# 13. vcpのセキュリティグループを指定する

Environment生成時に指定する方法

```
$ eb create ＜環境名＞ \
    --vpc.id             vpc-xxxxxxxx \
    --vpc.ec2subnets     subnet-xxxxxxxx \
    --vpc.securitygroups sg-xxxxxxxx \
```


# 14. インスタンスの鍵を指定する

### Environment生成時に指定する方法

```
$ eb create ＜環境名＞ \
    --keyname  ＜キー名＞ \
```

### option_settings で指定する方法

```
option_settings:
  - namespace:   aws:autoscaling:launchconfiguration
    option_name: EC2KeyName
    value:       MyKeyName
```

# 15. cname を指定する

Environment生成時に指定する方法

```
$ eb create ＜環境名＞ \
    --cname     ＜CNAME＞ \
```

CNAMEは、 xxxx.elasticbeanstalk.com の xxxx の部分になる。

# 16. deploy時に composer update する (PHP)

(あとで書く)

# 17. カスタムAMIを使う

https://www.hands-lab.com/tech/entry/320.html

１）ベースとするBeanstalk のAMIを元にInstanceを立てる（Platform毎にいろいろあるので選択）
２）Instanceをカスタマイズ
３）Instanceを元にAMIを作成
４）Beanstalk の使うAMI を３）に設定

本家ドキュメント
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.customenv.html


# 18. ヘルスチェックのURLを設定する

### option_settings で指定

```
option_settings:
  - namespace:   aws:elasticbeanstalk:application
    option_name: "Application Healthcheck URL"
    value: /check.php
```


# 19. SNSの通知を設定する

### option_settings で指定

```
option_settings:
  - namespace:   aws:elasticbeanstalk:sns:topics
    option_name: "Notification Endpoint"
    value:       hoge@example.com
```

# 20. ELBのHTTPSを設定する（証明書を指定）

### option_settings で指定

```
option_settings:
  - namespace: aws:elb:loadbalancer
    option_name: LoadBalancerHTTPSPort
    value: 443
  - namespace: aws:elb:loadbalancer
    option_name: SSLCertificateId
    value: "arn:aws:iam::xxxxxx:server-certificate/cloudfront/xxxxx/xxxxxxxx"
  - namespace: aws:elb:loadbalancer
    option_name: LoadBalancerSSLPortProtocol
    value: HTTPS
```

# 21. インスタンスタイプを指定する

### Environment生成時に指定する方法

```
$ eb create ＜環境名＞ \
    --instance_type      c3.large 
```


### option_settings で指定

```
option_settings:
  - namespace:   aws:autoscaling:launchconfiguration
    option_name: InstanceType
    value:       t2.micro
```

# 22. AutoScaleのトリガー設定

### option_settings で指定

下記は、2分間のCPU使用率が40%だったら1台増やす、20%だったら1台減らす設定。

```
option_settings:
  - namespace: aws:autoscaling:trigger
    option_name: MeasureName
    value: CPUUtilization
  - namespace: aws:autoscaling:trigger
    option_name: Statistic
    value: Average
  - namespace: aws:autoscaling:trigger
    option_name: Unit
    value: Percent
  - namespace: aws:autoscaling:trigger
    option_name: UpperThreshold
    value: "40"
  - namespace: aws:autoscaling:trigger
    option_name: LowerThreshold
    value: "20"
  - namespace: aws:autoscaling:trigger
    option_name: UpperBreachScaleIncrement
    value: "1"
  - namespace: aws:autoscaling:trigger
    option_name: LowerBreachScaleIncrement
    value: "-1"
  - namespace: aws:autoscaling:trigger
    option_name: BreachDuration
    value: "2"
```

# 23. ファイルをダウンロードして展開する

.ebextensions/xxx.config

```
sources:
  /var/app/current/public/: https://s3-ap-northeast-1.amazonaws.com/xxxxxxx/xxxxxxx.tgz
```

※ /var/app/current/public/ に xxxxxxx.tgz の中身がぶちまけられる。

---------------

# 参考ページ
* [Option Reference - Elastic Beanstalk](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html#command-options-general)
	- たいていここに書いてあります。

* [環境リソースのカスタマイズ - Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-resources.html)

* [InfoQ/設定ファイルでAWS Elastic Beanstalkをカスタマイズする](http://www.infoq.com/jp/news/2012/11/elastic-beanstalk-config-files)