SinatraアプリをAWS-EBで動かした

# SinatraアプリをAWS Elastic Beanstalkで動かした
Sinatraアプリを作ってみたけど環境構築が面倒、と思っていたら、ものすごく分かりやすい記事があったので、早速実践しました。
この場を借りて感謝もうしあげます。

* [Qiita] [AWS Elastic Beanstalkの(多分)最速設定](http://qiita.com/soramugi/items/1258127d159703fe731d)  by [soramugi](http://qiita.com/soramugi) 


## やったこと

実際に動かしたSinatraアプリのリポジトリはこれです。

* https://github.com/betahikaru/aws-portal

実行したコマンドなどは、リポジトリのWikiに書きました。

* [Setup to AWS Elastic Beanstalk](https://github.com/betahikaru/aws-portal/wiki/Setup-to-AWS-Elastic-Beanstalk)

はまった箇所は以下です。

* IAM ユーザの権限が足りなかった
* gitのブランチを変えたら何か言われた
* アプリに渡す環境変数

## IAM ユーザの権限が足りなかった
```eb init```コマンドを実行するときに、AWSユーザのKEYとSECRETを入力します。
ここで最低限与えるべき権限が決まっているようです。詳細は参考URLをみてください。
私が動かすSinatraアプリは、DBを使わないので、以下の権限を与えれば大丈夫でした。

* IAM FullAccess 
  * ポリシーファイルとか作るらしい。よく理解していない。
* EC2 FullAccess
  * EC2インスタンス作ったり消したりする。
  * EIP付与したり。
  * ELBとかも選択すれば使うし。
* ElasticBeanstalk FullAccess
  * とりあえず。アプリとか作るし指定しておいた。


> ＜参考＞
> なお、権限が足りないと、以下のような悲しい感じになります。
> 
> ```shell-sesshon
...
Select an environment tier.
Available environment tiers are:
1) WebServer::Standard::1.0
2) Worker::SQS/HTTP::1.0
Select (1 to 2): 1
Select a solution stack.
Available solution stacks are:
Select (1 to 0): 0
Select (1 to 0): 1
Select (1 to 0): 0
Select (1 to 0): -1
Select (1 to 0):
Select (1 to 0): ^C  ←Ctrl+Cで抜けるしかない…
```

## gitのブランチを変えたら何か言われた
Elastic Beanstalkは、gitのブランチごとに別の環境にデプロイできるようです。
masterブランチが本番環境、stagingブランチがステージング環境、などの使い分けができるみたいですね。

ブランチを変える場合、以下のコマンドを実行します。
コマンドを実行すると、環境の名前の入力を求められます。

```shell-session
eb branch
```

結果

```shell-session
% eb branch
The current branch is "tb_eb_getstart".
Enter an AWS Elastic Beanstalk environment name (auto-generated value is "aws-portal-tbebgetstart"):
Do you want to copy the settings from environment "aws-portal-env" for the new branch? [y/n]: y
```


> ＜参考＞
> はじめ、```eb init```をmasterブランチで実行したんですが、masterにいきなりコミットするのは嫌なので、ブランチを切りました。
> しかし、```.gitignore```が変更されているので、とりあえずコミットし、```eb start```したら、「このブランチは設定してねーよ！」とか言われました。
「n」と打ってもアプリの開始はやめてくれなくて開始で５分、停止で５分待ちました。。

> ```
% eb start
The current branch "tb_ebtest" is not associated with an Elastic Beanstalk environment. Call "eb branch" to set up a new environment for this branch.
Proceeding with default settings.
Starting application "aws-portal".
Would you like to deploy the latest Git commit to your environment? [y/n]: n
Waiting for environment "aws-portal-env" to launch.   ←やめて！
2014-05-24 00:24:24	INFO	createEnvironment is starting.
...
```

## アプリに渡す環境変数
今回使うアプリはAWSのRubyのSDK(v2)を使うので、環境変数からIAMユーザのKEYとSECRETを受け取る仕組みになっています。

コマンドなり設定ファイルなりで指定できそうですが、とりあえずマネジメントコンソールから環境変数を設定することが出来ました。
やり方は[Wiki](https://github.com/betahikaru/aws-portal/wiki/Setup-to-AWS-Elastic-Beanstalk#setup-environment-variable-by-management-console)に書きました。

こういったリポジトリに入れる事が出来ない情報は、どうすればいいんですかね。
自動化するときに大きな壁になると思うのですが、みなさんどうしているのでしょう。


# 参考URL

* [Qiita] [AWS Elastic Beanstalkの(多分)最速設定](http://qiita.com/soramugi/items/1258127d159703fe731d)  by [soramugi](http://qiita.com/soramugi) 

* [公式] [Sinatra アプリケーションの AWS Elastic Beanstalk へのデプロイ](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_Ruby_sinatra.html)

* [公式] [Using IAM Roles with AWS Elastic Beanstalk](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.iam.roles.aeb.html) 
  * 英語。日本語版も探せばあるかも。
  * 絶対必要な権限はこれっぽい
```json
"iam:AddRoleToInstanceProfile",
"iam:CreateInstanceProfile",
"iam:CreateRole",
"iam:PassRole",
"iam:ListInstanceProfiles"
```

* [公式] [eb 入門](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-reference-get-started.html)