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機能を利用することで、以下のような構成にすることが可能です。
参考: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のキーを設定する。
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"] %>
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
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も触ってみたいです。