AWS Elastic Beanstalk を試す

実際に使うには制限が多かったため、参考程度に。
調査も途中で打ち切った。

## 概要

* Elastic Beanstalkを使用したデプロイについて記述する。

## 環境

* AWSが提供しているコマンドラインツールを使用してデプロイする。
* OpenCVやその他パッケージをインストールする
* Railsアプリを起動する

### 制限

* S3の設定等
* コマンドラインツールはproxyを超えられない(2012/12時点)
* デプロイインスタンスはAmazon Linux
* デプロイ対象のコードはscpでec2に転送(コードの自動取得不可)
 * Ubuntuではeb initコマンド途中で失敗した(未調査)
* パッケージのソースからのインストールは不可

## 結果

### できたこと

* Railsアプリのデプロイと起動
* RDSの起動
* yumによるパッケージインストール
* パッケージのソースの取得・解凍
* パッケージのソースからのインストール(途中まで)

### できなかったこと

* OpenCVのインストール
* 実行したい手順はOpenCVのインストール手順の通り
* gmake途中で失敗
 * 途中でプロセスが終了する
 * 原因不明(タイムアウトが考えられるが、ログが出ないため調査断念)
 * EC2インスタンスにログインして手動インストールは可能

## やること

* デプロイ用の環境を構築する
 * AWSが提供しているコマンドラインツールの利用環境の構築
 * アプリ動作環境の設定・構築
* コマンドラインツールでのデプロイ

## デプロイ用環境構築

EC2インスタンス上にコマンドラインツールを使用できる環境を準備する。
以下の環境を構築した。

* OS : Amazon Linux
* パッケージ : openssl-devel, python (2.7 or 3.0)

### 構築手順

#### デプロイ作業用のEC2インスタンスを作成する
* Management Consoleで作成する
 * 22番ポートだけ開けておく
* 作成したEC2インスタンスにsshでログインして作業する

* Python インストール
 * デプロイ用コマンドラインツールに必要

```
## EC2 : Amazon Linux
$ sudo yum install zlib zlib-devel tk-devel tcl-devel sqlite-devel ncurses-devel gdbm-devel readline-devel bzip2-devel db4-devel gcc make openssl openssl-devel
$ mkdir -p src/python
$ cd src/python
$ wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
$ tar xvfz Python-2.7.3.tgz
$ cd Python-2.7.3
$ ./configure --prefix=/usr/local
$ make
$ sudo make altinstall
$ python2.7  #=> Python 2.7.3
```

* コマンドラインツールをインストールする

```
$ mkdir -p src/aws
$ cd src/aws/
$ wget https://s3.amazonaws.com/elasticbeanstalk/cli/AWS-ElasticBeanstalk-CLI-2.2.zip
$ unzip AWS-ElasticBeanstalk-CLI-2.2.zip
$ mkdir ~/.aws
$ vi ~/.aws/credentials
---------------------------------------------------------------------------------------
# 以下を記載
AWSAccessKeyId=***************
AWSSecretKey=*************
---------------------------------------------------------------------------------------

$ vi ~/.bash_profile
---------------------------------------------------------------------------------------
# 以下を記載
export PATH=$PATH:/home/ubuntu/src/aws/AWS-ElasticBeanstalk-CLI-2.2/eb/linux/python2.7
export AWS_CREDENTIAL_FILE=/home/ubuntu/.aws/credentials
---------------------------------------------------------------------------------------
 
$ source ~/.bash_profile
$ eb --version
 
# Pythonを2.7に切り替える
$ sudo mv /usr/bin/python{,.bak}
$ sudo ln /usr/local/bin/python2.7 /usr/bin/python
$ python --version  #=> Python 2.7.3
```

#### アプリ動作環境の設定・構築

* アプリコードを取得する
 * 作業はデプロイ用EC2インスタンスで行う
 * 配置・転送は省略(/home/ec2-user/worksapce下に配置済みとする)

#### Elastic Beanstalkにアプリ・環境情報を登録する

```
$ cd ~/workspace/app-test
$ eb init
Enter your AWS Access Key ID (current value is "AKIAI*****NVDVA"): 
Enter your AWS Secret Access Key (current value is "hMJAT*****GhhXB"): 
... 
Select:  (1 to 8): 6
Enter an AWS Elastic Beanstalk application name (auto-generated value is "sample"): hello
Enter an AWS Elastic Beanstalk environment name (auto-generated value is "hello-env"): 
... 
Select:  (1 to 16): 16
Create an RDS DB Instance? [y/n]: y
...
Enter an RDS DB master password: ******
...
Retype password to confirm: ******
```

* RDSは以下のように作成される(後でManagement Consoleから変更可能。コマンドラインツールでの詳細設定は未調査)
 * Database engine — MySQL
 * Default version: — 5.5
 * Database name: — ebdb
 * Allocated storage — 5 GB
 * Instance class — db.t1.micro
 * Deletion policy — delete
 * Master username — ebroot

