初学者がAWSにデプロイする時、めちゃめちゃ設定あって挫けそうになりませんか?
ええ、わかります。。。
自分も大量のエラーと戦いながら、なんとかデプロイをした経験があります。
新しくアプリを作った時にCI/CDを使ってどうデプロイしようか?と
調べていた時にElastic Beanstalkを知りました。
実際に使ってみて、とても簡単にデプロイ出来たし、
なによりEC2へデプロイすることの全体像をサクッとつかめるなって思ったので
初学者向けに丁寧に解説しようと思って記事を書きました。
デプロイに挫けそうになった方は
ぜひElastic Beanstalkを使って試してみてください!
Elastic Beanstalk とは?
Elastic Beanstalk では、アプリケーションを実行しているインフラストラクチャについて学習することなく、AWS クラウドでアプリケーションをすばやくデプロイし、管理できます。Elastic Beanstalk は、選択肢を狭めたり制御を制限したりすることなく、管理の複雑さを軽減します。アプリケーションをアップロードするだけで、Elastic Beanstalk が自動的に容量のプロビジョニング、負荷分散、拡張、およびアプリケーションの状態のモニタリングといった詳細を処理します。
AWS Elastic Beanstalk とは
簡単に言えば、インフラ詳しくなくてもアプリをEC2にデプロイできて、
よくあるアプリのインフラ設計で勝手にチューニングしてくれるよってやつです。
料金に関しても使ったAWSリソースのみ(今回の記事ではEC2とRDS、S3)なので、
無料枠内で全然試すことができます。
詳しい技術については丁寧に解説してくれている記事が
たくさんあると思うので、興味がある人はそちらをご覧ください。
この記事では0からデプロイができるようになることをフォーカスして解説していきます!
はじめに
前提
- AWSアカウントを持っている
- Railsアプリを作成できる
- 簡単なコマンドがわかっている
大まかな流れ
- AWS CLIのインストール・セットアップ
- AWS EB CLIのインストール・セットアップ
- Railsアプリの用意・デプロイの事前準備
- RailsアプリをEC2にデプロイ
この記事のゴール
- EC2にRailsアプリをデプロイできるようになる
- ファイルを更新して、再度デプロイを行い、アプリを継続的に更新できること
AWS CLI のインストール・セットアップ
1. AWS CLI 用の IAM を作成
まずAWS CLI用のIAMを作成し、CLIから操作できるようにします。
AWS: IAMこちらからIAMのページに飛んでください。
サイドバーの ユーザー
→ ユーザーを追加
をクリックしてAWS CLI用のユーザーを追加します。
ユーザー名はわかりやすいように aws-cli
としておきます。
アクセスの種類はCLIからなので、プログラムによるアクセス
にチェックを入れます。
次のステップに進みます。
アクセス権限の付与は後ほどするので、そのまま次のステップへ。
特にタグで管理をしていないので、そのまま次のステップへ。
アクセス権限を飛ばしたのでWarningが出ていますが、後ほど追加するのでそのまま次のステップへ。
これでユーザー作成が完了しました。
アクセスキーID
と シークレットアクセスキー
は後ほど使うので、コピーしておいてください。
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
[default]
aws_access_key_id = *********
aws_secret_access_key = ******************
cat ~/.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 からグループ
→ 新しいグループの作成
をクリック。
グループ名に eb-cli
を入力し、次のステップへ。
検索窓に elasticbeanstalk
と入力すると関連のポリシーが出てきます。
FullAccess
にチェックを入れて、次のステップへ。
ポリシーが追加されているか確認し、グループの作成をクリック。
これでElastic Beanstalkのアクセス権限があるグループが作成できました。
2. ユーザーをグループに追加する
続いては冒頭に作ったAWS CLI用ユーザーをグループに追加します。
サイドバーのユーザー
→ aws-cli
をクリック。
グループ
→ ユーザーをグループに追加
をクリック。
先程作った eb-cli
にチェックを入れ、グループに追加をクリック。
これでAWS CLI用ユーザーがグループに追加され、EB CLIからElastic Beanstalkにアクセスできるようになりました。
Railsアプリの用意・事前準備
Railsアプリを用意する
必要に応じてRailsのアプリを用意してください。
Rubyは2.6.5を使用してください。
EC2でのRubyのVersionが2.6.5のため、異なるとエラーが出ます。
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
を開いて、下記のようなサイトが開けば問題ありません。
このままではトップページになにも表示されないので、routes.rb
にrootを追加します。
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はこれ以上使わないので、落としておきます。
この時点でコミットしておきます。
git add .
git commit -m "first commit"
デプロイの準備をする
eb init で初期設定を行う
eb init
を入力して初期設定をしていきます。
アプリのトップディレクトリで行ってください。
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
という設定ファイルが作成されました。
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が無いんですね。
$ bundle -v
Bundler version 1.16.0
SSHで接続してgem install bundler:2.1.4
でインストールしてもいいのですが、それだと毎回設定が必要です。
しかもこのままではAuto Scalingで2台目が立ち上がったときも設定が必要で意味がありません。
ElasticBeanstalkには初回にコマンドを実行する設定があるので、そちらで必要となる処理を記載していきます。
gem install bundlerの実行設定をする
アプリのトップディレクトリに.ebextensions
というファイルを作成します。
.
は必要なので気をつけてください!
このファイルに~.config
というファイルを作成すると実行時に読み込んで実行してくれます。
mkdir .ebextensions
cd .ebextensions
touch 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
に合わせないとエラーになります。
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
を開きます。
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 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
ブラウザでアプリが開けば成功です。
実際にユーザーを作成して成功するか試してみましょう。
New User
→ nameを入力
→ Create User
Successfullyと出れば成功です!
トップに戻ると作成されていることが確認できます。
AWS: ElasticBeanstalkを確認すると作成されたアプリケーションが確認できます。
緑色になっていると問題なく動作している状態です。
赤色などになっているとなにか問題が起きています。
作成したアプリケーションを開いてみましょう
作成したアプリケーションの情報が表示されます。
URLの部分が今回作成されたアプリケーションのURLです。
サイドバーの設定を開くとインスタンスやロードバランサーの設定を確認することができます。
再度デプロイをする方法
ファイルを更新したら、commitしてeb deploy
をすれば
自動でファイルを転送されデプロイが完了します。
git add .
git commit -m "Add ..."
eb deploy
デプロイがこんなに簡単にできるなんて最高!!
SSH接続をする方法
EC2にSSH接続するには eb ssh
を実行するとSSH接続できます。
eb ssh
Railsアプリは /var/app/current/
に入っているので、気になる人はチェックしてみてください。
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 コマンドリファレンス