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


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

### 0-2.作ったサービス
[https://door2.me](https://door2.me)
現在β版です。

こんな感じの[プロフィール](https://door2.me/kazu)が簡単に作成できます。


### 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](http://vps.sakura.ad.jp/)を利用するか、[Heroku](https://www.heroku.com/)で運用するのが今の自分には一番合っていると思っていました。AWSは、設定をミスすると高額の請求が来そうだし、見たこともない用語が並んでいるので、初心者には難しいイメージでした。しかし、GoogleでAWSについて調べたり、[ドットインストール](http://dotinstall.com/)の"Amazon Web Services入門"などを見たりしているうちに、これは早々に利用して使えるようになっておくべきと感じました。なにしろ、デメリットが見つかりません。

ちなみに、[Heroku](https://www.heroku.com/)は、最近プランの見直しが入り、無料プランでは、1日6時間以上Sleepする必要があります。

### 1-2.AWSの無料枠って？
この記事を読んで、WebアプリをAWSを動かそうとしている人は、この点がまず気になると思います。
ザックリ言えば、EC2の[microインスタンス](https://aws.amazon.com/jp/ec2/instance-types/)を"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](http://aws.amazon.com/jp/)のページからアカウント登録ができます。
公式に[手順書](https://aws.amazon.com/jp/register-flow/)があるので、その通り入力していけば、躓くことはありません。

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


## 3.EC2でサーバを立ち上げる
### 3-1.ドットインストールで概要を掴む
この手の記事は、検索するとたくさん出てきますが、私はドットインストールの動画を見ながら概要を学びました。課金されるポイントなどエッセンスが凝縮されているので、ぜひこの動画を最初に見ておくことをオススメします。
参考：[Amazon Web Services入門](http://dotinstall.com/lessons/basic_aws)

### 3-2.テスト的に環境を作ってみる
以下の記事を参考にテスト環境を構築してみました。とても参考になります。わからない言葉は、[公式のドキュメント](https://aws.amazon.com/jp/documentation/)などを参照しつつ、読み進めるとよいです。Subnetの作り方など、学ばせていただきました。
参考：[0から始めるAWS入門：概要](http://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde)

### 3-3.必要なミドルウェアをインストールする
以下のサイトには、用語集をはじめ、様々なチュートリアルが用意されています。
指示通りにやっていけば、Railsが動作する環境ができあがります。
参考：[RailsアプリをAWSにデプロイする](https://cyllabus.jp/courses/XCP7mfjvEjNArvvaqSZ3Hg)

### 3-4.Elastic IPでアプリにアクセスする
Apacheでもnginxでも良いと思いますが、外部からサーバにきちんとアクセスできることを確かめます。私は、nginx+unicornで環境を構築するつもりでしたが、どうしてもうまくいかず、[Phusion Passenger](https://www.phusionpassenger.com/)を導入し、動作確認しました。
※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](https://qiita-image-store.s3.amazonaws.com/0/70446/890385e9-7568-ce61-0f89-0becb777b22d.png "AWS.png")

参考：[http://dev.classmethod.jp/cloud/aws/amazon-route-53-alias-records/](http://dev.classmethod.jp/cloud/aws/amazon-route-53-alias-records/)

## 4-2.証明書（SSL）の導入
クライアントとサーバ間で暗号化通信できるよう、SSL証明書を取得し、ELB(Elastic Load Balancing)に設定しました。SSL証明書は、[SSLストア](http://www.ssl-store.jp/)でCOMODOの[PositiveSSL](http://www.ssl-store.jp/comodo-positivessl/)を1200円で購入。自分が管理しているドメインであることを証明するために、webmaster@example.comのような形でメールを受信できる必要があるため、仮のメールサーバとして、無料の[XREA](https://www.value-domain.com/xrea.php)、利用させていただきました。

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

```
$ cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >> ssl-bundle.crt
```
参考：[EC2上で動作するRails 4系アプリでRapidSSLを使ってhttps設定をするときの手順](http://saitou.hatenablog.com/entry/2014/06/24/011848)


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

### S3のバケット名について
おもいっきり、ドットを使用してしまっていました。S3の導入をお考えの方は、ご注意ください。
[S3のバケット名はよく考えて命名しましょう！](http://blog.dateofrock.com/2012/02/s3.html)


## 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](https://github.com/sstephenson/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からのヘルスチェックを除外する](http://qiita.com/mikeda/items/deda6090ea94f34cd368)


## プリコンパイル
JavaScriptやCSSに変更があった場合、必ず実行する。

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

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

[Rails4の特徴、アップデート時の注意点（３）Turbolinksを無効にする方法](http://ameblo.jp/hbnizm31/entry-11824995890.html)
[Turbolinksをオフしないためにやった事](http://qiita.com/saboyutaka/items/bcc0966313c6f7399a6e)


以上、長くなってしまいましたが、初心者がAWSを利用するまでにやったことのまとめでした。
時間があれば、[Google Cloud Platform](https://cloud.google.com/)も触ってみたいです。