【30分でデプロイ】Elastic Beanstalkを使ってRailsをサクッとEC2にデプロイしよう【丁寧解説】

初学者がAWSにデプロイする時、めちゃめちゃ設定あって挫けそうになりませんか？

ええ、わかります。。。
自分も大量のエラーと戦いながら、なんとかデプロイをした経験があります。

新しくアプリを作った時にCI/CDを使ってどうデプロイしようか？と
調べていた時にElastic Beanstalkを知りました。

実際に使ってみて、とても簡単にデプロイ出来たし、
なによりEC2へデプロイすることの全体像をサクッとつかめるなって思ったので
初学者向けに丁寧に解説しようと思って記事を書きました。

デプロイに挫けそうになった方は
ぜひElastic Beanstalkを使って試してみてください！

## Elastic Beanstalk とは？

![AWS-Elastic-Beanstalk@4x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/45218e2e-ad72-8b67-aacb-9c5616edf06d.png)

>Elastic Beanstalk では、アプリケーションを実行しているインフラストラクチャについて学習することなく、AWS クラウドでアプリケーションをすばやくデプロイし、管理できます。Elastic Beanstalk は、選択肢を狭めたり制御を制限したりすることなく、管理の複雑さを軽減します。アプリケーションをアップロードするだけで、Elastic Beanstalk が自動的に容量のプロビジョニング、負荷分散、拡張、およびアプリケーションの状態のモニタリングといった詳細を処理します。
> [AWS Elastic Beanstalk とは](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/Welcome.html)

簡単に言えば、インフラ詳しくなくてもアプリをEC2にデプロイできて、
よくあるアプリのインフラ設計で勝手にチューニングしてくれるよってやつです。

![aeb-architecture2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/c58da8f1-ebfa-a284-76aa-051a66be339d.png)

料金に関しても使ったAWSリソースのみ（今回の記事ではEC2とRDS、S3）なので、
無料枠内で全然試すことができます。

詳しい技術については丁寧に解説してくれている記事が
たくさんあると思うので、興味がある人はそちらをご覧ください。

この記事では0からデプロイができるようになることをフォーカスして解説していきます！

## はじめに

### 前提

* AWSアカウントを持っている
* Railsアプリを作成できる
* 簡単なコマンドがわかっている

### 大まかな流れ

1. AWS CLIのインストール・セットアップ
2. AWS EB CLIのインストール・セットアップ
3. Railsアプリの用意・デプロイの事前準備
3. RailsアプリをEC2にデプロイ

### この記事のゴール

* EC2にRailsアプリをデプロイできるようになる
* ファイルを更新して、再度デプロイを行い、アプリを継続的に更新できること

## AWS CLI のインストール・セットアップ

### 1. AWS CLI 用の IAM を作成

まずAWS CLI用のIAMを作成し、CLIから操作できるようにします。

