Elastic Beanstalk メモ


## 注意！

この記事は eb cli の ver2の頃の内容のため古いです。
eb cli ver3 については、下記の方が参考になると思います。

[AWS - ElasticBeanstalk .ebextensions 逆引き辞典 - Qiita](http://qiita.com/inouet/items/e8b39962c0de0f866531)


---

ドキュメント
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_PHP_eb.sdlc.html


## やったこと

### 1. CLIツールを入れてパスを通す

http://aws.amazon.com/code/6752709412171743
からダウンロード

解凍したファイルを/usr/local/AWS-ElasticBeanstalk-CLI-2.6.0/に置いて、
.zshrc に下記を追記

```
export PATH=$PATH:/usr/local/AWS-ElasticBeanstalk-CLI-2.6.0/eb/macosx/python2.7/
export PATH=$PATH:/usr/local/AWS-ElasticBeanstalk-CLI-2.6.0/api/bin/
```



### 2. eb init

```
$ eb init

(いろいろ聞かれる)

$ eb start
Starting application "xxxxxxxx".
Would you like to deploy the latest Git commit to your environment? [y/n]: 
Application is available at "xxxxxx-dev-xxxxxx.elasticbeanstalk.com".
```

しばらくして 上記のURLにアクセスすると画面が表示された。

ちょっと編集して commit.

```
$ git aws.push 
```

でデプロイされることを確認。




## ハマリポイント

### 1. eb init の Select a solution stack. で先に進めなくなる。

http://stackoverflow.com/questions/16600746/no-solution-stacks-listed-in-elastic-beanstalk-configuration

```
$ eb init
   :
   :
Select a solution stack.
Available solution stacks are:
Select (1 to 0): 1

```

ここで、何を入れても同じ質問を繰り返される。原因はIAMに権限が不足してる。

### 2. /.elasticbeanstalk/optionsettings.*** の罠

/.elasticbeanstalk/optionsettings.{ApplicationName}* のファイルに下記のような部分があったので、

```
[aws:elasticbeanstalk:container:php:phpini]
allow_url_fopen=On
composer_options=
display_errors=On
document_root=/public
max_execution_time=60
memory_limit=256M
zlib.output_compression=Off
```

下記の項目を追加してみたが反映されない。

```
date.timezone="Asia/Tokyo"
```
どうも、元からある設定項目しか変更できないっぽい。
なので、.ebextensions で php.ini の設定をするようにする。

ちなみに、optionsettings.{ApplicationName}*　のファイルを変更をしたあと、

```
$ eb update
```

とすると、環境のアップデートができる模様。



### 3. .ebextensions に php.ini に値を追加しても反映されない


デプロイ後 apache を再起動するようにした。

```
files:
  "/etc/php-5.5.d/project.ini" :
    mode: "000644"
    owner: root
    group: root
    content: |
      date.timezone="Asia/Tokyo"

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/enact/99_reload_http_server.sh" :
    mode: "000777"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      . /opt/elasticbeanstalk/support/envvars

      service httpd restart

```

datetime.timezone みたいに、PHP_INI_ALL で設定変更が可能なものは、
config.php とかで ini_set() でセットしたほうが良さそう。
php.ini設定が反映されてなくてバグるとか嫌だ。
http://www.php.net/manual/ja/ini.list.php


### 4. AWSマネジメントコンソールで Key pair設定したら deployできなくなった

.elasticbeanstalk/optionsettings.*** のEC2KeyNameを設定してなかったので、不整合が起きたぽい。


```
[aws:autoscaling:launchconfiguration]
EC2KeyName=********* ←　ここに追記
InstanceType=t1.micro
```
こっちにも書いて解決。


### 5. .ebextensions/ の configファイルに composer.phar update 書いてもアップデートできない

/var/log/eb-tools.log というログ見たら

```
sh: git: command not found 
```

というログが出てた。composer ってgit使ってるの？

config ファイルに下記のように書いて解決。

```
packages:
  yum:
      git: []
```


### 6. 何か作業したら git aws.push できなくなった。

何をやったらできなくなったのかが不明…

http://d.hatena.ne.jp/j3tm0t0/20120404/1333531368

↑ここを見てとりあえず、AWSDevTools-RepositorySetup.sh を叩いたら治った。

```
/usr/local/AWS-ElasticBeanstalk-CLI-2.6.0/AWSDevTools/Linux/AWSDevTools-RepositorySetup.sh
```

根本的に何がダメだったのかが分かってないのでなんとかしたい。

### 7. OptionSettingFile フルパス問題 

.elasticbeanstalk/config に記載のある、OptionSettingFile のパスがフルパスで書かれていた。
プロジェクトのディレクトリごと移動した影響でパスが無効になっていたので、いくら optionsettings.*** のファイルをいじって eb update しても反映されなくてはまった。

相対パスじゃだめなのかな…　試してない。



### 8. git aws.push で注釈付きタグがデプロイできない

git aws.push でデプロイする時、タグを指定できるんだけど、注釈付きタグだと
なぜか出来ない。

```
$ git tag -a ver1

$ git aws.push -c ver1
ver1 is a tag. The value of the --commit option must refer to commit
```

おそらく、rev-parse が注釈付きタグの場合コミットのハッシュではなく、
注釈付きタグのハッシュを返すのが原因ぽい。
（普通のタグの場合は コミットのハッシュ値を返す。）



## デプロイ時のコマンド発行順

1. コンフィグファイルの "commands"
2. /opt/elasticbeanstalk/hooks/appdeploy/pre/*
3. コンフィグファイルの "container_commands"
4. /opt/elasticbeanstalk/hooks/appdeploy/enact/*
　→　新バージョン有効化時に行うべき処理（アプリケーション・サーバーの再起動など）

5. /opt/elasticbeanstalk/hooks/appdeploy/post/*
  →　デプロイ後に行うべき処理（バックグラウンドワーカーの起動など）



## 参考

PHP 環境をカスタマイズし設定する
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_PHP_custom_container.html


AWS Elastic Beanstalk で PHP コンテナを設定する
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_PHP.container.html


[AWSマイスターシリーズ] AWS Elastic Beanstalk
http://www.slideshare.net/AmazonWebServicesJapan/aws-aws-elastic-beanstalk
.ebextensions周りの説明が詳しいので参考になる。