Cloud9上でElastic Beanstalk CLIを使ってデプロイしてみる

# Cloud9上でElastic Beanstalk CLIを使ってデプロイしてみる
AWS Developer Associateの試験勉強をしていて、デプロイの方法がいまいちわからなかったり、Elastic Beanstalkを使ってみたかったのでEB CLIを使ってデプロイを試しにやってみました。

AWS Cloud9 は、ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) です。これには、コードエディタ、デバッガー、ターミナルが含まれています。
AWS Cloud9にはIDEの機能が付いており、アプリケーション開発にとって必要なツールや機能を全て兼ね備えているため、外部からのインストールやツールを購入する必要がありません。
ブラウザ上での操作になるため、端末の環境に左右されることなく使用できます。

EB CLI は AWS Elastic Beanstalk のコマンドラインインターフェイスで、ローカルリポジトリからの環境の作成、更新、およびモニタリングを簡単にできます。

このCloud9でElastic Beanstalk CLIを使用してImmutableデプロイとBlue/Greenデプロイを試しにやってみます。

## Cloud9の環境構築
以下のようにしてCloud9を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583139/54be0228-518c-ccd8-61cb-80a97de9a296.png)

簡単なexpressのアプリを用意しておきます。

```
//c9でファイルやディレクトリを簡単に開けるようになる
npm i c9 -g

//フォルダを作成
mkdir ~/environment/demoDeploy

//npm環境をセットアップして、package.jsonを生成
npm init -y

//expressをインストール
npm i express --save

//ファイルを作成
touch index.js app.js index.html style.css
```

`curl -s http://169.254.169.254/latest/meta-data`のコマンドを使うことでEC2の情報を見ることができます。次の画像のようにしてセキュリティグループのidを取得しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583139/34f281ee-297c-5829-f1f4-20084dbe7a20.png)

次にセキュリティグループでポート8080に自分のPCのIPアドレスを許可します。IPアドレスは`http://checkip.amazonaws.com`と検索すると出てきます。

```
aws ec2 authorize-security-group-ingress --group-id sg-0060fe4bcc3da9653 --port 8080 --protocol tcp --cidr 153.218.160.86/32

//結果を確認できる
aws ec2 describe-security-groups --group-ids sg-0060fe4bcc3da9653 --output text --filters Name=ip-permission.to-port,Values=8080 
```

次にEC2のpublicアドレスを確認してnpm startします。確認したipアドレス:8080でアプリを起動させます。

```
curl -s http://169.254.169.254/latest/meta-data/public-ipv4
PORT=8080; npm start
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583139/64c181bf-c8c8-36ec-aed5-522dfc395a01.png)

## ElasticBeanstalk　CLIの設定
下のgithubのリンクを参照して、EB CLIをインストールします。

https://github.com/aws/aws-elastic-beanstalk-cli-setup

eb initします。設定が終わると.elasticbeanstalkフォルダが作成されます。またCodeCommitにもリポジトリができます。
.ebextensionsフォルダも作成し、configファイルを作成しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583139/d46d65c4-bb14-8b16-bca9-82410bc83890.png)

### EB create
`EB create --single` コマンドで新しい環境を作成し、デプロイします。--singleのオプションを付けることで単一の Amazon EC2 インスタンスを使用して環境を作成します。ロードバランサーは使用しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583139/73d32b34-5777-31a9-3993-f62faf689a28.png)


### Immutable
Immutableデプロイは一度作成したサーバー(インフラ)は設定変更などを行わず、不変なものとして扱います。デプロイするたびに新しいインフラを構築して、既存のインフラは不要になった後に廃棄されます。

新たに`.ebextensions`フォルダ配下にdeploy.configファイルを作成します。
作成したらCodeCommitにプッシュし、`eb deploy`でデプロイします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583139/9b7da69f-2628-0278-b87c-719d2f703289.png)


アップデートが開始されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583139/72767ae1-a16f-7418-8696-9e88946d9324.png)

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environmentmgmt-updates-immutable.html

### Blue/Green
ブルーグリーンデプロイメントとは現状の本番環境（ブルー）とは別に新しい本番環境（グリーン）を構築した上で、ロードバランサーの接続先を切り替えるなどして新しい本番環境をリリースする運用方法のことです。

URLをスワップするため実行環境が2つ必要になります。`eb clone`コマンドで現環境のクローンを作成します。

expressアプリの一部を変更して、`eb deploy`してクローンの方をデプロイします。

新しいほうの環境をデプロイしたら、次のコマンドでURLを切り替えます。

```
eb swap demoDeploy-prod --destination_name demoDeploy-prod-clone
```

Version2になっているのが確認できました。
旧環境の方は`eb terminate`して消しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1583139/5ebd142e-e159-4608-740c-7c95968c8289.png)

### 最後に
こちらの動画を参考にさせていただきました。

https://www.youtube.com/watch?v=RrKRN9zRBWs