21
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-16

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

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

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

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

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

Elastic Beanstalk とは?

AWS-Elastic-Beanstalk@4x.png

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

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

aeb-architecture2.png

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

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

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

はじめに

前提

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

大まかな流れ

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

この記事のゴール

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

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

1. AWS CLI 用の IAM を作成

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

AWS: IAMこちらからIAMのページに飛んでください。

サイドバーの ユーザーユーザーを追加 をクリックしてAWS CLI用のユーザーを追加します。
iam_001.jpg

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

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

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

iam_002.jpg

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

iam_003.jpg

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

iam_004.jpg

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

iam_005.jpg

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

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

iam_006.jpg

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
~/.aws/credentials
[default]
aws_access_key_id = *********
aws_secret_access_key = ******************
cat ~/.aws/config
~/.aws/config
[default]
region = ap-northeast-1
output = json

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

詳しくはAWS CLI の設定をご覧ください。

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 からグループ新しいグループの作成 をクリック。

iam_eb_001.jpg

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

iam_eb_002.jpg

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

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

iam_eb_003.jpg

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

iam_eb_004.jpg

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

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

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

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

iam_eb_005.jpg

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

iam_eb_006.jpg

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

iam_eb_007.jpg

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

iam_eb_008.jpg

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 を開いて、下記のようなサイトが開けば問題ありません。

SS_ 2020-03-15 22.36.37.jpg

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

~/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 という設定ファイルが作成されました。

eb_init_directory.jpg

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

~/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

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

~/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.42.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 のキホン

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

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

~/eb_sample_app/config/master.key
da7xxxxxxxxxxxxxxxxxdf1b1de

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

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

eb create実行する時に以下のコマンドを付ければ解決です。
※まだ実行しないでください。

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作成するオプションを付けて自動で作成されるようにします。
※まだ実行しないでください。

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

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

eb_product.jpg

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

New Usernameを入力Create User

Successfullyと出れば成功です!

eb_product_user.jpg

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

eb_product_users.jpg

AWS: ElasticBeanstalkを確認すると作成されたアプリケーションが確認できます。

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

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

eb_plat.jpg

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

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

eb_plat2.jpg

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

再度デプロイをする方法

ファイルを更新したら、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
Rails5.2から追加された credentials.yml.enc のキホン - Qiita
Ruby on Railsの環境構築をElastic Beanstalkで行う - Qiita
RailsアプリケーションをElastic Beanstalkにデプロイするまで - Qiita
【2020年版】RailsアプリをElasticBeanstalkでデプロイするまでの手順 | ニートエンジニア
Elastic Beanstalk: can't find gem bundler (>= 0.a) - Stack Overflow
EB CLI コマンドリファレンス

21
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?