【AWS】Elastic Beastalk

# はじめに

タダです。
AWS認定試験勉強のためにElastic Beanstalkのドキュメントを読んだ自分用メモになります。
※違う内容書いているなどありましたらご指摘いただけると幸いです。
※随時アップデートがあれば更新していきます。

# サービスの概要
* Elastic Beanstalkは、ソースコードをアップロードするだけで、ソースコードを実行する環境のプロビジョニング、ロードバランサー、スケーリング、モニタリングなどの細かい作業はサービスを管理するサービス
	* サポートするのは、PHP、Java、Python、Ruby、Node.js、Docker
* 構成できるのは、ウェブサーバー環境とワーカー環境
	* ウェブサーバー環境は、ELB + AutoScalingでスケーラブルな環境を構成し、環境毎にDNS名を付与する
	* ワーカー環境は、SQS + AutoScalingでスケーラブルなバッチ処理基盤を構成する
		* Sqsdはワーカーホスト内で動作するデーモン
			* 200 OKならSQSのメッセージを削除
			* 200 OK以外ならVisibilityTimeout(SQSの設定)後にSQSからメッセージが取得可能(リトライ)
			* 応答なしならInactivity Timeout(Elastic Beanstalkの設定)後にSQSからメッセージが取得可能(リトライ)
		* 定期的なタスク実行も可能(cron.yamlで定義)


## 特徴
* デプロイオプションを使って、簡単に新しいアプリケーションバージョンを実行している環境にデプロイできる
* CPU平均使用率、リクエスト数、平均レイテンシーなどCloudWatchモニタリングメトリクスにアクセスできる
* アプリケーションの状態が変化したり、アプリケーションサーバが追加または削除されたりした際にはSNSをつかって通知が行われる
* アプリケーションサーバにログインせずにサーバのログファイルのアクセスできる
	* S3に保管される
* AMI、オペレーティングシステム、言語やフレームワーク、およびアプリケーションサーバーまたはプロキシサーバーなどアプリケーションを実行する基盤となるプラットフォームに対する定期的な自動更新を有効にできる
* アプリケーションサーバ設定(JVM設定など)を調整して環境変数を渡す



## サービスの構成要素
* アプリケーション : トップレベルの論理単位
	* バージョン、環境、環境設定が含まれている入れ物
* バージョン : デプロイ可能なコード
	* S3上でのバージョン管理
	* 異なる環境に異なるバージョンをデプロイ可能
* 環境：Webサーバ、ワーカーに応じて構築されるインフラ環境
	* バージョン(ソースコード)をデプロイ
* 環境設定：その環境に関連するリソースの動作を定義するパラメーター
	* EC2インスタンスタイプ、AutoScalingの設定など
　
## 環境のタイプ
* ロードバランシング、AutoScaling環境
	* 高い可用性と伸縮自在性を兼ね備えた構成
	* ウェブサーバー環境：ELB + AutoScaling
	* ワーカー環境：SQS + AutoScaling
* シングルインスタンス環境
	* EC21台構成(AutoScalingでmax,minが1に設定されている)
	* 開発環境などの構築のために低コストで構築可能

# 環境設定
環境に関連するリソースの動作を定義する設定パラメーター

* 直接設定
    * マネジメントコンソールまたはElastic Beastalk CLI(`eb create`オプションで実施)
* 保存済み設定
    * 環境の作成中または実行中の環境に適用できる設定をS3に保存して流用できる(ステージングで使った設定を本番に適用)
* デフォルト値
* .ebextensions
	* ウェブ環境のソースコードに.ebextensionsを追加することで環境を設定し、環境に含まれるAWSリソースをカスタマイズできる(JVM設定など)
	* 環境で使用しているリソースのカスタマイズが可能
	* 環境に対する様々な操作を自動化、集約可能

```:例
~/workspace/my-app/
|-- .ebextensions
    |-- environmentvariables.config
    |-- healthchekckurl.config
|-- .elasticbeanstalk
    |-- config.yml
|-- index.php
```

## .ebextensionsで実行可能な操作
* packages:yum,rpmでのパッケージのインストール
* sources:外部からのアーカイブをダウンロードした場所に展開する
* users/groups:任意のユーザー/グループを作成
* commands:デプロイ処理前に実行すべきコマンドやスクリプトを指定
* container_commands:新バージョンの展開後に実行すべきコマンドやスクリプトを指定
* option_settings:環境変数の設定
* Resouteces:追加のリソースを定義(SQSのキュー、DynamoDBテーブル、CloudWatchのアラーム)