* アプリ動作環境を作成する
 * RDSのインスタンス名をメモする(デプロイ時にconfig/database.ymlを修正する)
 * 以下では"aa128zo655y85tn"になる

```
$ cd ~/workspace/app-test
$ eb start
Starting application "app-test".
Waiting for environment "app-test-env" to launch.
2012-12-25 23:51:53	INFO	createEnvironment is starting.
2012-12-25 23:52:00	INFO	Using elasticbeanstalk-ap-northeast-1-619341967903 as Amazon S3 storage bucket for environment data.
2012-12-25 23:52:30	INFO	Created load balancer named: awseb-e-w-AWSEBLoa-1BOFG1F6123VP
2012-12-25 23:52:35	INFO	Created security group named: awseb-e-wpgesqicai-stack-AWSEBSecurityGroup-18IDGFQDF2L8T
2012-12-25 23:52:38	INFO	Creating RDS database named: aa128zo655y85tn. This may take a few minutes.
2012-12-25 23:57:31	INFO	Created RDS database named: aa128zo655y85tn
2012-12-25 23:57:38	INFO	Created Auto Scaling launch configuration named: awseb-e-wpgesqicai-stack-AWSEBAutoScalingLaunchConfiguration-1BUTQV8X66YQD
2012-12-25 23:58:38	INFO	Waiting for EC2 instances to launch. This may take a few minutes.
2012-12-25 23:58:38	INFO	Created Auto Scaling group named: awseb-e-wpgesqicai-stack-AWSEBAutoScalingGroup-1CUCIE9KUNCHD
2012-12-25 23:58:40	INFO	Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:619341967903:scalingPolicy:14349546-ad28-4469-a256-1c3000154215:autoScalingGroupName/awseb-e-wpgesqicai-stack-AWSEBAutoScalingGroup-1CUCIE9KUNCHD:policyName/awseb-e-wpgesqicai-stack-AWSEBAutoScalingScaleDownPolicy-QQBXVZOQ0XTV
2012-12-25 23:58:42	INFO	Created CloudWatch alarm named: awseb-e-wpgesqicai-stack-AWSEBCloudwatchAlarmLow-Q4UTHFA2AS1J
2012-12-25 23:58:45	INFO	Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:619341967903:scalingPolicy:a608a646-b20a-43ad-a135-de913f12ee15:autoScalingGroupName/awseb-e-wpgesqicai-stack-AWSEBAutoScalingGroup-1CUCIE9KUNCHD:policyName/awseb-e-wpgesqicai-stack-AWSEBAutoScalingScaleUpPolicy-AWR4XHK7XXL1
2012-12-25 23:58:47	INFO	Created CloudWatch alarm named: awseb-e-wpgesqicai-stack-AWSEBCloudwatchAlarmHigh-1BJZLOUEJGV54
2012-12-26 00:03:07	INFO	Application available at app-test-env-z3kprnuw6j.elasticbeanstalk.com.
Application is available at "app-test-env-z3kprnuw6j.elasticbeanstalk.com".
```

* デプロイ設定をする
 * RDSのホスト名の修正
 * インストールするパッケージを指定
  * .ebextensions/*.configの設定によるOpenCVのインストールは不可(make途中で失敗してしまう)
   * 手動でインストールする
 * インストールするパッケージを指定

```
$ cd ~/workspace/app-test
 
## RDSのホスト名修正
$ vi config/database.yml
---------------------------------------------------------------------------------------
production
  ...
--  host: app-testdb.cupahpaushqm.ap-northeast-1.rds.amazonaws.com
++  host: ***************.cupahpaushqm.ap-northeast-1.rds.amazonaws.com
---------------------------------------------------------------------------------------

## インストールパッケージ指定
$ vi .ebextensions
---------------------------------------------------------------------------------------
packages:
  yum:
    ImageMagick: []
    ImageMagick-devel: []
    jasper-devel: []
    libpng-devel: []
    cmake: []
    python: []
---------------------------------------------------------------------------------------
 
$ git add .
$ git commit -m "fixed deploy setting"
```

* デプロイする

```
$ git aws.push
```

* OpenCVをインストールする
 * .ebextensions/*.configでのインストールだとmake途中で失敗するので暫定的に手動で行う
 * インストール方法は省略(後日別記事に記載する)

* コードを修正・変更してデプロイする
 * app-test下に .elasticbeanstalk/config, .elasticbeanstalk/optionsettingsを配置しておく
 * Elastic Beanstalkの設定を引き継がせる
 * GitHubからpullできればアプリコードの転送・配置は不要(git pullでok)

```
## Elastic Beanstalkの設定をバックアップする
$ cd ~/workspace/app-test
$ cp -r ~/workspace/app-test/.elasticbeanstalk /tmp/
$ rm -rf ~/workspace/app-test
```
 
## アプリコードをデプロイ用EC2インスタンスに転送する
省略
 
## デプロイする
$ cd ~/workspace/app-test
$ cp -r /tmp/.elasticbeanstalk ~/workspace/app-test/
$ git aws.push
```

* 起動確認 OK
 * その他は未調査