[初心者向け]AWS Elastic Beanstalk

AWS Elastic Beanstalkについてなるべく難しい言葉を使わずに解説します。
分かりやすくするために一部厳密にいえば違うようなことも書いていますが、
あくまでイメージを捕えるためなので鵜呑みにしないでください。
(一応そういう書き方するところは注釈入れてます。)

#1.Elastic Beanstalkとは？
例えば、「AWS上のサーバ上でWEBアプリケーション動かしたいから環境作ってくれ」
上司からこんな指示が出たとしてやるべきことを全部分かっていて迷わずに準備できるWebアプリケーションエンジニアは全体の何%でしょう。

* 可用性高めるためにVPCのサブネットに分割して。。。
* 突然サーバへの負荷が上がった時のためにAutoScallingできるように設定して。。。
* エンドユーザが複数あるサーバを認識できるようにElastic Load Balancingの設定をして。。。
* 物理的に近いリージョンにルーティングしたいからRoute53を設定して。。。
* 各サーバでアプリケーションの動作環境も作らないと。。。
 
考えること・設定しなくちゃいけないことは他にもまだまだあります。
これらを全て完全にこなすのはそれなりの知識・経験が必要だと思います。
Elastic Benstalkはこのようなサーバ構築に関する煩雑な設定を自動でやってくれるサービスです。インフラ系の知識に疎い多くのWEBアプリケーションエンジニアにとって、アプリケーションを開発してElasticBeanstalkに渡すだけで実行できる環境を用意してくれるというのは非常に魅力的に感じられるのではないでしょうか。
余談ですが、こういうサービスに自分の仕事が盗られるとインフラエンジニアの友人が嘆いていました。

### 前提知識
* javaアプリケーションのデプロイを例として扱います。
詳しい書き方などはわからなくても大丈夫です。javaで記述したプログラムコードをビルドするとwarファイルやjarファイルが作成されるくらいの知識を持っておいてください。

* AWSの他のサービスの知識
こちらも詳しく知っている必要はありません。
たまに他のAWSサービスの名前も出てくるのでわからなければ概要だけでもググってみてください。

###用語の定義

* アプリケーション
普段プログラミングなどアプリケーション開発を主にやっている人だとアプリケーションをデプロイすると言われるとサーバ上にWEBアプリケーション(javaだったらwarファイルやjarファイル)を配置することをイメージすると思います。
AWS Elastic Beanstalkではアプリケーションとはサーバ等のインフラ部分を含めたものを指します。
少しややこしいですが、今後この記事内で「アプリケーション」と書いた場合、インフラを含めたものを指すことにします。javaやruby等を使ってプログラミングして作成した成果物を指す際には「WEBアプリケーション」と書くようにします。
つまり、AWS Elastic Beanstalkでアプリケーションをデプロイするということはサーバを構築してネットワークの設定を行い、プログラムの実行環境を作ってWEBアプリケーションを配置して使える状態にするということを指すわけです。

* デプロイ
デプロイのことをリリースと呼ぶ現場もあります。厳密には意味が異なりますが、デプロイ=「リリース」、「展開」、「アプリケーションの配置など」と読み替えてもらっても問題はないと思います。

名前がややこしいですが、ここをハッキリさせておかないと後で詰まると思うので注意してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/257fe1a3-08f6-0604-8a22-7b945056212d.png)


#2.ElasticBeanstalkを使ってみる
マネジメントコンソールでElastic Benstalkの画面を開くとこんな設定画面が出てきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/ddca1d81-fc05-c9d4-4585-131592506649.png)

* アプリケーション名
アプリ名を適当に設定します。  
* プラットフォーム  
≒アプリケーションを開発する言語のようなものです。
(dockerなどのコンテナも選択肢にあるので厳密には違いますが、一旦スルーで。)
今回はJavaを選択しておきます。
* アプリケーションコード
AWSが用意してくれたサンプルアプリケーションを使うか自分で作成したアプリケーションを使うかの選択肢。今回はサンプルコードで。

ここまで入れると「アプリケーションの作成」ボタンで作成できてしまいます。
一度このボタンを押してみましょう。
しばらく待って作成が完了したらその内容を確認してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/052ca95e-50dd-6175-7483-da26ecab94ab.png)

* ソフトウェア  
CloudWatchに出力するログの保存期間やログローテーションなどログファイル自体に関する設定やサーバ内の環境変数(AVA_HOMEなど)の設定
* インスタンス  
今回自動で作られたEC2インスタンスの詳細です。
インスタンスタイプはt1.micro(無料枠で使ってるので助かります...)
OSはLinuxで作成されているようです。
インスタンスにはCloudWatchやS3を扱うためのIAMロールが割り当てられていました。
* 容量  
AutiScallingの設定。
デフォルトの設定ではAutoScallingはしないようになっています。
* ロードバランサー  
今回のサンプルはサーバ1台の構成なのでロードバランサは設定されていません。
AutoScallingを有効にすると自動的にロードバランサの設定もしてくれます。
ロードバランサにも種類がいくつかあるのですが、マネジメントコンソールから設定する場合、Classicというものしか選択できないようです。ほかの種類のロードバランサを使用したいならCLIを使用してコマンドから設定する必要があります。
* ローリング設定とデプロイ  
デプロイの詳細を設定します。
例えばサーバが複数台ある場合に「WEBアプリケーション」を更新しようとしたとき、すべてのサーバを一気に更新するのか1台ずつ順番に更新していくのかなどを設定できます。
* セキュリティ  
作成したEC2インスタンスにリモートデスクトップやssh接続するときに使用するキーペアの設定などを行なえます。
* モニタリング  
CloudWatchへどのようなログを送信するかなどの設定ができます。
* Managed Updates  
例えば、javaの新しいバージョンがリリースされるなど、プラットフォームを更新できる場合に自動的に更新するかどうか、更新するならどのタイミングでするのかなどを設定できます。
* 通知
イベントの通知先のメールアドレスを設定できます。
ElasticBenstalkの設定でエラーが発生したり動かしているサーバで何か異常が発生した場合などに連絡をもらえます。
* ネットワーク
作成したサーバがどのVPC・サブネットに属するのかを設定できます。
初期設定ではAWSがデフォルトで作成してくれるVPCに所属し、サブネットは分割されていません。
* データべース
使用するデータベースに関する設定ができます。
今回使用するサンプルアプリケーションはデータベースを使用しない構成のようですね。

