LoginSignup
135
145

More than 5 years have passed since last update.

初心者がAWSでRailsアプリを動かすためにやったこと

Posted at

0.はじめに

0-1.はじめに

AmazonのAWSの無料枠を利用し、小さくRailsアプリケーション開発をはじめることにしました。AWS導入の備忘録を兼ね、所感をまとめました。
私は、プログラミング初心者のため、記載している内容に誤りがある可能性があります。誤りや、改善した方が良い点などあれば、コメントなどでご指摘いただけると幸いです。

0-2.作ったサービス

https://door2.me
現在β版です。

こんな感じのプロフィールが簡単に作成できます。

0-3.対象読者

  • 私と同じようにWebアプリケーション開発初心者の方
  • これからAWSを触ってみようと思っている方 上記のような方に、AWSの敷居がそう高くないことが伝われば幸いです。

0-4.大まかな流れ

  • 1.AWSについて知る
  • 2.アカウントを登録する(IAMユーザの作成、MFAの設定)
  • 3.EC2でサーバを立ち上げる
  • 4.負荷分散、独自ドメインでのアクセスを可能にする
  • 5.その他サービス(RDS、S3)の導入
  • 6.Production環境の設定(備忘録)

1.AWSについて知る

1-1.AWSかそれ以外か

AWS利用前は、定額のさくらVPSを利用するか、Herokuで運用するのが今の自分には一番合っていると思っていました。AWSは、設定をミスすると高額の請求が来そうだし、見たこともない用語が並んでいるので、初心者には難しいイメージでした。しかし、GoogleでAWSについて調べたり、ドットインストールの"Amazon Web Services入門"などを見たりしているうちに、これは早々に利用して使えるようになっておくべきと感じました。なにしろ、デメリットが見つかりません。

ちなみに、Herokuは、最近プランの見直しが入り、無料プランでは、1日6時間以上Sleepする必要があります。

1-2.AWSの無料枠って?

この記事を読んで、WebアプリをAWSを動かそうとしている人は、この点がまず気になると思います。
ザックリ言えば、EC2のmicroインスタンスを"1つ"使用するだけであれば、ほぼ無料で使えます。"ほぼ"と記載したのは、AWSのRoute53というDNSを利用して、独自ドメインでアクセスできるようにしているためです。α版として動作させる場合など、AWSの無料枠は持って来いな気がします。
※microインスタンスであっても、2つ以上立ち上げっぱなしにすると、自ずと750時間を越えてしまうため課金されます。

1-3.Vagrant(Ubuntu)でサーバ構築

どんな形でも良いので、Linuxを一度触って感覚を掴んでおくと良いです。EC2では、サーバのOSを選択してインストールするほかに、ローカル環境に用意したサーバイメージを乗せることもできます。
当初の予定では、ローカル環境(Vagrant+Ubuntu)で作成したUbuntuをAMIとして稼働させる予定でしたが、色々やっているうちに汚くなってしまったので、EC2から"Amazon Linux AMI"を選択して、新規インストールすることになりました。

2.アカウントを登録する

2-1.アカウント登録

AWSのページからアカウント登録ができます。
公式に手順書があるので、その通り入力していけば、躓くことはありません。

2-2.IAMユーザの作成、MFAの設定

アカウント登録した時点では、フル権限のrootアカウントしかありません。そのため、権限を絞ったIAMユーザの作成と、二段階認証のMFA(Multi-Factor Authentication)の設定が必須となってきます。
いずれやらなければいけない作業なので、アカウント登録時にサクッとやっておくと良いでしょう。
以下の記事を参考に私も作業させていただきました。丁寧でとてもわかりやすいです。感謝。
参考:AWSアカウント作ったらこれだけはやっとけ!IAMユーザーとAuthyを使ったMFAで2段階認証

3.EC2でサーバを立ち上げる

3-1.ドットインストールで概要を掴む

この手の記事は、検索するとたくさん出てきますが、私はドットインストールの動画を見ながら概要を学びました。課金されるポイントなどエッセンスが凝縮されているので、ぜひこの動画を最初に見ておくことをオススメします。
参考:Amazon Web Services入門

3-2.テスト的に環境を作ってみる

以下の記事を参考にテスト環境を構築してみました。とても参考になります。わからない言葉は、公式のドキュメントなどを参照しつつ、読み進めるとよいです。Subnetの作り方など、学ばせていただきました。
参考:0から始めるAWS入門:概要

3-3.必要なミドルウェアをインストールする

以下のサイトには、用語集をはじめ、様々なチュートリアルが用意されています。
指示通りにやっていけば、Railsが動作する環境ができあがります。
参考:RailsアプリをAWSにデプロイする

3-4.Elastic IPでアプリにアクセスする

Apacheでもnginxでも良いと思いますが、外部からサーバにきちんとアクセスできることを確かめます。私は、nginx+unicornで環境を構築するつもりでしたが、どうしてもうまくいかず、Phusion Passengerを導入し、動作確認しました。
※Elastic IPは、インスタンスと紐付いていれば無料で固定IPがもらえますが、遊んでいるElastic IPは課金されてしまうので、注意が必要です。

