【はじめてのAWSシリーズ】Elastic Beanstalk ＆コマンドラインでデプロイしてみる

AWSで新しい環境を構築する必要が合ったので、経験者に聞いたら、
Elastic BeansTalkとかeb deploy（コマンド）とかでやるのがナウい（死語）。
でもって、イミュータブルなデプロイつまり、***必要なときに環境を生成＆不要になれば破棄***するも考えてみ？とのこと。

# 素人なりに考えたメリット

- 設定を記述できるので、アップデートに失敗したときなどの復旧が行いやすい。
- 環境の配布のようなこともやりやすい。

# 構成

VPCはあらかじめ用意しているとする

- WebサーバにEC2。インスタンス数は可変とする
- デプロイ時にも本番環境のデータはRDS(DB)は管轄外とする。
- アプリケーションロードバランサーは用意する。

#　下準備

## 前提

作業環境に、CLIが入っている事。踏み台サーバ（SSHなどの受付を行うEC2インスタンス）を使う。
ここでは、AWS体験ハンズオンの事例を応用し、SSH接続したEC2インスタンスを使う。
VPC、サブネット、RDSなどは事前に用意する。

## 作業環境にEB CLIをインストール

```bash:インストール作業
$ pip install --upgrade --user awsebcli
```

## 作業用フォルダを作成する

このElastic Beanstalkでデプロイするものは、ZIPで固めたものをアップロードし、それを処理しているのだが、今回は、作業環境内にアップロードするコンテンツを含むフォルダを用意する（なお、ディレクトリにコンテンツが含まれることに留意）

便宜上、`/home/ec2-user/develop`ディレクトリで行うと仮定します



# 手順

## eb init （接続）


```bash:初期設定を行う

$ eb init

Select a default region
（中略）
(default is 3): 9
Select an application to use
1) php-sample-app
2) [ Create new Application ]
(default is 2): 2
Select a platform.

1) Node.js
2) PHP
(中略）
(default is 1): 2
Select a platform version.
1) PHP 7.2
（中略）
(default is 1): 1
Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
Do you want to set up SSH for your instances?
(Y/n): y
Select a keypair.
1) aws-keypair
（中略）
7) [ Create new KeyPair ]
(default is 6): 5
```

- Select a default region 日本国内で使うことを想定し、Tokyoを選択する
- Select an application to use 新しく作るので　 [ Create new Application ]
- Select a platform. 　 ここではPHPを選択する（動かしたいものによって変わる）
- Select a platform version.　2018/10時点で最新の PHP7.2を使うことにした
- SSH for your instances?　Y ebで作成するインスタンスにアクセスするためにSSH接続を作る
- Select a keypair. ここでは、事前に作ってあるキーペアを使う

これを実施すると、実施したフォルダに`.elasticbeanstalk`というディレクトリが生成され、そこに設定が保存される。

# コンテンツを用意する。

具体的な方法は省略します。
ただしディレクトリ全体がアップされるため、
Webサーバとして使う場合、ディレクトリ分けた方がよいかも。

`~/develop` で`eb init`したと仮定した場合、たとえばこんな感じで。
`~/develop/cakephp` フレームワーク部分。
`~/develop/wordpress` WordPress（ブログ機能）
`~/develop/landing` ランディングページ

CakePHPとWordPressが混在するサーバって何なんだって気がしますが
ごく小規模なWebサービスであればこれでもよさそうな。

# .ebextensionsによる設定

これが大事。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/ebextensions.html

インストールするソフトウェアの指定や、nginx.confの指定など。
別途記載する。

# eb createでデプロイする

```bash:デプロイの実施
$ eb create
Enter Environment Name
(default is develop):
Enter DNS CNAME prefix
(default is develop): your-develop-url-name
Select a load balancer type
1) classic
2) application
3) network
(default is 1): 2
Creating application version archive "app-yymmdd_HHiiss".
Uploading develop/app-yymmdd_HHiiss.zip to S3. This may take a while.
Upload Complete.
```

- Enter Environment Name 環境名。特にこだわりが無ければディレクトリ名と一緒で良いかも
- Enter DNS CNAME prefix　URLのプレフィックス。何か分かりやすいものを入れる
- Select a load balancer type　ロードバランサーのタイプ。

## eb createに引数をつける

実際には、特定のVPC環境に特定のサブネットやセキュリティグループを定義するような運用の仕方になる。

```bash:VPCの指定
#!/usr/bin/bash

echo "start Elastic Beanstalk CLI CREATE!!" 

# --vpc VPCを指定する
# --vpc.id vpc-XXX VPCのIDを指定する
# --vpc.securitygroups sg-YYY VPCのセキュリティグループを指定する
# --vpc.publicip EC2インスタンスに、パブリックIPを付与する（自動で）
# --vpc.ec2subnets  subnet-AAA, subnet-BBB EBが生成するEC2インスタンスにつなげるサブネット
# --vpc.elbsubnets subnet-CCC,subnet-DDD ロードバランサーにつなげるサブネット（同時に生成するEC2と、同じアベイラビリティゾーンに存在することが必要

eb create --vpc --vpc.id vpc-XXX --vpc.securitygroups sg-YYY --vpc.publicip --vpc.elbsubnets subnet-AAA,subnet-BBB --vpc.elbpublic --vpc.ec2subnets  subnet-CCC,subnet-DDD
```

こんな感じで定義する。

EB CLI リファレンスも参考に
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-create.html

# 参考

ほぼほぼ、これを参考にして実施しただけですが･･･

AWS Black Belt Online Seminar 2017 AWS体験ハンズオン～Deploy with EB CLI編～

https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-awsdeploy-with-eb-cli