いつか書いた下の記事の続きです。
AWS 使ってやることも特に無いまま、試用期間が過ぎてしまいそうだったので、
とりあえず、本番環境さながら Rails アプリケーションを動かしてみようと思います。
Rails アプリケーションはこんな感じ
AWS の構成は、下のような感じ
+----+ +--+ S3 | +-----+ | +----+ | EC2 +--+ +-----+ | +-----+ +--+ RDS | +-----+
どうやら、 Elastic Beanstalk を使えばさくっとできるようですが、それはまたどこかで。
ということで、やっていきます。
EC2
まずは、アプリケーション・サーバーとして、 EC2 を使用します。
構成としては、 Rails アプリではよく見かける、 nginx + unicorn + rails にします。
インスタンスの作成
EC2 ダッシュボードへ行き、インスタンスの作成をクリック。
すると、マシンイメージの選択画面になります。
親切なことに、[無料利用枠の対象] と書いてくれているので、その中から1つを選択します。
次は、インスタンスタイプの選択。
こちらは、無料利用枠の t2.micro がすでに選択してあるので、[確認と作成]をクリック。
なお、この時ストレージ容量が 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 を選択しておきます。
MySQL でいいです。
DB の詳細を決めます。
この時、 [RDS 無料利用枠内で〜]をチェックしておくと、安心して設定できます。
詳細設定も、適当に設定して、完了します。
「ステータス」が「利用可能」になれば、OK です。
S3
最後は、 Amazon S3 の設定です。
こちらも、 S3 ダッシュボードに移動し、[バケットの作成] をクリックします。
バケット名を適当に入力し、作成すれば OK です。
アプリの立ち上げ
まずは、 Refile のアップロード先を、 S3 に変更します。
このとき、 access_key_id
と secret_access_key
が必要となるので、発行します。
まず、「認証情報」へ行き、「ユーザー」から、新しく IAM ユーザーを作成します。
とりあえず、 refile-upload
とか、そういう名前にして、「作成」をクリックすると、
access_key_id
と secret_access_key
が発行されるので、入力しておきます。
まぁ、基本は環境変数とかに設定しておけばいいと思います。
また、この状態だと何もできないので、[ポリシーのアタッチ]から...
「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 パブリックアドレスにアクセスすれば、ページが表示されます。