4.負荷分散、独自ドメインのアクセスを可能にする

4-1. ELB、Route53の導入

この記事通りに作業を進めている方は、ELBやRoute53といった聞き慣れない言葉が登場したと思います。それぞれ以下のような機能を備えています。

  • ELB
    Elastic Load Balancingの略で、トラフィックに応じて、複数のインスタンスに処理を分散してくれます。ヘルスチェック機能も備えており、インスタンスに異常が発生した場合、切り離してくれます。

  • Route53
    DNS(Domain Name System)で、ドメイン名をIPアドレスに解決してくれます。これで独自ドメインが使用できます。

EC2のセットアップができるようになった頃、独自ドメインやSSHアクセスもできるようにしたいと考えていました。Route53のAlias機能を利用することで、以下のような構成にすることが可能です。

AWS.png

参考:http://dev.classmethod.jp/cloud/aws/amazon-route-53-alias-records/

4-2.証明書(SSL)の導入

クライアントとサーバ間で暗号化通信できるよう、SSL証明書を取得し、ELB(Elastic Load Balancing)に設定しました。SSL証明書は、SSLストアでCOMODOのPositiveSSLを1200円で購入。自分が管理しているドメインであることを証明するために、webmaster@example.comのような形でメールを受信できる必要があるため、仮のメールサーバとして、無料のXREA、利用させていただきました。

ELB用の証明書は、以下のコマンドで作成できます。

$ cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >> ssl-bundle.crt

参考:EC2上で動作するRails 4系アプリでRapidSSLを使ってhttps設定をするときの手順

5.その他サービス(RDS、S3)の導入

RDS,S3

EC2上にデータベースを持たせても良かったのですが、障害のことを考えると予めRDSを導入しといた方が良いと思いセットアップしました。データをインスタンスに持たせないことで、資源適用など行う場合も、インスタンスを入れ替えることで対応できそうです。

S3のバケット名について

おもいっきり、ドットを使用してしまっていました。S3の導入をお考えの方は、ご注意ください。
S3のバケット名はよく考えて命名しましょう!

6.Production環境の設定のあれこれ(備忘録)

第5章までと記載レベルが大きくズレてしまいますが、備忘録を兼ねて、Production環境セットアップ時のポイントを記載しておきます。

Gem

オプションを指定しない場合、developmentのgemもインストールしようとする。

bundle install --without test development

マイグレート

指定しない場合、デフォルトの"Development"になる。

$ rake db:migrate RAILS_ENV=production
$ rake db:seed RAILS_ENV=production

環境変数の設定

rbenvのプラグイン(rbenv-vars)を使用して、SECRET_KEY_BASEの設定や、各種AWSのキーを設定する。

config/secrets.yml
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  aws_access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %>
  aws_secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>
  aws_s3_bucket: <%= ENV["AWS_S3_BUCKET"] %>
  aws_s3_bucket_dev: <%= ENV["AWS_S3_BUCKET_DEV"] %>
config/database.yml
production:
  adapter: postgresql
  host: foobar.ap-northeast-1.rds.amazonaws.com # RDSのエンドポイント
  encoding: utf8
  database: testdb
  username: <%= ENV['APPNAME_DATABASE_USER'] %>
  password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>
  pool: 5
  timeout: 5000
.rbenv-vars
SECRET_KEY_BASE="your-key"
AWS_ACCESS_KEY_ID="your-key" # S3
AWS_SECRET_ACCESS_KEY="your-key" # S3
APPNAME_DATABASE_USER="foo" # RDS
APPNAME_DATABASE_PASSWORD="bar" # RDS

Phusion Passengerの起動と停止

ProductionでのPassengerの起動と停止は以下のとおり。停止時もポート番号を指定しないと停止できない。

sudo bundle exec passenger start --port 80 --environment production
sudo bundle exec passenger stop --port 80

ヘルスチェックの設定

以下を参考にelbコントローラを作成し、設定。

参考:Rails4のforce_sslでELBからのヘルスチェックを除外する

プリコンパイル

JavaScriptやCSSに変更があった場合、必ず実行する。

$ bundle exec rake assets:precompile RAILS_ENV=production
$ bundle exec rake assets:clobber RAILS_ENV=production

Turbolinksを無効にする

JavaScriptやjQueryが正常に動作しない事象が発生したら、まずTurbolinksを疑ってみると良いです。オフにして
動いたらTubolinksを個別にオフにする。

Rails4の特徴、アップデート時の注意点(3)Turbolinksを無効にする方法
Turbolinksをオフしないためにやった事

以上、長くなってしまいましたが、初心者がAWSを利用するまでにやったことのまとめでした。
時間があれば、Google Cloud Platformも触ってみたいです。

135
145
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
135
145