【AWS】Elastic Beanstalkをただただ触ってみただけの話

[この記事は自分のブログからの転載です。](http://blog.nikuniku.me/entry/2015/12/20/183000)

![ElasticBeanstalk](http://cdn-ak.f.st-hatena.com/images/fotolife/m/maaaato/20151220/20151220181756.png)

今回はAWSのサービスの一つであるElastic Beanstalkを触ってみたいと思います。
## Elastic Beanstalkとは
ELB,EC2,AutoScalingがセットになったPaaSです。アプリエンジニアは作成したアプリケーションをElastic Beanstalkにデプロイするだけでサービスを展開出来るので、アプリ開発に集中する事ができます。
現在（2015年12月時点）サポートしているのはJava、.NET、PHP、Node.js、Python、Ruby、Go、Dockerとなっているようです。またElastic Beanstalkで使えるOSはAmazonLinux、Windows Server2012が利用可能です。Ubuntuを普段使っているので、ちょっと残念です。

>Q: AWS Elastic Beanstalk では、どのオペレーティングシステムが使用されますか?
>AWS Elastic Beanstalk は、Amazon Linux AMI および Windows Server 2012 R2 AMI で実行されます。どちらの AMI もアマゾン ウェブ サービスによってサポートされ、管理されます。これらは、Amazon EC2 クラウドコンピューティングのための安定性、セキュリティ、およびパフォーマンスに優れた実行環境を作るように設計されています。

AmazonLinuxだとローカルに環境が作れない（Vagrantなどで）ので、Dockerでデプロイするのが良さそうです。Dockerであれば、ホストOSは気にせず（あまり）にローカルに環境が作れるので、Elastic Beanstalkを使う場合は、Dockerが良さそうです。



まずはこちらの資料を見てもらえるとざっくりとどういうものか分かると思います。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/GsYUoYwpKyhenO" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/AmazonWebServicesJapan/getting-startedwithbeanstalk-20130111" title="はじめての Elastic Beanstalk" target="_blank">はじめての Elastic Beanstalk</a> </strong> from <strong><a href="//www.slideshare.net/AmazonWebServicesJapan" target="_blank">Amazon Web Services Japan</a></strong> </div>

## Elastic Beanstalk用語について

- アプリケーション

>Elastic Beanstalk アプリケーションは、Elastic Beanstalk コンポーネントの論理コレクションで、環境、バージョン、環境設定などがあります。Elastic Beanstalk では、アプリケーションは概念的にはフォルダと似ています。

アプリケーションが大項目としてあり、その下に環境（Production,Staging）が存在するという感じです。

- Application Version
- 
>Elastic Beanstalk では、アプリケーションバージョンとは、ウェブアプリケーションのデプロイ可能コードの特定のラベル付きイテレーションのことです。アプリケーションバージョンは、Java WAR ファイルなどのデプロイ可能コードが含まれている Amazon Simple Storage Service（Amazon S3）オブジェクトを指します。アプリケーションバージョンはアプリケーションの一部です。多数のバージョンがあるアプリケーションもあり、またアプリケーションバージョンはそれぞれ独特です。実行中の環境では、アプリケーションに既にアップロードしたアプリケーションバージョンをデプロイすることも、新しいアプリケーションバージョンをアップロードしてすぐにデプロイすることもできます。複数のアプリケーションバージョンをアップロードして、ウェブアプリケーションの 1 つのバージョンともう 1 つのバージョンの違いをテストすることもできます。

Elastic Beanstalkの画面上でデプロイされたアプリのバージョンが切り替える事が出来るので、ロールバックも簡単。


- 環境
>環境は、AWS リソースにデプロイされるバージョンです。 1 つの環境で実行できるアプリケーションバージョンの数は 1 つのみですが、多数の環境で同じバージョンまたは複数の異なるバージョンを同時に実行することはできます。

Production,Stagingという様に環境を作成することになります。

- ヘルスステータス
![ヘルス](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/images/enhanced-health-dashboard-cause.png "ヘルス")

>AWS Elastic Beanstalk は、複数のソースからの情報を使用して、対象環境が使用可能であり、インターネットへのリクエストを処理中であるかどうかを判断します。環境のヘルスステータスは、4 色のいずれかで表されて、環境ダッシュボードに表示されます。

|色|説明|
|:-----|:-----|
|灰色|環境が更新中です。|
|Green|環境が最新のヘルスチェックで合格になりました。環境内の少なくとも 1 つのインスタンスが使用可能であり、リクエストを受け取っています。|
|黄色|対象環境が 1 つ以上のヘルスチェックで失格になりました。環境へのいくつかのリクエストが失敗しています。|
|赤|対象環境が 3 つ以上のヘルスチェックで失格になったか、環境のリソースが使用不可になっています。リクエストは一貫して失敗しています。|

なにかしら設定を変更するとこのヘルスの状態が変化し、色が変わります。赤色が危険でDegraded、Severeの二種類があります。Severeが最も悪い状態で、この状態になるとインスタンスが再作成されるみたいです。（自分はAutoScalingによるインスタンスの作り直しが発生しました。）

- モニタリング
![モニタリング](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/images/enhanced-health-overview.png "モニタリング")

>[Monitoring] ページには、環境全体の統計（CPU 使用率や平均レイテンシー）が表示されます。全体の統計に加え、時間ごとのリソース使用率を示すモニタリンググラフも表示されます。グラフの任意の場所をクリックして、詳細情報を表示できます。
>Note
>デフォルトでは、基本的な CloudWatch メトリックスだけが有効化されていて、5 分周期でデータを返します。環境の設定を変更することで、より粒度の高い、1 分単位の CloudWatch メトリックスを有効化することもできます。

Elastic BeanstalkのインスタンスはElastic Beanstalkヘルスエージェントなるものがインストールされており、これがメトリクスの収集を行っているみたいです。

![モニタリンググラフ](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/images/enhanced-health-monitoring.png "モニタリンググラフ")

モニタリングで表示する項目は編集可能なので、追加することが出来ます。また拡張ヘルスサポートで追加した項目を表示することも可能です。

- シングルインスタンス環境

>シングルインスタンス環境には、Elastic IP アドレスを使用する 1 つの Amazon EC2 インスタンスが含まれています。シングルインスタンス環境にはロードバランサーがなく、ロードバランシングでオートスケーリングの環境と比べてコストが節約できます。単一インスタンス環境でも Auto Scaling サービスは使用されますが、インスタンスの最小数、インスタンスの最大数、および適切な容量の設定はすべて 1 に設定されています。したがって、アプリケーションで増加する負荷に対応するために新しいインスタンスが起動されるということはありません。
ELB無しで構築する場合はこちらを選択することになります。また、  
>単一インスタンス環境では、Elastic Beanstalk コンソールを使用して Auto Scaling グループの設定を行うことはできません。代わりに、オプションファイルを編集してから、AWS Command Line Interface または Elastic Beanstalk API ベースのコマンドラインインターフェイスを使用してオプションファイルを渡します。

ということなので、設定ファイル（.ebextensions）を設定すればAutoScalingグループの設定ができるようです。

- ロードバランシングでオートスケーリングの環境

>ロードバランシングでオートスケーリングの環境では、Elastic Load Balancing および Auto Scaling サービスを使用して、デプロイしたアプリケーションで必要な Amazon EC2 インスタンスをプロビジョニングします。Auto Scaling は、アプリケーションへの負荷の増大に対応できるように追加インスタンスを自動的に開始します。
こちらはELB有りです。負荷によるAutoScalingのスケールアウトが設定されています。本番環境を構築する場合は、こちらの設定を選択することになると思います。

### アプリケーションの作成数

>Q: AWS Elastic Beanstalk で、いくつのアプリケーションを実行できますか?
>作成できるアプリケーションの数は最大 25、アプリケーションバージョンの数は最大 500 です。デフォルトでは、最大10個の環境を実行できます（全アプリケーションの合計）。AWS を AWS Elastic Beanstalk 以外でも使用している場合は、他の制限に達したことが原因で、作成できる環境の数が10個に満たないこともあります。例えば、デフォルトの AWS アカウントの制限内では、最大 20 個の EC2 インスタンスを起動でき、最大 10 個の Elastic Load Balancing を作成できます。もっとリソースが必要な場合は、AWS Elastic Beanstalk のリクエストフォームを提出すれば、速やかにそれが検討されます。

デフォルトでは10個の環境を作成できるみたいですね。ただ、他の制限（EC2はデフォルトで20インスタンスという制限）に引っ掛かると作成がエラーになってしまうと思うので、事前に作成上限の確認は必要ですね。アプリケーションバージョンの数が最大500という事は、500個のバージョン管理が出来るという意味になります。


## 構築してみた
[[新機能]AWS Elastic BeanstalkがGoをサポートしました！](http://dev.classmethod.jp/cloud/aws/elastic-beanstalk-supported-go/)
こちらを参考にElastic Beanstalkを構築してみました。GUIで操作しましたが、ボタンぽちぽちでELB,AutoScaling,EC2が丸っと構築出来るのは便利ですね。

Goなのでビルドする必要があるのですが、この時にLinux用にビルドしないと動作しません。自分はそのことをすっかり忘れてしまってデプロイして動かないなーとハマってしまいました^^;

```
GOOS=linux GOARCH=amd64 go build -o bin/application sample.go
```

インスタンスにログインしてみた所、デプロイしたアプリケーションはsupervisorでコントロールしているみたいですね。webサーバはnginxを使っている事がわかりました。（Goの場合）  
[サポートされているプラットフォーム](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/concepts.platforms.html)

```
# ps aux
root     23983  0.0  1.9 117232 20028 ?        Ss   10:20   0:00 /usr/bin/python /usr/local/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf --nodaemon
root     24019  0.0  0.1 109192  1948 ?        Ss   10:20   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    24021  0.0  0.6 109712  6596 ?        S    10:20   0:00 nginx: worker process
```

### デプロイ
デプロイはソースコードをzipで固めて、マネジメントコンソールからアップロードしてデプロイするか、S3にアップロードしてデプロイするという方法があります。
また、[EB CLI](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html)をインストールしておけばcliでデプロイが可能です。

### ログ
ログはElastic Beanstalkのページからダウンロード可能で、以下のログを確認すること出来ます。

```
一部抜粋
/var/log/eb-version-deployment.log
/var/log/nginx/error.log
/var/log/web-1.log
/var/log/web-1.error.log
※web-1はアプリ名なので、アプリのログ
```

## まとめ
OSがAmazonLinuxとWindows Server2012と決まってしまっているのは残念ですが、ログの閲覧や拡張ヘルスサポートなど便利なサポートもあるのでなかなか良さそうに感じました。デプロイもローリングデプロイ、一括デプロイと選択出来るもの良いです。
作成した環境のクローンや設定の保存、環境の一括削除も出来るみたいなので、本番、開発環境ともに構築のコストはだいぶ削れそうに思えます。  
.ebextensionsでどこまで設定出来るか気になるので、次は.ebextensionsを調べてみようと思います。


## 参考URL
- [よくある質問](https://aws.amazon.com/jp/elasticbeanstalk/faqs/)
- [AWS再入門 AWS Elastic Beanstalk編](http://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-aws-re-entering-elasticbeanstalk/)