プログラミング

Ruby on RailsアプリをAWS Elastic Beanstalkを使ってデプロイする

eyecatch-aws

AWSを使ってアプリをデプロイしたい、運用したいといった時に、EC2インスタンスを立てて、RDSインスタンスを立てて、ネットワーク等を設定して、とやることが多くとても面倒です。

もちろん一つ一つ自分で設定していくことで、中身を理解するので、必要な作業ではあるのですが、それらをまとめて設定してくれるのがAWS Elastic Beanstalkの良いところです。

それだけでなく、Auto Scalingなども管理してくれるので、使わない手はない、ということで、今回はAWS Elastic Beanstalkの使い方を記載していきます。

ちなみに、「Beanstalk」とは「豆の木」という意味です。
公式URL: AWS Elastic Beanstalkとは

すべて自分で構築していきたいという方には、こちらの本がオススメです。サーバー・ネットワークと、全てを自分で構築していくことになりますので、より理解が深まります。

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版

AWSアカウントの作成とIAMの作成

アカウントをまだ持っていない方は、まずはアカウントを作りましょう。
アカウントを作成する際には、クレジットカードを登録する必要がありますが、Elastic Beanstalkも無料枠で利用可能です。

正確にはElastic Beanstalk自体が無料なのではなく、Elastic Beanstalkによって展開されるインスタンス等を無料枠のものを選択することで、無料で利用できるようになります。

ドメインの取得

実際にサービスを運用していくには、ドメインの取得が必須です。必要に応じて取得してください。

Elastic Beanstalkの環境構築

ここからはElastic Beanstalkのサービスを用いて環境を構築していきます。

アプリケーションの作成

まずは「Elastic Beanstalk」のダッシュボードを開き、「新しいアプリケーションの作成」を選択します。

aws-elasticbeanstalk-app-create

「アプリケーション名」を入力し、「作成」をクリックします。今回は「rails-aws-sample」というアプリケーション名にします。

なお、タグを追加することも可能ですが、特に必要はありません。

環境の作成

アプリケーションの作成が完了したら、その配下に「環境」を作成します。

「新しい環境の作成」をクリックします。

aws-elasticbeanstalk-env-create

「ウェブサーバー環境」が選択されていることを確認して、「選択」をクリックします。

aws-elasticbeanstalk-env-create

環境名を入力します。今回は「rails-dev」とします。
ドメイン・説明は空欄のままでOKです。

aws-elasticbeanstalk-env-create

プラットフォームは「管理されたプラットフォーム」が選択されていることを確認します。そして今回はRuby on Railsのアプリケーションをデプロイするので、「プラットフォーム」のプルダウンで「Ruby」を選択します。

ブランチ・バージョンの指定も可能ですが、デフォルトのままでOKです。

aws-elasticbeanstalk

アプリケーションコードは、今は、「サンプルアプリケーション」が選択されている状態でOKです。

ここまでの入力を確認し、「より多くのオプション設定」をクリックし、詳細設定に進みます。

「環境の作成」をクリックして、一旦環境を作成しても良いですが、環境構築の段階では、何度も設定を調整・修正することになります。

環境の詳細設定

aws-elasticbeanstalk-env-create

詳細設定に入ると、プリセットを最初に選択することになりますが、一旦「高可用性」を選択しましょう。それにより、より詳細な設定が行えるようになります。

「ソフトウェア」の設定

ソフトウェアの設定では、今回は主に環境変数を設定します。

X-Ray、S3ログストレージ、CloudWatch Logsの設定もここで行いますが、サービスを運用していく中で変更すれば良いと思います。ちなみに、私はここでX-Ray、S3ログストレージ、CloudWatch Logsをすべてオンにして運用しています。ずっとオンにしていると料金が掛かってくるので、X-Rayは月に数日のみここでオンオフを設定しています。今回は必要ないでしょう。
aws-elasticbeanstalk-software-settings

