なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

AWS (Amazon Linux) で Rails アプリケーションを動かす

いつか書いた下の記事の続きです。

AWS Educate を使ってみる


AWS 使ってやることも特に無いまま、試用期間が過ぎてしまいそうだったので、
とりあえず、本番環境さながら Rails アプリケーションを動かしてみようと思います。

Rails アプリケーションはこんな感じ

  • Refile でファイルアップロード
  • seed-fu で初期データぽい
  • ActiveRecord (MySQL) を使う

AWS の構成は、下のような感じ

            +----+
         +--+ S3 |
+-----+  |  +----+
| EC2 +--+
+-----+  |  +-----+
         +--+ RDS |
            +-----+

どうやら、 Elastic Beanstalk を使えばさくっとできるようですが、それはまたどこかで。
ということで、やっていきます。

EC2

まずは、アプリケーション・サーバーとして、 EC2 を使用します。
構成としては、 Rails アプリではよく見かける、 nginx + unicorn + rails にします。

インスタンスの作成

EC2 ダッシュボードへ行き、インスタンスの作成をクリック。

f:id:MikazukiFuyuno:20160403225251p:plain:w600

すると、マシンイメージの選択画面になります。
親切なことに、[無料利用枠の対象] と書いてくれているので、その中から1つを選択します。

f:id:MikazukiFuyuno:20160403225308p:plain:w600

次は、インスタンスタイプの選択。
こちらは、無料利用枠の t2.micro がすでに選択してあるので、[確認と作成]をクリック。

f:id:MikazukiFuyuno:20160403225350p:plain:w600

なお、この時ストレージ容量が 8GB となっていますが、アップロードされるファイルなどは、
S3 にて管理するため、問題ありません。

確認画面が表示されるので、問題がなければ作成。
キーペアを作成するかどうか訊かれるので、適当に作成して、ダウンロードしておきます。
ダウンロードした .pem ファイルは、適当な場所に配置し、パーミッションを設定しておきます。

$ chmod 400 amazon-ec2-pem-file.pem

ダッシュボードのインスタンスリストにて、「ステータスチェック」が「2/2 のチェックに合格」
などの、状態になったら、接続できるようになっているので、 SSH で接続していきます。

Ruby 環境の構築

SSH 接続ができるようになったので、早速接続していきます。
ダッシュボードにて、先ほど作成したインスタンスを選択し、「接続」をクリックします。
すると、表示されたダイアログに、接続方法が書かれているので、そのとおりに接続します。

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

端末に、上のようなものが表示されたら接続成功です。(EC2 って書いてあるのね...)
このとき、幾つかのパッケージにてセキュリティアップデートが提供されているようだったので、
sudo yum update にて、パッケージの更新をしておきました。

接続ができたので、まずは Ruby のインストールを行います。
(なお、はじめから Ruby 2.0.0 が入っていますが、すでに公式のサポートが切れているため、
別のバージョンを使用します。)
私は、 Ruby 2.3.0 にてアプリを開発していたので、 2.3.0 をインストールします。
ということで、必要なライブラリなどをインストールしていきます。

$ sudo yum install -y gcc
$ sudo yum install -y make
$ sudo yum install -y openssl-devel
$ sudo yum install -y zlib-devel
$ sudo yum install -y readline*
$ sudo yum install -y readline-devel
$ sudo yum install -y gcc-c++

また、 rbenv 及び ruby-build を使うため、 git をインストール。

$ sudo yum install -y git

rbenv のインストール。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ . ~/.bash_profile

rbenv に PATH が通ったかを確認しておきます。

$ rbenv --version
rbenv 1.0.0-19-g29b4da7

通っていたら、 ruby-build のインストール。

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

今回は、先ほど述べた通り、 2.3.0 をインストールします。

$ rbenv install 2.3.0

しばらくかかるので、お茶でも飲んでおきます。
終わったら、バージョンを設定しておきます。

$ rbenv rehash; rbenv global 2.3.0

ruby -v で、 ruby 2.3.0p~ って表示されていたらインストール完了です。

Rails 環境の構築

次は、 Rails を導入します。

$ gem install bundler
$ gem install rails

特に躓くところもなく、終わるはず。

Rails アプリの配置

