[aws][beanstalk]初心者向けインスタンス作成

# Beanstalkでインスタンスを作成する
- いくつかはまったところがあったので備忘録として記載
 - 環境構築するまでのはまりポイントの共有
 - 環境構築後、Docker形式でのdeployサンプルとEbextensionsのサンプル
 - ロードバランサ設定したので任意でインスタンスを増やすことを試せる
- [Dockerのサンプルアプリ and ebextension with newrelic ](https://github.com/syunchanp/elasticbeanks-docker-example)を公開しておきました
 - 環境構築後、Beanstalkの仕様に従ってアップしていただければと思います
 - multi-dockerはECSを利用するのでsingle構成の方がやりやすいのではないかなーと思います
 - Dockerイメージをvolumeで紐つけているので、tomcatの他PHPやRuby等もdeployしやすいかと。
- 構築時の事前設定忘れで無用なエラーにならないことをご確認ください
 - 以下の設定方法は、数あるページとほぼ同じと思ってもらって良いです
 - 参照するべきページへのリンクや注意点を確認いただければと思います
- 対象外
 - ECRやSSLへのはとりあえず対象外にしています


# 事前作業
- [VPCページ](https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#)を開いて、VPCウィザードでVPCとSubnetを用意する
 - SubnetのひとつにNATゲートウェイを割り当てる(EIPをつけてね！)
 - ネットワークの変更で利用
- キーペアを用意しておく
 - セキュリティ変更時に利用
- [beanstalk](https://ap-northeast-1.console.aws.amazon.com/elasticbeanstalk/home?region=ap-northeast-1#/welcome)のページを開く
- IAMを適切に設定して作成しておくこと

# 確認するべきページ

-  [AWS Elastic Ebanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/GettingStarted.html?icmpid=docs_elasticbeanstalk_console)のページ
-  [EB CLI](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3.html)を利用する際のページ
-  [Elastic Beanstalk 環境の Amazon EC2 インスタンスからのログ](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.logging.html#health-logs-extend)からのページ
 -  [環境ごとのログ一覧](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/AWSHowTo.cloudwatchlogs.html)が記載されているページ

> プロビジョニング時に確認するログの場所
>> /var/log/eb-commandprocessor.log
>> /var/log/eb-activity.log

#  アプリケーションと環境の作成

- アプリケーションを作成する
 - サンプルなのでウェブサーバ環境で構築
![01_環境枠.png](https://qiita-image-store.s3.amazonaws.com/0/46041/3737f78e-d9ba-a1dd-ce34-3e9d443e68d1.png)
- [アクション]-[環境の作成]から環境枠の選択を行う
 - プラットフォームはDockerとしサンプルアプリケーションで進める
![02_新しい環境の作成.png](https://qiita-image-store.s3.amazonaws.com/0/46041/894e13aa-5ee2-5ff3-6b20-e0c662fee71e.png)

> 単一コンテナの[Docker設定](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/single-container-docker-configuration.html)の設定を利用

# さらにオプションを設定

以下の順番で設定するとVPC設定を元に、適切な設定を進められます

####1. ネットワーク
- 事前に用意しておいたVPCと２つのSubnetを指定してください
- サンプルなので、EC2にsshログインする場合はパブリックIPアドレスのチェックもどうぞ

![10_ネットワークの変更.png](https://qiita-image-store.s3.amazonaws.com/0/46041/ccdd48e5-fb3c-58d8-afc8-b1feab293e28.png)
####2. インスタンス
- Javaの場合はt2.smallあたりでメモリは確保してもらうのが良いかと
- ボリュームは任意で良いですが、面倒ならば「汎用(SSD)」で「30GB」くらいで
- セキュリティグループはチェック無しでとりあえずOK
![12_インタンスの変更.png](https://qiita-image-store.s3.amazonaws.com/0/46041/9b5046dc-bbd7-633c-2f01-506be780ebc0.png)

####3. 容量
- 負荷分散を選択し、インスタンスの最大だけ1以上で設定
- VPCが設定されていないと表示されません
![14_容量の変更.png](https://qiita-image-store.s3.amazonaws.com/0/46041/b5866623-0cf5-ba14-aa14-c8deef9df0a5.png)

####4. ロードバランサー
- とりあえずALB(Application Load Balancer)で。
- こちらもVPC等の設定が出来ていないと選択できなかったはず。
![13_ロードバランサーの変更.png](https://qiita-image-store.s3.amazonaws.com/0/46041/a0c875cc-1c1e-d741-7517-dadc09945454.png)

####5. セキュリティ
- 生成されたインスタンスにsshログインする際は、EC2キーペアを指定してください
- IAMも事前に作成してあるものを指定してください
![11_セキュリティの変更.png](https://qiita-image-store.s3.amazonaws.com/0/46041/e3c4a789-4773-6472-4211-67ee294c42da.png)

####6. それ以外

 以下の設定はとりあえず行わない

- ソフトウェア
 - ゴールデンイメージを作りたい場合は、いずれ使用しますが今回はスキップで。
- ローリング更新とデプロイ
- モニタリング
- 管理された更新
- 通知
- データベース
- タグ

# 設定時の注意点

####1. NATゲートウェイの設定
- VPC設定時にNATゲートウェイを設定しておかないと、特にprivateネットワークからのヘルスチェック時に障害になる
- [Elastic Load Balancing](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html?icmpid=docs_elasticbeanstalk_console#access-logging-bucket-permissions)でのバケット設定をしておかないと、ELB設定時にログを取得する際にエラーが発生する

####2. アクセスログ用のBacket設定
- ロードバランサでアクセスログを取得する際に、適切なBacket設定をしておかないと障害になる。場合によっては間違ってBacketを公開設定にしてしまうことがある
- [Elastic Load Balancing-NAT](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/vpc.html)を設定しないとHealthチェック時にエラーが出る
- Backetの設定を確認したい場合は、生成されたロードバランサのコンソールで、「アクセスログをs3に保存」等の箇所で試すことが可能です
 - 設定・保存してみてエラーにならなければOK
 - 必要であれば、いずれ詳細図等を記載します

####3. deploy設定ファイルのミス確認方法
- 環境構築後にアプリケーションをデプロイする際、設定ファイルのエラー等がコンソールからは確認しずらい
- EB CLIを利用してのeb deploy を行うと、Dockerrun.aws.json等の設定エラー時にエラーメッセージを確認することが出来る