環境変数(AWSコンソール上では環境プロパティと表示されている)には、デフォルトで、以下の5つが設定されています。

  • BUNDLER_DEPLOYMENT_MODE
  • BUNDLE_WITHOUT
  • RACK_ENV
  • RAILS_SKIP_ASSET_COMPILATION
  • RAILS_SKIP_MIGRATIONS

これらには触らずに、Railsをデプロイするためにいくつか環境変数を追加していきます。

  • RAILS_DB_HOST (一旦空欄のままにします、後ほどRDS作成後に再度修正します)
  • RAILS_DB_PASSWORD(postgresなど任意の文字列)
  • RAILS_DB_USERNAME(postgresなど任意の文字列)
  • ENVIRONMENT(producition or development)
  • SECRET_KEY_BASE(このあと解説)

(上記の環境変数名は一般的な例です。)

前回の記事でDockerで作成した環境変数を設定しましたが、同じことをEC2で設定しているとの認識で大丈夫です。

SECRET_KEY_BASEは本番環境で必要になる暗号キーです。ターミナルで以下のコマンドを打ち込み生成します。

$ docker-compose run —-rm web rails secret

そうすると生成されたキーがターミナル上に表示されるので、それをコピーして先程の環境変数として入力します。(dockerを使用していない場合は、素直に”rails secret”等で実行してください。)

くれぐれも紛失・流出しないように注意してください。

ここまで入力が完了したら、「保存」をクリックします。

これで「ソフトウェア」の設定はひとまず完了です。

「容量」の設定

「容量」の設定では、Auto Scaling グループの設定等を行うことが可能です。また構築するWEBサーバーのEC2インスタンスタイプを指定することが出来ます。

試しに環境を構築してみるだけならデフォルトのままで大丈夫です。

aws-elasticbeanstalk

Auto Scalingを有効にするには、「環境タイプ」を「負荷分散」にして、インスタンスの最大数を2以上にすれば良いです。今回は「負荷分散」「最大数1」で行きます。この設定では結局EC2インスタンスは1台しか展開されません。

「インスタンスタイプ」はデフォルトでは「t2.micro」(無料枠の範囲内)となっていますが、実際に運用する際には、最低でも「t3.small」ぐらいは欲しいところです。Railsを稼働させるのにメモリ等がある程度消費されるので、状況に応じて、ここは修正します。

今回は無料枠の範囲で行きたいので、ひとまず「t2.micro」のままにします。

画面下側の「保存」をクリックして「容量」の設定を完了させます。

「ローリング更新とデプロイ」の設定

デプロイメントポリシーを「ローリング」にします。
(インスタンスの数は1の場合は、特に設定しなくても大丈夫です。)

aws-elasticbeanstalk

「セキュリティ」の設定

ここでは、EC2のキーペアを設定する必要があります。

aws-elasticbeanstalk

AWSのEC2ダッシュボードを開いて、左側のメニューから「キーペア」を選択します。そして、画面上部に表示される「キーペアを作成」をクリックします。

キーペアの名前を入力し、ファイル形式が「pem」になっていることを確認して、「キーペアを作成」をクリックします。自動でダウンロードされます。

ダウンロードしたpemファイルを紛失すると、作り直す必要がありますので注意していください。

そしてこのpemファイルを、user配下の「.ssh」フォルダに格納しておきます。

aws-elasticbeanstalk-pem

Elastic Beanstalkのセキュリティ設定に戻り、「EC2キーペア」の右横のリロードボタンをクリックすると、先程作成したキーペアが選択できるようになります。

aws-elasticbeanstalk

「モニタリング」の設定

「アプリケーション 4xx を無視」
「ロードバランサー 4xx を無視」
にチェックを入れます。

aws-elasticbeanstalk

「インスタンス」「ロードバランサー」の設定

こちらは特に触る必要がないので、次に行きます。興味があるなら中身をさらっと確認してみましょう。

環境の構築