適当な場所に配置しておきます。
私はとりあえず、 /srv/www/rails に配置しておきました。
とりあえず、今は配置のみしておきます。

nginx の導入と設定

これも躓くところはないはず。
躓くとしたら、設定くらいかな?

$ sudo yum install -y nginx

設定ファイルはこんな感じで。

upstream rails-unicorn {
    server unix:/tmp/unicorn.sock;
}

server {
    listen 80;
    listen [::]:80 ipv6only=on;

    location / {
        try_files $uri @rails-unicorn;
    }

    location ~ ^/assets/(.*) {
        alias /srv/www/rails/public/assets/$1;
    }

    location @rails-unicorn {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://rails-unicorn;
    }
}

とりあえず、これで完了。

RDS

次は、 Amazon RDS ... データベースサーバーを作成します。
RDS ダッシュボードへ移動し、[作成]をクリックします。

無料利用枠対象のエンジンが MySQL, PostgreSQL, Oracle BYOL, SQL Server Express なので、
ココは無難に MySQL を選択しておきます。

f:id:MikazukiFuyuno:20160403225427p:plain:w600

MySQL でいいです。

f:id:MikazukiFuyuno:20160403225528p:plain:w600

DB の詳細を決めます。
この時、 [RDS 無料利用枠内で〜]をチェックしておくと、安心して設定できます。

f:id:MikazukiFuyuno:20160403225637p:plain:w600

詳細設定も、適当に設定して、完了します。
「ステータス」が「利用可能」になれば、OK です。

S3

最後は、 Amazon S3 の設定です。
こちらも、 S3 ダッシュボードに移動し、[バケットの作成] をクリックします。
バケット名を適当に入力し、作成すれば OK です。

アプリの立ち上げ

まずは、 Refile のアップロード先を、 S3 に変更します。
このとき、 access_key_idsecret_access_key が必要となるので、発行します。

まず、「認証情報」へ行き、「ユーザー」から、新しく IAM ユーザーを作成します。
とりあえず、 refile-upload とか、そういう名前にして、「作成」をクリックすると、
access_key_idsecret_access_key が発行されるので、入力しておきます。
まぁ、基本は環境変数とかに設定しておけばいいと思います。

また、この状態だと何もできないので、[ポリシーのアタッチ]から...

f:id:MikazukiFuyuno:20160403225652p:plain:w400

「S3」で検索をかけて、「AmazonS3FullAccess」を付与しておきます。

Refile の設定はこんな感じになるはず。

require "refile/s3"

aws = {
  access_key_id: "your-iam-access-key-id",
  secret_access_key: "your-iam-secret-access-key",
  region: "ap-northeast-1",
  bucket: "your-bucket-name"
}
Refile.cache = Refile::S3.new(prefix: "cache", **aws)
Refile.store = Refile::S3.new(prefix: "store", **aws)

Region の設定については、こちらを参考に行います。

これで、 Refile の設定は完了。
次はデータベースの設定です。

RDS ダッシュボードの「インスタンス」に移動し、エンドポイントをコピーし、

production:
  <<: *default
  host: your-rds-endpoint.rds.amazonaws.com
  database: your-database-name
  username: your-mysql-user-name
  password: your-mysql-user-password

こんな感じで設定しておきます。
一応、 Sequel Pro などで、 EC2 経由でアクセスできるかを確認するのをおすすめします。

設定が完了したら、データベースの作成などを行っていきます。

$ bundle exec rake assets:precompile RAILS_ENV=production
$ bundle exec rake db:create RAILS_ENV=production
$ bundle exec rake db:migrate RAILS_ENV=production
$ bundle exec rake db:seed_fu RAILS_ENV=production

次に、シークレットキーの作成。

$ bundle exec rake secret

出力された文字列を、 SECRET_KEY_BASE に設定しておきます。
最後に、 unicorn の設定。
これは、過去に紹介したこちらのスクリプトをまた使いました。

また、 Refile が ImageMagick を使うので、インストールしておきます。

$ sudo yum install -y ImageMagick

そして、最後に nginx を起動すれば完了です。

$ sudo service nginx start

この状態で、EC2 パブリックアドレスにアクセスすれば、ページが表示されます。