Node.jsアプリケーションをElastic Beanstalkにデプロイする

以下の記事を参考に進めます。

[Express アプリケーションを Elastic Beanstalk にデプロイする - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_nodejs_express.html)

## 検証環境

MacOS 10.15.4です。
`eb`コマンドさえ実行できれば、他のOSでも問題ありません。

## EB CLI のインストール

```
brew update
brew install awsebcli
eb --version
> EB CLI 3.18.1 (Python 3.8.2)
```

## eb init コマンドを使用してリポジトリを作成

```
mkdir node-express
cd node-express
eb init --platform node.js --region ap-northeast-1
> You have not yet set up your credentials or your credentials are incorrect 
> You must provide your credentials.
(aws-access-id): 
(aws-secret-key): 
```

IAMユーザーを未作成の場合はIAMユーザーを作成します。

### IAMユーザの作成

<img width="756" alt="スクリーンショット 2020-05-26 21.13.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/d2fd0f46-709a-0bdf-8b1b-f36332c856bd.png">

<img width="978" alt="スクリーンショット 2020-05-26 21.15.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/fbb093e5-f806-f06e-07c1-a7d33d513357.png">

これを先ほど聞かれたアクセスID、アクセスキーに入力する。

```
(aws-access-id): 
(aws-secret-key): 
```

## eb create コマンドを使用して、サンプルアプリケーションを実行する環境を作成

以下のコマンドで、Node.jsと以下のリソースで負荷分散環境を作成します。

```
eb create --sample node-express-env
```

出力結果は以下の通り。

```
Environment details for: node-express-env
  Application name: node-express
  Region: ap-northeast-1
  Deployed Version: Sample Application
  Environment ID: e-8ipq7n7qmh
  Platform: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Node.js running on 64bit Amazon Linux/4.14.3
  Tier: WebServer-Standard-1.0
  CNAME: UNKNOWN
  Updated: 2020-05-26 12:19:11.692000+00:00
Printing Status:
INFO    createEnvironment is starting.
INFO    Using elasticbeanstalk-ap-northeast-1-421146132732 as Amazon S3 storage bucket for environment data.
INFO    Created security group named: sg-01af1a0ddcfd9d7ca
INFO    Created load balancer named: awseb-e-8-AWSEBLoa-2E65Q23TKP6X
INFO    Created security group named: awseb-e-8ipq7n7qmh-stack-AWSEBSecurityGroup-T1U98MDMFMSA
INFO    Created Auto Scaling launch configuration named: awseb-e-8ipq7n7qmh-stack-AWSEBAutoScalingLaunchConfiguration-19I5UVFLE902H
INFO    Created Auto Scaling group named: awseb-e-8ipq7n7qmh-stack-AWSEBAutoScalingGroup-QY68AJ6H91M9
INFO    Waiting for EC2 instances to launch. This may take a few minutes.
INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:421146132732:scalingPolicy:45a700e3-bae8-437c-8d5b-d40e0c980cfd:autoScalingGroupName/awseb-e-8ipq7n7qmh-stack-AWSEBAutoScalingGroup-QY68AJ6H91M9:policyName/awseb-e-8ipq7n7qmh-stack-AWSEBAutoScalingScaleDownPolicy-18EMVJIJ45S9Z
INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:421146132732:scalingPolicy:178550d0-fc58-4642-a2bd-73013ffc9612:autoScalingGroupName/awseb-e-8ipq7n7qmh-stack-AWSEBAutoScalingGroup-QY68AJ6H91M9:policyName/awseb-e-8ipq7n7qmh-stack-AWSEBAutoScalingScaleUpPolicy-FTL8NRNS0CWG
INFO    Created CloudWatch alarm named: awseb-e-8ipq7n7qmh-stack-AWSEBCloudwatchAlarmLow-J8O5Z6ANTH8O
INFO    Created CloudWatch alarm named: awseb-e-8ipq7n7qmh-stack-AWSEBCloudwatchAlarmHigh-92OFURDBRAE5
INFO    Application available at node-express-env.eba-giwvvptw.ap-northeast-1.elasticbeanstalk.com.
INFO    Successfully launched environment: node-express-env
```