[AWS: IAM](https://console.aws.amazon.com/iam/home#/home)こちらからIAMのページに飛んでください。

サイドバーの `ユーザー` → `ユーザーを追加` をクリックしてAWS CLI用のユーザーを追加します。
<img width="774" alt="iam_001.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/74473719-9202-c4ef-8900-c380eacb4cce.jpeg">

ユーザー名はわかりやすいように `aws-cli` としておきます。

アクセスの種類はCLIからなので、`プログラムによるアクセス`にチェックを入れます。

次のステップに進みます。

![iam_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/605dd14a-7311-9a40-e0c0-66f770683c31.jpeg)

アクセス権限の付与は後ほどするので、そのまま次のステップへ。

![iam_003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/20311cc4-14e5-edb5-d24f-faaa2fa13e26.jpeg)


特にタグで管理をしていないので、そのまま次のステップへ。

![iam_004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/580f8e80-1403-1b3c-3fc4-4840bfb14e02.jpeg)

アクセス権限を飛ばしたのでWarningが出ていますが、後ほど追加するのでそのまま次のステップへ。

![iam_005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/0fa175ae-97c4-2cd3-cbce-10d44378666a.jpeg)

これでユーザー作成が完了しました。

`アクセスキーID` と `シークレットアクセスキー` は後ほど使うので、コピーしておいてください。

![iam_006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/7d8fccbc-e07c-ef09-130e-f27628805e5b.jpeg)



### 2. AWS CLI をインストール

Homebrewをつかって AWS CLI をインストールします。

```
brew install awscli
```

インストールが問題なくされたか確認します。

```
aws --version
```

```
aws-cli/2.0.0 Python/3.8.1 Darwin/19.3.0 botocore/2.0.0dev4
```


バージョンが表示されればokです。

#### 3. AWS CLI のデフォルト設定を行う

続いてはAWSへのアクセス権限の付与とデフォルト情報を入力していきます。

`aws configure`を入力すると項目が4つ表示されるので、順に入力していきます。

```
aws configure
```

```
AWS Access Key ID [None]: *********
AWS Secret Access Key [None]: ******************
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

`AWS Access Key ID`
先程作成したユーザーのアクセスキーID

`AWS Secret Access Key`
先程作成したユーザーのシークレットアクセスキー

`Default region name`
使用するリージョン名(東京: ap-northeast-1)

`Default output format`
アウトプットの表示形式(jsonやtextなど)

#### 4. AWS CLI の設定を確認する

それぞれ設定ファイルを`cat`で確認します。

下記のような表示になれば問題ありません。

```
cat ~/.aws/credentials
```

```config:~/.aws/credentials
[default]
aws_access_key_id = *********
aws_secret_access_key = ******************
```

```
cat ~/.aws/config
```

```config:~/.aws/config
[default]
region = ap-northeast-1
output = json
```

変更する場合やユーザーを追加したい時は、上記ファイルに追記すれば可能です。

詳しくは[AWS CLI の設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html)をご覧ください。


## AWS EB CLIのインストール・セットアップ

### AWS EB CLI をインストール

Elastic Beanstalk用のCLIをインストールします。

```
brew install awsebcli
```

正しくインストールされたか、確認しましょう。

```
eb --version
```

```
EB CLI 3.17.1 (Python 3.8.2)
```

バージョンが表示されたらインストール完了です。

### EB のアクセス権限を付与する

CLI上からElastic Beanstalkを操作できるようにアクセス権限を付けていきましょう。

#### 1. EBアクセス権限のグループを作成する

まずはElastic Beanstalkのアクセス権限をつけたグループを作っていきます。

[AWS: IAM](https://console.aws.amazon.com/iam/home#/home) から`グループ` → `新しいグループの作成` をクリック。

<img width="1251" alt="iam_eb_001.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/5a20f3d8-2df7-78e8-aae5-b455a47aea74.jpeg">

グループ名に `eb-cli` を入力し、次のステップへ。

![iam_eb_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/aeba2b09-92cd-6c85-a291-11825c1a56b8.jpeg)

検索窓に `elasticbeanstalk` と入力すると関連のポリシーが出てきます。

`FullAccess` にチェックを入れて、次のステップへ。

![iam_eb_003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/f99fcbb6-c34e-9c94-ad90-292a6ac52961.jpeg)

ポリシーが追加されているか確認し、グループの作成をクリック。

![iam_eb_004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/f42187db-f316-1bba-cd8c-665bc6b45b50.jpeg)

これでElastic Beanstalkのアクセス権限があるグループが作成できました。

#### 2. ユーザーをグループに追加する

続いては冒頭に作ったAWS CLI用ユーザーをグループに追加します。

サイドバーの`ユーザー` →  `aws-cli` をクリック。

<img width="1233" alt="iam_eb_005.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/a687d464-a385-ac40-93b6-6967c6e1f6d4.jpeg">

`グループ` → `ユーザーをグループに追加` をクリック。

<img width="1231" alt="iam_eb_006.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/483d1921-530c-c45a-2a27-d215c5feb5a1.jpeg">

先程作った `eb-cli` にチェックを入れ、グループに追加をクリック。

<img width="1239" alt="iam_eb_007.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/cfd3e47b-4c30-9eb5-57ae-a23451573974.jpeg">

これでAWS CLI用ユーザーがグループに追加され、EB CLIからElastic Beanstalkにアクセスできるようになりました。

<img width="888" alt="iam_eb_008.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/abe7846b-7c4e-a11d-7e13-71c323984d85.jpeg">

## Railsアプリの用意・事前準備

### Railsアプリを用意する

必要に応じてRailsのアプリを用意してください。

Rubyは2.6.5を使用してください。

EC2でのRubyのVersionが2.6.5のため、異なるとエラーが出ます。

```:自分の各種version
Ruby: 2.6.5
Rails: 5.2.4.1
Bundler: 2.1.4
```

自分はシンプルなscaffold構成で作成したものを用意しました。

5.2系統を普段使っているのでRailsのバージョン指定しています。ご自身の環境によって変更してください。

```
bundle exec rails _5.2.4.1_ new eb_sample_app -d postgresql
cd eb_sample_app
bundle exec rails g scaffold user name:string
bundle exec rails db:create
bundle exec rails db:migrate
```

サーバーを立ててみて問題なくアプリが作成できているか確認します。

```
bundle exec rails s
```

`localhost:3000/users` を開いて、下記のようなサイトが開けば問題ありません。

<img width="381" alt="SS_ 2020-03-15 22.36.37.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/2da08405-3cfc-9ac4-b080-a9b415fc3c82.jpeg">

このままではトップページになにも表示されないので、`routes.rb` にrootを追加します。

```ruby:~/eb_sample_app/config/routes.rb
Rails.application.routes.draw do
  root 'users#index' # << rootを追加
  resources :users
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

`localhost:3000` を開いて`users`と同じページが表示されれば設定完了です。

Rails Serverはこれ以上使わないので、落としておきます。

この時点でコミットしておきます。

```:~/eb_sample_app
git add .
git commit -m "first commit"
```

### デプロイの準備をする

#### eb init で初期設定を行う

`eb init` を入力して初期設定をしていきます。

アプリのトップディレクトリで行ってください。

```:~/eb_sample_app
eb init
```

いつくかの項目を入力して設定します。

#### 実行中に `ERROR: NotAuthorizedError` が出たら？

設定中に `ERROR: NotAuthorizedError` が出たらアクセス権限エラーになっています。

```
ERROR: NotAuthorizedError - Operation Denied.
User:arn:aws:iam::476091318231:user/aws-cli is not authorized to perform:elasticbeanstalk:CreateApplication on resource:
arn:aws:elasticbeanstalk:ap-northeast-1:476091318231:application/eb_sample_app
```

IAMの設定が有効になるには3~5分ほどかかるので、コーヒーブレイクでもはさみましょう。

10分くらいまってもエラーならIAMの設定が間違えているので、再度IAM設定を行ってください。


それでは入力を進めていきます。

使用するリージョンは東京リージョンを使うので、
`9) ap-northeast-1 : Asia Pacific (Tokyo)` の `9` を入力

```
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
18) eu-north-1 : EU (Stockholm)
19) ap-east-1 : Asia Pacific (Hong Kong)
20) me-south-1 : Middle East (Bahrain)
(default is 3): 9
```

使用するアプリケーションを選択します。

`[ Create new Application ]`を選択。

※ 初回作成だと`[ Create new Application ]`のみ

```
Select an application to use
1) rails-eb
2) [ Create new Application ]
(default is 2): 2
```

ElasticBeanstalkのコンソール上でのアプリ名です。

特に変更がなければ、なにも入力せず空でエンター。

```
Enter Application Name
(default is "eb_sample_app"):
```

自動的にコードを解析して、使用する言語を提案してくれます。

Rubyで良いので、空でエンター。

```
It appears you are using Ruby. Is this correct?
(Y/n):
```

- 使用するプラットフォームとバージョンを選択

RailsのデフォルトであるPumaで構築したいので、`2) Ruby 2.6 (Puma)` の `2` を入力

※ Rubyのバージョンは使用しているものを選んでください。

```
Select a platform version.
1) Ruby 2.6 (Passenger Standalone)
2) Ruby 2.6 (Puma)
3) Ruby 2.5 (Passenger Standalone)
4) Ruby 2.5 (Puma)
5) Ruby 2.4 (Passenger Standalone)
6) Ruby 2.4 (Puma)
7) Ruby 2.3 (Passenger Standalone)
8) Ruby 2.3 (Puma)
9) Ruby 2.2 (Passenger Standalone)
10) Ruby 2.2 (Puma)
11) Ruby 2.1 (Passenger Standalone)
12) Ruby 2.1 (Puma)
13) Ruby 2.0 (Passenger Standalone)
14) Ruby 2.0 (Puma)
15) Ruby 1.9.3
(default is 1): 2
```

- CodeCommit(AWSが提供してるGitHubのようなもの)を使うかどうか？

使わないので、そのまま空でエンター。

```
Do you wish to continue with CodeCommit? (y/N) (default is n):
```

- インスタンスにSSHで接続するかどうか？

接続するので、そのまま空でエンター。

```
Do you want to set up SSH for your instances?
(Y/n):
```

- 使用するキーペアを設定します。

すでにキーペアを持っている人は、空のままエンター。

初めての人は`[ Create new KeyPair ]`のみなので、作成に進んでいきます。

```
# 作成済
Select a keypair.
1) ec2-keypair
2) [ Create new KeyPair ]
(default is 1):

# 初めての人
Select a keypair.
1) [ Create new KeyPair ]
(default is 1):
```

`Create new KeyPair`に進むとSSHで接続するキーペアを作成していきます。

キーペアの名前を付けていきます。

好きな名前を付けてください。

```
Type a keypair name.
(Default is aws-eb): aws-eb
```

公開鍵と秘密鍵が作成されました。

続いて、鍵にパスワードをつけていきます。
空で入力するとパスワードなしで発行されます。

```
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

下記のような表示になれば作成完了です。

```
The key fingerprint is:
SHA256:xxxxxxxxxx aws-eb
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|      .          |
|     . +         |
|    = * S        |
|   o B E .       |
|o.+ .   +   .    |
|O=   =o+.=.+     |
|X++      .oo.    |
+----[SHA256]-----+
```

もう一度パスワード入力を求められるので入力します。

```
Enter passphrase:
WARNING: Uploaded SSH public key for "aws-eb" into EC2 for region ap-northeast-1.
```

EC2へのSSH接続が確認されキーペアの連携ができました。

これで初期設定が完了です。

`.elasticbeanstalk` フォルダが作成され、中に `config.yml` という設定ファイルが作成されました。

<img width="242" alt="eb_init_directory.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/19114556-b885-01ba-604d-5980d6d7a80a.jpeg">

`config.yml` の中身は以下のようになっています。

```yaml:~/eb_sample_app/.elasticbeanstalk/config.yml
branch-defaults:
  master:
    environment: null
    group_suffix: null
global:
  application_name: eb_sample_app
  branch: null
  default_ec2_keyname: aws-eb
  default_platform: Ruby 2.6 (Puma)
  default_region: ap-northeast-1
  include_git_submodules: true
  instance_profile: null
  platform_name: null
  platform_version: null
  profile: null
  repository: null
  sc: git
  workspace_type: Application
```

### `eb create`の前に各種問題への対処

続いて`eb create`をするのですが、そのまま実行すると3つのエラーが発生します。

それぞれどんなエラーが発生するのか解説し、事前に対応します。

#### 1. bundlerが古い問題

そのまま実行すると自動で実行される `bundle install` でエラーがでます。

エラーの内容は指定されているBundlerが無いぞ！って言われてます。

```
ERROR   [Instance: i-02e2bc303363c3671]
Command failed on instance. Return code: 1 Output: (TRUNCATED)...your system,
run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.1.4`
```

これは初期に生成されるEC2環境のBundlerのバージョンが1.16.0のため、最新のBundleが無いんですね。

```:[ec2-user@ip-172-31-2-55]
$ bundle -v
Bundler version 1.16.0
```

SSHで接続して`gem install bundler:2.1.4`でインストールしてもいいのですが、それだと毎回設定が必要です。

しかもこのままではAuto Scalingで2台目が立ち上がったときも設定が必要で意味がありません。

ElasticBeanstalkには初回にコマンドを実行する設定があるので、そちらで必要となる処理を記載していきます。

##### gem install bundlerの実行設定をする

アプリのトップディレクトリに`.ebextensions`というファイルを作成します。
`.`は必要なので気をつけてください！

このファイルに`~.config`というファイルを作成すると実行時に読み込んで実行してくれます。

```:~/eb_sample_app
mkdir .ebextensions
cd .ebextensions
touch gem_install_bundler.config
```

中身を下記の内容で作成します。

```yaml:~/eb_sample_app/.ebextensions/gem_install_bundler.config
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/09_gem_install_bundler.sh" :
    mode: "000775"
    owner: root
    group: users
    content: |
      #!/usr/bin/env bash

      EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
      EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)
      . $EB_SCRIPT_DIR/use-app-ruby.sh

      cd $EB_APP_STAGING_DIR
      gem update --system
      gem install bundler -v 2.1.4
```

内容は、自動で実行される`bundle install`の前に
`gem update --system`
`gem install bundler -v 2.1.4`
を実行するコードになります。

`gem install bundler -v 2.1.4` の`2.1.4`はご自身のBundler versionを指定してください。

`Gemfile.lock`の一番下に書いてある`BUNDLED WITH`に合わせないとエラーになります。

```:Gemfile.lock

BUNDLED WITH
   2.1.4
```

#### 3. `master.key`が無い問題

続いては`rails credentials:edit`が発生します。

```
ERROR   [Instance: i-012e1680a4956ac39]
Command failed on instance.
Return code: 1
Output: (TRUNCATED)...tring with `rails credentials:edit`
```

ElasticBeanstalkにデプロイすると自動でproduction環境になります。

その際に`config/master.key`もしくは`RAILS_MASTER_KEY`を参照しているのですが、
`config/master.key`は秘密鍵なので`gitignore`でgitにcommitされないようになっています。
この情報がないためエラーになります。

詳しくはこの記事では触れないため、下記のサイトを参照してください。

[Rails5.2から追加された credentials.yml.enc のキホン](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)

Serverに環境変数である`RAILS_MASTER_KEY`を設定しましょう。

まずは`config/master.key`を開きます。

```:~/eb_sample_app/config/master.key
da7xxxxxxxxxxxxxxxxxdf1b1de
```

中に文字の羅列があるので、そちらをコピーしておいてください。

`eb create`時に`--envvars` のオプションをつけると環境変数を設定できます。

`eb create`実行する時に以下のコマンドを付ければ解決です。
<font color="FireBrick">※まだ実行しないでください。</font>

```
eb create --envvars RAILS_MASTER_KEY=da7xxxxxxxxxxxxxxxxxdf1b1de
```

複数つける場合はカンマ区切りでつけることができます。

```
--envvars key=value,key2=value2,key3=value3
```

#### 3. DBが無い問題

続いてのエラーはDBがなくて `db:migrate` が出来ないよ！っていうエラーです。

```
ERROR   [Instance: i-048e3c74bf17b2499]

Command failed on instance.
Return code: 1 Output: (TRUNCATED)...ly and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Tasks: TOP => db:migrate
```

ElasticBeanstalkでは、RDSの立ち上げはオプションなので `eb create` にDB作成するオプションを付けて自動で作成されるようにします。
<font color="FireBrick">※まだ実行しないでください。</font>

```
eb create -db.engine postgres \
-db.user ebroot -db.pass testpassword
```

`-db.engine postgres`
DBのエンジンを決めます。`mysql` `postgres` など設定できます。

`-db.user ebroot`
DBのデフォルトユーザー名です。
お好きな名前を付けてください。デフォルトは `ebroot` です

`-db.pass testpassword`
DBのデフォルトユーザーのパスワードになります。
好きなパスワードを入れてください。

## Elastic Beanstalkへデプロイ

### `eb create`でアプリケーションを作成する

準備が整いました。`eb create`を実行しましょう。

以下のコマンドを丸々コピーして実行してください。
※オプションの値は適宜自分のものに変更してください。

```:~/eb_sample_app
eb create -db.engine postgres \
-db.user ebroot -db.pass testpassword \
--envvars RAILS_MASTER_KEY=da7xxxxxxxxxxxxxxxxxdf1b1de
```

実行すると4つの項目を聞かれます。

すべてデフォルトで良いので、空でエンターを4回押します。

```
Enter Environment Name
(default is eb-sample-app-dev):

Enter DNS CNAME prefix
(default is eb-sample-app-dev):

Select a load balancer type
1) classic
2) application
3) network
(default is 2):

Would you like to enable Spot Fleet requests for this environment?
(y/N):
```

するとなにやら実行されます。

EC2やらなんやら立ち上げていて、10分ほどかかるので2度目のコーヒーブレイクをお楽しみください。

```
Creating application version archive "app-f738-200316_020752".
Uploading eb_sample_app/app-f738-200316_020752.zip to S3. This may take a while.
Upload Complete.
An environment with that name already exists.
Enter Environment Name
(default is eb-sample-app-dev2):
Environment details for: eb-sample-app-dev
  Application name: eb_sample_app
  Region: ap-northeast-1
  Deployed Version: app-f738-200316_020752
  Environment ID:
  Platform: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Puma with Ruby 2.6 running on 64bit Amazon Linux/2.11.3
  Tier: WebServer-Standard-1.0
  CNAME:
  Updated: 2020-03-15 17:08:44.727000+00:00
Printing Status:
2020-03-15 17:08:42    INFO    createEnvironment is starting.
2020-03-15 17:08:44    INFO    Using elasticbeanstalk-ap-northeast-1-476091724641 as Amazon S3 storage bucket for environment data.
2020-03-15 17:09:06    INFO    Created target group named: arn:aws:elasticloadbalancing:ap-northeast-1:476091724641:targetgroup/awseb-AWSEB-1EYCMUPNKMX61/ccc7435548d76a87
2020-03-15 17:09:06    INFO    Created security group named: sg-09f51d827976f2e04
.
.
.
```

ログを見ると作成されてるのはこれらのようです。

- Environment
- Target Group
- Security Group
- Auto Scaling
- RDS Database
- Load Balancer
- EC2 Instances
- CloudWatch Alarm

時間がある方は、なにが作成されているのかチェックしてみてください。

時間がかかって `ERROR: TimeoutError` になった人は `eb events -f` を実行すれば再度確認できます。

```
ERROR: TimeoutError - The EB CLI timed out after 15 minute(s).
The operation might still be running. To keep viewing events,
run 'eb events -f'. To set timeout duration, use '--timeout MINUTES'.
```

```
eb events -f
```

`Successfully` が表示されれば完了です！

```
2020-03-15 17:14:00    INFO    Successfully launched environment: eb-sample-app-dev
```

### デプロイしたアプリをひらく

`eb open` を実行すると作成したアプリを開くことができます。

実行してみましょう。

```
eb open
```

ブラウザでアプリが開けば成功です。

<img width="479" alt="eb_product.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/6d5544d9-ea9e-376e-5c09-0fb9847db98a.jpeg">

実際にユーザーを作成して成功するか試してみましょう。

`New User` → `nameを入力` → `Create User`

Successfullyと出れば成功です！

<img width="256" alt="eb_product_user.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/320ba537-558e-9fce-8b78-64a2f3079acd.jpeg">

トップに戻ると作成されていることが確認できます。

<img width="251" alt="eb_product_users.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/c31d2d76-0086-2b40-f6b4-5552f05fb983.jpeg">

[AWS: ElasticBeanstalk](https://ap-northeast-1.console.aws.amazon.com/elasticbeanstalk/home?region=ap-northeast-1#/applications)を確認すると作成されたアプリケーションが確認できます。

緑色になっていると問題なく動作している状態です。
赤色などになっているとなにか問題が起きています。

作成したアプリケーションを開いてみましょう

![eb_plat.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/4485ed8f-befc-c3ea-a950-0e59d123dd82.jpeg)

作成したアプリケーションの情報が表示されます。

URLの部分が今回作成されたアプリケーションのURLです。

![eb_plat2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519198/9bd921d8-b5f0-4aea-284d-6b75b3362c7f.jpeg)

サイドバーの設定を開くとインスタンスやロードバランサーの設定を確認することができます。

#### 再度デプロイをする方法

ファイルを更新したら、commitして`eb deploy`をすれば
自動でファイルを転送されデプロイが完了します。

```
git add .
git commit -m "Add ..."
eb deploy
```

デプロイがこんなに簡単にできるなんて最高！！

#### SSH接続をする方法

EC2にSSH接続するには `eb ssh` を実行するとSSH接続できます。

```
eb ssh
```

Railsアプリは `/var/app/current/` に入っているので、気になる人はチェックしてみてください。

```:[ec2-user@ip-172-31-1-95]
cd /var/app/current/
ls
Gemfile       Rakefile  config     lib           public   tmp
Gemfile.lock  app       config.ru  log           storage  vendor
README.md     bin       db         package.json  test
```

#### エラーで表示できなかった場合

エラーなどで表示できなかった方は、ログをチェックしてみてください。

```
eb logs
```

## まとめ

今回はElastic Beanstalkを使って簡単にEC2にデプロイを試してみました。

VPC、RDSやオートスケール、ロードバランサーなど複雑な設定を知らなくても
スタンダードなインフラ設計で簡単につくれるElastic Beanstalkはとても良いと思いました。

ただ、VPCや中でなにを行われているのかわからないため、インフラを理解する観点として
同じ設計を手動で立てれるようになることも重要だと思います。

全体像を掴む方法として、まずはElastic Beanstalkを使ってみることをおすすめします！

次回の記事ではSSL化、RDSを独立させる方法、Dockerを使ったデプロイなどを解説していこうと思います。

## 参考にさせていただいたサイト

[AWSのElastic Beanstalkでナウい構成のWebアプリを構築しよう! - Qiita](https://qiita.com/DeployCat/items/f9f0c03080d9cf6c3cc6)
[Rails5.2から追加された credentials.yml.enc のキホン - Qiita](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)
[Ruby on Railsの環境構築をElastic Beanstalkで行う - Qiita](https://qiita.com/yuyasat/items/4d93b4ad4f86a6e13d50)
[RailsアプリケーションをElastic Beanstalkにデプロイするまで - Qiita](https://qiita.com/hiroeorz@github/items/c9dcdb9c648d7e8eae7f)
[【2020年版】RailsアプリをElasticBeanstalkでデプロイするまでの手順 \| ニートエンジニア](http://neet-fx.com/archives/2982)
[Elastic Beanstalk: can't find gem bundler (>= 0.a) - Stack Overflow](https://stackoverflow.com/questions/55360450/elastic-beanstalk-cant-find-gem-bundler-0-a-with-executable-bundle-gem/55378320#55378320)
[EB CLI コマンドリファレンス](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-cmd-commands.html)