ここまででひとまずの設定が完了しました。
これで、環境を作成すると、以下のような表示に切り替わります。

aws-elasticbeanstalk-deploy

環境名のすぐ下に表示されているURLをクリックすると、デプロイされているサンプルアプリの画面が表示されます。

aws-elasticbeanstalk

次はRDSインスタンスです。。

RDSインスタンスの作成

RDSとはRDMS(relational database management system)専用のDBサーバーのサービスです。

RDSでDBサーバーをたてて、Elastic Beanstalkと連携させて、WEBサーバー・DBサーバーという構成を構築していきます。

RDSインスタンスを構築する

aws-rds-settings

「標準作成」を選択し、「エンジンタイプ」を選択します。今回はPostgreSQLを選択します。バージョンはデフォルトで最新のものを選択しておけばOKです。

aws-rds-settings

「テンプレート」は今回は最小構成でいくので、「無料利用枠」を選択します。
「認証情報の設定」では、マスターユーザー名・マスターパスワードを入力します。この値には、Elastic Beanstalkの環境変数に入力した「RAILS_DB_USERNAME」と「RAILS_DB_PASSWORD」と同じ値を入力します。

「インスタンスサイズ」は無料枠でいくなら、「t2.micro」にします。

「接続」のセクションでは、環境構築段階では、「パブリックアクセス可能」を「あり」に設定しておくと良いでしょう。その他ポート等はデフォルトのままでOKです。

「データベース認証」もデフォルトのまま「パスワード認証」を選択しておきます。

aws-rds-settings

最後に「追加設定」のセクションを開き、「最初のデータベース名」を入力します。ここは、デプロイするrailsの”database.yml”に指定しているデータベース名を入力します。

「最初のデータベース名」を入力しておくと、”rails db:create”する必要がなくなります。後ほどsshでインスタンスに入ってコマンドでcreateしても良いです。

最後に、画面下の「データベースの作成」をクリックします。

RDSをElastic Beanstalkと連携させる

作成したDBインスタンスを選択し、「接続とセキュリティ」タブを開きます。

aws-rds-settings

ここに、「エンドポイント」が記載されているので、この値をコピーして、Elastic Beanstalkの環境変数に設定します。

aws-elasticbeanstalk-settings

Elastic Beanstalkの環境を開き 設定 > ソフトウェア と進み、先程確認した「エンドポイント」を”RAILS_DB_HOST”の値として貼り付けます。

「適応」をクリックして、環境変数の変更を反映させます。

デプロイ

いよいよアプリをデプロイしますが、その前にawsコマンドを使えるように準備する必要があります。

profileの作成

作成しているIAMのprofileを作成します。

$ aws configure —profile username
AWS Access Key ID: {アクセスキー}
AWS Secret Access Key: {シークレットアクセスキー}
Default region name: ap-northeast-1
Default output format: json

.elasticbeanstalk

アプリ直下に、”.elasticbeanstalk”フォルダを作成し、その中に”config.yml”ファイルを作成します。

aws-eb-config
branch-defaults:
  master:
    environment: rails-dev
global:
  application_name: rails-aws-sample
  default_region: ap-northeast-1
  include_git_submodules: true
  sc: git
  workspace_type: Application
  profile: rails_dev_user

「environment」「application_name」「default_region」「profile」はそれぞれの環境に併せて修正してください。

そして、最後に、以下のコマンドを入力します。

$ eb deploy
20XX-XX-XX XX:XX:XX INFO: Environment update is starting.
20XX-XX-XX XX:XX:XX INFO: Deploying new version to instance(s).
20XX-XX-XX XX:XX:XX INFO: New application version was deployed to running EC2 instances.
20XX-XX-XX XX:XX:XX INFO: Environment update completed successfully.

このように表示されれば完了です。

エラーが出る場合は、AWSコンソールから、ログを確認することも可能です。
“eb ssh”で環境に接続し、”/var/log/”のeb-engine.log等を確認して適宜対応します。