|リソース  |説明  |
|---|---|
|EC2 インスタンス  |説明省略  |
|インスタンスセキュリティグループ  |ポート 80 上のインバウンドトラフィックを許可するように設定された Amazon EC2 セキュリティグループ  |
|ロードバランサー   |説明省略  |
|ロードバランサーセキュリティグループ  |ポート 80 上のインバウンドトラフィックを許可するように設定された Amazon EC2 セキュリティグループ。  |
|Auto Scaling グループ  |インスタンスが終了されたか利用不可になった場合にそのインスタンスを置き換えるように設定された Auto Scaling グループ  |
|Amazon S3 バケット  | Elastic Beanstalk の使用時に作成されるソースコード、ログ、その他のアーティファクトの保存場所 |
|Amazon CloudWatch アラーム  |環境内のインスタンスの負荷をモニタリングし、負荷が高すぎたり低すぎたりするとトリガーする 2 つの CloudWatch アラーム  |
|AWS CloudFormation スタック  |Elastic Beanstalk はAWS CloudFormation を使用して環境内のリソースを起動し、設定の変更を伝達します  |
|ドメイン名  |ウェブアプリケーションまでのルートとなるドメイン名であり、subdomain.region.elasticbeanstalk.com の形式です。  |

## 作成した環境を開く

```
eb open
```

サイトの表示が確認できた。
ちなみにこの時点でのディレクトリ構成は以下の通り、config.ymlがあるだけ。

```
.
├── .elasticbeanstalk
│   └── config.yml
└── .gitignore
```

``` ..elasticbeanstalk/config.yml 
branch-defaults:
  default:
    environment: node-express-env
    group_suffix: null
global:
  application_name: node-express
  branch: null
  default_ec2_keyname: null
  default_platform: Node.js
  default_region: ap-northeast-1
  include_git_submodules: true
  instance_profile: null
  platform_name: null
  platform_version: null
  profile: eb-cli
  repository: null
  sc: null
  workspace_type: Application
```

## express環境の作成&デプロイ

```
npm install -g express-generator
express && npm install
```

``` ..ebextensions/nodecommand.config
option_settings:
  aws:elasticbeanstalk:container:nodejs:
    NodeCommand: "npm start"
```

```
eb deploy
```

数分後、環境が更新されます。環境が緑色で示されていて準備完了したら、URLを再表示して正しく動作することを確認します。

## 別環境を作成する

- マネコンから新規作成
- マネコンから既存の環境をクローン
- eb createで作成

開発環境にデプロイして、その後はAWSのマネコンから本番へデプロイなどもできます。
今回は`eb create`で作成しました。

```
eb create node-express-production
```

これによりマネコンにnode-express-productionが作成されています。
git commitのメッセージを確認&選択して、デプロイをクリック。

<img width="405" alt="スクリーンショット 2020-06-01 21.40.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/39f82589-0672-3e28-a41b-87e3b96b5208.png">

node-express-productionを選択すると、無事本番環境にも反映されます。

<img width="346" alt="スクリーンショット 2020-06-01 21.40.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/69d0ae37-ea7b-0289-749d-f839a935ad34.png">


## 環境変数を設定する

設定から環境変数を設定することができます。

<img width="733" alt="スクリーンショット 2020-06-01 22.08.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/819acef4-39bf-95c7-b02c-ed0f5c3c1e33.png">

各環境の読み込み方法については以下のリンクを参照

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-softwaresettings.html#environments-cfg-softwaresettings-accessing

## 参考リンク

- [Node.js アプリケーションを Elastic Beanstalk にデプロイする - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_nodejs.html)
- [EB CLI コマンドリファレンス - AWS Elastic Beanstalk](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-cmd-commands.html)