すごい簡単に各設定項目の説明しましたが、それでも量が多くて大変そうです。
後からAutoScallingの設定を変更した場合、ロードバランサの設定も自動で変更してくれて感動しました。
これを1から自分でやるとなるとどれを選ぶのがいいのか混乱するし時間もかなりかかりそうです。それを2,3分で作ってくれるのだからElasticBeanstalkってすごい便利ですね！

ちなみに動いているWEBサービスにアクセスしてみるとこのような画面が表示されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/daa173e2-bb95-3cc9-0535-25ea5c515294.png)

#3.環境とアプリケーションバージョンと設定
ElasticBeanstalkを触っていると「環境」「アプリケーションバージョン」「保存された設定」という単語が出てきます。これらの単語について説明します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/00d6d6e8-2c23-7a58-0ecc-447c506d4665.png)



###環境
ざっくり言えばサーバとWEBアプリケーションを纏めたものです。
ここまで説明してきたことはほとんど「環境」の話だと思ってもらって大丈夫です。
前節で「ソフトウェア」や「容量」など多くの設定項目を確認しましたが、あれらは全て「環境」に関する設定です。
あれらの項目を設定することで「環境」を定義します。
こう言ってしまうと「アプリケーション」と「環境」って何が違うんだ？と疑問が出てきます。
アプリケーションの中には複数の環境を持つことができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/7effbebd-18e4-8a2d-14be-49a33e263b4d.png)


前節の例だと環境は一つしか作っていなかったので「アプリケーション」≒「環境」となっていました。
1つのアプリケーションの中に複数の環境を作ってどうするのかということについて、
テスト環境、検証環境、本番環境などを作成するため等に使います。
(これは現場によって呼び方は変わると思います)
WEBアプリケーションの開発は開発者それぞれのローカル環境で行い、
「テスト環境」にデプロイしてテストを行う。
テストが完了したら「検証環境」にデプロイしてお客様に動作を確認してもらう。
お客様からOKが出たら「本番環境」にデプロイしてエンドユーザに使用してもらう
などの環境の使い分けはあると思いますが、そのために複数の環境を作成してそれぞれの環境の設定を変更できるようになっています。
例えば、

* テスト環境、検証環境はサーバは低スペックで料金を抑えるが、本番環境は高スペックにしたい
* テスト環境・検証環境はサーバを1台しか用意しないが、本番環境では複数のリージョンに分散してアプリケーションを配置したりAutoScallingするようにしたい

等を実現するためにElasticBeanstalkで環境を自動生成し、一つのアプリケーションという単位で管理することができます。

###アプリケーションバージョン
WEBアプリケーションのバージョンを管理。
特にアプリケーションの保守フェーズで多いと思うのですが、アプリケーションを修正してデプロイしたけど動作がおかしいので一旦以前の状態に戻したいということはよくあると思います。これが本番環境だと素早く戻す必要がありますね。
マネジメントコンソール上で今までElasticBeanstalkでデプロイしたWEBアプリケーションのバージョン一覧を確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/2055583e-e778-64d1-64b9-b08ea2238b79.png)
例えば上の図だとSample Application_v2を新しくデプロイしたけど動作がおかしくて元に戻したいという要望があると元のSample Applicationを選択して「デプロイ」ボタンを押し、デプロイ先の環境を選択するだけで元のバージョンに戻ることができます。

###保存された設定
「2 ElasticBeanstalkを使ってみる」で環境に対する色々な設定を見ましたが、

* あれを色々いじっているうちにおかしくなってきて一度元の設定に戻したい
* 一時的に設定内容を変更してテストを行いたいが、テストが終わったら元に戻したい

というような要望は出てくると思います。
そんな時はこの保存された設定を使います。
環境の画面で設定内容を変更したのちにその設定内容を保存することができます。
保存された設定内容は「保存された設定」画面で確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/3ff5cb95-85d1-ef91-a204-a1540ed77e0f.png)
これが残っているなら好きなように環境の設定を変更してもあとでこの画面から戻したい設定内容を選択し、過去の状態に戻すことが可能になるわけです。




#4.まとめ
ElasticBenstalkとはAWS上でアプリを動かすために必要なサーバを立てたりネットワークの設定をしたりAutoScallingの設定をしたりデータベースの設定をしたりと複雑な初期設定を自動で行ってくれるサービス。
作成後に設定を編集できるので分からない場合は一度デフォルト設定で作ってみて必要な機能があれば設定を修正することが可能。