## .ebextensions Tips
* セクションごとにファイルを分割する
* インストールするパッケージのバージョンを明記
    * インスタンスによって異なるバージョンになることを防止
* カスタムAMIとのトレードオフを検討

# Dockerサポート
* Dockerを構成する場合、Single Container(EC2の中にDockerを実行）またはMulti Container(ECS)を利用可能
* DockerをElastic Beanstalkでデプロイする場合、`Dockerrun.aws.json`で定義して実行する

```例
{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "janedoe/image",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "1234"
    }
  ],
  "Volumes": [
    {
      "HostDirectory": "/var/app/mydb",
      "ContainerDirectory": "/etc/mysql"
    }
  ],
  "Logging": "/var/log/nginx"
}
```

# デプロイ形式 
Elastic Beastalkのデプロイ形式を以下にまとめる


| メソッド | 概要 |
|:-----------|:------------|
| All at once|同時にすべてのインスタンスに新しいバージョンをデプロイする。環境内のすべてのインスタンスは、デプロイが実行される間、短時間だがサービス停止状態になる。 |
| Rolling|バッチに新しいバージョンをデプロイする。デプロイフェーズ中、バッチはサービス停止状態になり、バッチのインスタンスによる環境容量への負荷を低減する。|
| Rolling with additional batch|バッチに新しいバージョンをデプロイするが、デプロイ中に総容量を維持するため、インスタンスの新しいバッチをまず起動する|
| Immutable| 変更不可能な更新を実行し、新しいバージョンをインスタンスの新しいグループにデプロイする。|


# モニタリング
* 基本(ベーシック)ヘルスレポート
	* 環境のヘルスステータス
	* ELBのヘルスチェック
	* CloudWatchメトリクス
* 拡張ヘルスレポート
	* OSレベルのメトリクス
	* アプリケーションレベルのメトリクス

## 拡張ヘルスレポートの主なメトリクス

* EnvironmnetHealth
* インスタンスの状態
* リクエスト総数及び各レスポンスコード毎の数
* x％の完了のかかった平均時間
* LoadAverage1min: 1分間のLoad値の平均値
* RootFilesystemUtil: 使用ディスク容量の割合
* CPU使用状況詳細


# 他のAWSサービスとの統合
* CloudFront
	* Elastic Beanstalkでデプロイしたら、CloudFrontから配信する
* DynamoDB
	* Elastic BeastalkでDynamoDBのテーブルを作成し、データを書き込む
* Elasticache
	* セキュリティグループでElastic Beastalkでアクセスできるように設定する
* RDS
	* セキュリティを高めるために、接続情報をS3に保存し、デプロイの間にデータを取得するようにElastic Beastalkを設定する
	* 設定ファイル(ebextensions)を使用して環境内のインスタンスを設定し、アプリをデプロイする時にS3からファイルを安全に取得できる
* S3
	* S3バケットは、アプリケーションのバージョン、ログ、その他のサポートファイルファイルを保存する

# メンテナンスウィンドウ
メンテナンスウィンドウは、管理プラットフォームの更新が有効化されており、プラットフォームの新バージョンが公開されている場合にElastic Beanstalkでプラットフォームの更新が開始される毎週2時間の時間帯が割り当てられる

# EB CLIについて
コマンドラインインターフェースとして、EB CLIがある

* eb create
	* 初期環境を作成する
* eb status
	* 環境のステータスを確認する
* eb health
	* 環境内のインスタンスのヘルス情報とその環境全体の状態を表示する
* eb events
	* 環境のイベントのリストを確認する
* eb logs
	* 環境のインスタンスからログを取得する
* eb open
	* ブラウザでウェブサイトのユーザー環境を開く
* eb deploy
	* デプロイする
* eb config
	* 実行する環境に利用可能な設定オプションを確認する
* eb terminate
	* 環境のターミネート

# 参考
* [サービス概要](https://aws.amazon.com/jp/elasticbeanstalk/)
* [よくある質問](https://aws.amazon.com/jp/elasticbeanstalk/faqs/)
* [ドキュメント](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/Welcome.html)
* [SlideShare](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-aws-elastic-beanstalk)

# 更新日時
* 2017/05/01 初回投稿
* 2017/05/05 環境設定の項目を更新、Dockerサポートを追加