AWS設定やった手順まとめ

参考サイト

0から始めるAWS入門:概要

http://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde

ここの連続の記事を参考にさせていただきながら設定していきます。

さいしょに

最初に以下のことを行っておく。

  • アカウントを登録
  • リージョンをTokyoに変更


概要

  1. VPCの作成
  2. EC2インスタンス作成
  3. Nginxインストール
  4. ELBの作成
  5. RDSの作成

VPCの作成

VPCとは

VPCとは、

Amazon Virtual Private Cloud(Amazon VPC)を使用すると、定義した仮想ネットワーク内にアマゾン ウェブ サービス(AWS)リソースを起動できます。仮想ネットワークは、ご自身のデータセンターで操作していた従来のネットワークとよく似ていますが、AWS のスケーラブルなインフラストラクチャを使用できるというメリットがあります。 http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Introduction.html

ということらしく、

  • サブネット単位・ホスト単位での柔軟なアクセス制御ができる
  • パブリック・プライベートサブネットの切り分けができる
  • 固定のローカルIPを使える

というメリットがある。

VPC作成

Create VPCVPCを作成する。設定はこんな感じで。10.0.0.0/16のアドレス空間を扱うVPCを作成する。

  • Name tag: first-vpc
  • CIDR block: 10.0.0.0/16
  • tenancy: Default

tenancyとは、このVPCがハードウェアを専有するかどうか。

ということらしい。機密性が高かったりするとコンプライアンス的にハードウェアを占有する必要がある場合もあるのかな。

Subnet作成

そしたらこのVPC内にSubnetを作成する。

Subnetとは、

サブネットとは、大きなネットワークを複数の小さなネットワークに分割して管理する際の管理単位となる小さなネットワーク。 ... TCP/IPでコンピュータの住所をあらわすIPアドレスは、コンピュータが所属するサブネットのアドレス(ネットワークアドレス)と、サブネット内でのコンピュータ自身のアドレス(ホストアドレス)から構成されており、上位何ビットがネットワークアドレスかをあらわす値を「サブネットマスク」という。 http://e-words.jp/w/%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88.html

サブネットマスクがどこまでがネットワーク部でどこまでがホスト部なのかを決めてるのね。

Subnet作成

Available Zone(地理的にサーバーを離しておくことで緊急時に備えている)を設定する

  • Name tag first-AZ-a
  • VPC 上記で作成したVPCを選択する
  • Availability Zone ap-northeast-1a
  • CIDR 10.0.0.0/24

この要領でもうひとつ別のAvailable ZoneのSubnetを作成しておく。

CIDRを10.0.1.0/24とかにする。

Internet Gatewayの追加

Create Internet GatewayGatewayを作成して、それを選択したまま上のボタンのAttach to VPCVPCと紐づける。

Internet Gatewayとは

インターネットゲートウェイは、VPCインスタンスとインターネットとの間の通信を可能にする VPC コンポーネントであり、冗長性と高い可用性を備えており、水平スケーリングが可能です。そのため、ネットワークトラフィックに課される可用性のリスクや帯域幅の制約はありません。インターネットゲートウェイは 2 つの目的を果たします。1 つは、インターネットにルーティングできるトラフィックの送信先を VPC のルートテーブルに追加ことです。もう 1 つは、パブリック IP アドレスが割り当てられているインスタンスに対してネットワークアドレス変換 (NAT) を行うことです。

Routes Tableの追加

このままだとまだインターネットに接続できないので、Routes Tableを作成する。

下のRoutesからさっき作ったVPCに接続。

Route Tableとは

ルーティングテーブルとは、ルータや端末が保持するパケットの配送先に関する経路情報。

TCP/IPネットワークでパケットを送ろうとするとき、ルーティングテーブルを参照してパケットを送付すべき相手を判断する。ある端末から他の端末へとパケットを送ろうとする場合、目的の端末が自ネットワーク内にない場合、端末内にあるルーティングテーブルを参照し、パケットを中継させる端末を決定する。 http://www.atmarkit.co.jp/ait/articles/0111/01/news002.html

2. EC2インスタンス作成

EC2を選択して、Launch InstanceでEC2のインスタンスを作成。

OS

OSはAmazon Linuxを選択。Amazon LinuxRed Hat Enterprise互換とのこと。

The Amazon Linux AMI is an EBS-backed, AWS-supported image. The default image includes AWS command line tools, Python, Ruby, Perl, and Java. The repositories include Docker, PHP, MySQL, PostgreSQL, and other packages.

いたれりつくせりかんある。

インスタンスタイプ

インスタンスタイプを選択する。

今回は12ヶ月無料のt2.microで。

そのまま設定を行っていく。

細かい設定に関してはこの記事を参考にさせていただきました。

ポートはSSHの22とHTTPの80だけ開けておく。

あと開けとくとしたらping用にAll ICMPとのちのちHTTPSくらいかな?

起動画面の前に、秘密鍵・公開鍵を生成しておく。このときに鍵をダウンロードできる。sshで接続するときに必要なので絶対なくさないこと

ここで起動完了。

SSHで接続してみる

ということで早速立ち上げたインスタンスsshで接続してみる。

さっき作ったInstanceのdashboard的なところからPublic IPが確認できる。

デフォルトのユーザはec2-userになってる。

$ ssh ec2-user@{Public IP} -i ~/.ssh/first.pem

IPアドレスが違ったかセキュリティグループの設定を間違えたのか、このままだとsshで接続できなかったので他のサイトを参考に試してみた。

http://www.task-notes.com/entry/20141102/1414929682

ただこれだとセキュリティが甘々すぎてまずいのであとで変更する必要アリ。

ここでPingで疎通確認したいならICMP用のポートも空けておこう。

3.Nginxインストール

Nginxをインストールして、サーバーをスタートさせます。と言ってもやることはコマンド3つだけ。

$ sudo yum install -y nginx
$ sudo /etc/init.d/nginx start
$ sudo chkconfig nginx on

これでIPアドレスにアクセスすればひとまず200 OKが返ってくるはず。

f:id:to_tu:20150830154114p:plain

4. ELBの作成

EC2のDashboardからLoad Balancersを選択して、Create Load Balancersを選択する。

Basic Configure

HTTPとHTTPSを設定。Load Balancer PortとInstance Portをそれぞれ、

  • HTTP: 80, 80
  • HTTPS: 443, 80

とする(デフォルトでこうなるはず)

これでインターネットからELBへ80、443番でリクエストが来た場合、該当EC2インスタンスの80番へフォワードされる。

次の画面でSSLの証明書を登録する必要があるので、今回はHTTPのみで。

Assign Security Groups

Load BalancerはHTTPSなしだとSecurityを改善しようという画面になって作ることができなかった。。SSLなしでも作る方法あるのだろうか。

5. RDS作成

Subnetを作成

RDSのところから、Create Subnet Groupを選択。Subnetを先に設定しないといけない。

パラメータグループの作成

DBのパラメータ設定をしておく。DBの初期設定を登録しておける。

自分の環境は、

$ psql -V
psql (PostgreSQL) 9.4.4

だったのでpostgres9.4を選択。

Macの環境下で自分のpsqlのconfファイルなどを確認した場合、以下のパスを除けばいろいろ置いてあると思います。(brewでインストールした時)

$ ls /usr/local/var/postgres/

ひとまず

timezone = "Japan"

にしておきました。

セキュリティグループの作成

DB用のセキュリティグループを設定します。

VPC内からのみDBへのアクセスを許可する感じに。

Inbound RulesにPostgreSQLの設定を。初期Portは5432なんだね。

Screenshot 2015-08-30 15.01.53.png

RDS起動!

そしたら前準備は整ったので、RDSを起動します。

トップのGet Started Nowのところから。

ここを参考に設定を進めてく

http://qiita.com/hiroshik1985/items/6643b7323183f82297b2

設定画面は一応キャプチャしておこう...笑

リードレプリカ作成

リードレプリカというものを作成しておきます。

これは、スケーリング、負荷分散のテクニックの一つで、

リードヘビー(読み込みが多い)なワークロードに関しては、読み込みを、複数の“リードレプリカ(読み込み用のレプリカ)”に分散させる http://aws.typepad.com/aws_japan/2010/10/amazon-rds%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BDread-replica%E3%81%AE%E7%99%BA%E8%A1%A8.html

というテクニックとのことです。また、AWSでのRead Replicaの機能は2010年ごろに発表されたものみたい。

全ての書き込みは、ソースDBインスタンスに対して行われます。リードレプリカは、ソースDBインスタンスに対する書き込みを全てトラックし、自分自身のデータをアップデートします。

そういう仕組みなのかーー。すごいななんか...。もっと自分も知識つけなきゃ。ということで今回は複数ではなくひとつだけRead Replicaを作成してみます。

DBのInstanceの立ち上げが終わった後に、そのInstanceを右クリックしたところから、Read Replicaの作成をすることができます。

適当にidentifierを設定して、AZをもう一つの方にしておく。

ボタン一発。。。すごい。。。

Amazon LinuxにrbenvなRubyでRails用の環境構築

Special Thanks

http://qiita.com/na0AaooQ/items/5bd62e630a2faf051a52

手順

目次

  1. git
  2. Ruby
    1. パッケージ類
    2. rbenv
    3. ruby-build
  3. Rails

EC2のインスタンスはすでに作成して設定済みという前提です。

totutotu.hatenablog.com

EC2インスタンスssh接続して必要な環境を構築していきます。

1. git

$ sudo yum install git

2. Ruby

パッケージ

Amazon LinuxにRuby on Rails環境構築(rbenv + ruby-build + Ruby 2.2.1 + Rails 4.2.1インストール)を参考にRailsの環境を構築。

Rubyに必要なパッケージをボボンとインストール。

$ sudo yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel

rbenv

rbenvをインストール

$ sudo git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
# sudo -s
# git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
# cp -p /etc/profile /etc/profile.ORG
# diff /etc/profile /etc/profile.ORG
#

# echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile
# echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile
# echo 'eval "$(rbenv init -)"' >> /etc/profile

自分の場合リダイレクトだとsudoでもpermission deniedと怒られてしまったので$ sudo vi /etc/profileで以下を書き込んだ。

# rbenv settings
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"

profileを読み込みなおして確認。

# source /etc/profile
# rbenv -v
rbenv 0.4.0-153-g3b6faa8

おっけーだね。

ruby-build

したら次はruby-build

# git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build

Ruby

そしたらやっとこさRubyインストール。今回は2.2.2いれます。

# rbenv install -l | grep 2.2.2
  2.2.0
  rbx-2.2.2
# rbenv install 2.2.2

インストールが完了したらrehashして2.2.2をglobalに設定する。

# rbenv rehash
# rbenv global 2.2.2
# ruby -v 
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]

Rails

Railsを入れます。1.9以降ならgemは入ってるはずなので

# gem update --system
# gem install nokogiri -- --use-system-libraries
# gem install --no-ri --no-rdoc rails
# gem install bundler
# rbenv rehash
# rails -v
Rails 4.2.4

現時点で入ってるgemはこんな感じ。

# gem list
*** LOCAL GEMS ***

actionmailer (4.2.4)
actionpack (4.2.4)
actionview (4.2.4)
activejob (4.2.4)
activemodel (4.2.4)
activerecord (4.2.4)
activesupport (4.2.4)
arel (6.0.3)
bigdecimal (1.2.6)
builder (3.2.2)
bundler (1.10.6)
erubis (2.7.0)
globalid (0.3.6)
i18n (0.7.0)
io-console (0.4.3)
json (1.8.1)
loofah (2.0.3)
mail (2.6.3)
mime-types (2.6.1)
mini_portile (0.6.2)
minitest (5.4.3)
nokogiri (1.6.6.2)
power_assert (0.2.2)
psych (2.0.8)
rack (1.6.4)
rack-test (0.6.3)
rails (4.2.4)
rails-deprecated_sanitizer (1.0.3)
rails-dom-testing (1.0.7)
rails-html-sanitizer (1.0.2)
railties (4.2.4)
rake (10.4.2)
rdoc (4.2.0)
rubygems-update (2.4.8)
sprockets (3.3.3)
sprockets-rails (2.3.2)
test-unit (3.0.8)
thor (0.19.1)
thread_safe (0.3.5)
tzinfo (1.2.2)

続いてCapistranoでのデプロイ設定していきます!!

PostgreSQLはじめのいっぽ

MySQLにばっか甘えてきてPostgreSQLの使い方がわからなかったので最初の流れとかメモっときます。

ここを参考にさせていただきました。

http://dev.classmethod.jp/cloud/aws/install-postgresql-on-aws-ec2/

PostgreSQLではユーザのことをロールと呼ぶっぽい。

初期化

PostgreSQLを使うには、まずdatabaseの初期化処理が必要です。以下を実行しておきます。

$ initdb

自動起動設定

PostgreSQLchkconfigで自動で起動する設定をしておく。

$ sudo /sbin/chkconfig --list|grep postgresql
$ sudo /sbin/chkconfig postgresql on
$ sudo /sbin/chkconfig --list|grep postgresql

ランレベルの2,3,4,5がonになったことが確認できればokです。

ユーザ設定

postgresユーザのパスワードをアップデートします。

$ sudo passwd postgres

これでログインできるようになります。

$ su - postgres
パスワード:
-bash-4.1$ exit

conf設定

設定ファイルをいじっていきます。

/var/lib/pgsql9/data/postgresql.confの、listen_addressesコメントアウトを外して以下のように変更します。

listen_addresses = '*'                  # what IP address(es) to listen on;

/var/lib/pgsql9/data/pg_hba.confを、以下のみが有効になるようにコメントアウト・編集します。

local   all     all         trust
host    all     all     0.0.0.0/0       md5

設定が大丈夫かどうか確認してみます。以下を叩いてどちらもOKが返って来れば大丈夫。

$ sudo /sbin/service postgresql stop
$ sudo /sbin/service postgresql start

ロール・DBの作成

postgresユーザ以外に実際にDBで作業するロールを追加します。

$ su - postgres
$ createuser -AdPE username

そしたらさきほど作成したロールがいじるDBを作成します。

$ createdb -E UTF8 -U username -W dbname

これで作成完了。postgresユーザからec2のユーザに戻ります。OS側でもさっきのDBのロールに紐づくユーザを設定しておきます。

$ sudo adduser username
$ sudo passwd username

接続確認

さっきのユーザにログインしてpsql -lを叩くと、作成したDBが確認できると思います。

$ su - root
$ psql -l

OSのユーザでシェルから直接$ psql -lとか叩けるのはOSのユーザとDBのロールが対応してるからなのか。

RailsアプリをNginx+UnicornなAWSにCapistranoでデプロイ

Special Thanks

追記@2016/04/29

最近は環境やconfファイルのsetupはitamaeでやるようになりました。めっちゃ楽ですitamae。。

goo.gl

totutotu.hatenablog.com

PostgreSQLの設定は、以下を参考にしていつも自分でやってます。

totutotu.hatenablog.com

手順

手順をまとめると、以下のようになります。

  1. 前準備
  2. nginxの設定
  3. 設定ファイルの用意
  4. 権限変更
  5. Capistrano設定
  6. Unicorn設定
  7. ssh設定
  8. デプロイ

myAppの部分は適宜読み替えてやってください。また、設定ファイルのうち編集する必要がある場所にTODOとコメントを入れてます。

ローカル

1の前準備はローカルで行ってください。

1. 前準備

公開鍵をサーバーに送信しておきます。

$ scp -i ~/.ssh/hogehoge.pem ~/.ssh/id_rsa.pub ec2-user@ec2_server:~

サーバー

ここからサーバー上での作業です。sshで接続しておいてください。

2. nginx

今回作成するアプリ用にnginxの設定ファイルを作成します。パスはetc/nginx/conf.d/myapp.confみたいな感じです。

デフォルトで作成されてるnginx.confconf.d以下の*.confを全て自動でincludeする設定になってます。

upstream unicorn_server {
  server unix:/tmp/unicorn.sock
  fail_timeout=0;
}
 
server {
  listen 80;
  client_max_body_size 4G;
  server_name example.com; # TODO
 
  keepalive_timeout 5;
 
  root /var/www/myApp/current/public; # TODO
  access_log /var/log/nginx/myApp_access.log; # TODO
  error_log /var/log/nginx/myApp_error.log; # TODO
 
  error_page 500 502 503 504 /500.html;
 
  try_files $uri/index.html $uri @unicorn;
 
  location @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://unicorn_server;
  }
 
  location ~ ^/assets/ {
    root /var/www/myApp/current/public; # TODO
  }
 
  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /var/www/myApp/current/public; # TODO
  }
}

3. 設定ファイルの用意

gitでignoreして管理していないsecrets.ymlとかdatabase.ymlとかのファイルがあればここで準備しておきます。

自分は/var/www/myApp/shared以下に.envとかdatabse.ymlを突っ込んでおいて、Capistranoのタスクでデプロイのフローでcurrentにcpしてくる設定にしています。Capistranoの設定のところでやります!

4. 権限変更

ec2-userの/var/wwwに対する権限を変更。書き込みできるように。

$ sudo chown -R ec2-user /var/www

ローカル

こっから再びローカルでの作業です。

5. Capistrano

Gemfileに以下のgemを加えます。

# Gemfile
group :production, :staging do
  gem 'unicorn'
end
 
group :development do
  gem 'capistrano'
  gem 'capistrano-rails'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano3-unicorn'
end

$ bundle installで反映しておく。

次に、Capistranoで必要なファイル群を生成します。Capistranoはそのためのinstallコマンドを用意してくれてますー。

▶ bundle exec cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified

Capfileを以下のように書きました。

# Load DSL and set up stages
require 'capistrano/setup'

# Include default deployment tasks
require 'capistrano/deploy'

# Include tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails
#   https://github.com/capistrano/passenger
#
# require 'capistrano/rvm'
require 'capistrano/rbenv'
set :rbenv_type, :user
set :rbenv_ruby, '2.2.1' # TODO: Change Ruby version
require 'capistrano/rails'
# require 'capistrano/chruby'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
# require 'capistrano/passenger'
require 'capistrano/bundler'
require 'capistrano3/unicorn'

# set :linked_files, %w{config/secrets.yml config/database.yml}

# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

config/deploy.rbは以下ように。

lock '3.4.0'

set :application, 'myapp' # TODO
set :repo_url, 'git@github.com:org/myapp.git' # TODO
set :deploy_to, '/var/www/myapp' # TODO
set :log_level, :debug

set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/assets}

# rbenv Ruby version
set :rbenv_ruby, '2.3.0' # TODO

# nokogiri はシステムライブラリを使うため bundle install にオプションを指定する
set :bundle_env_variables, { nokogiri_use_system_libraries: 1 }

namespace :deploy do
  desc 'restart application'
  task :restart do
    invoke 'unicorn:restart'
  end
end
after 'deploy:publishing', 'deploy:restart'

以下のようにCapistranoのタスクを作っておいて自動でshared以下の.envdatabase.ymlをcpしてくる的なことをするのも結構便利なのでオススメです。

# config/deploy.rb

# ...

namespace :deploy do
  desc "Copying database.yml"
  task :config_database do
    on roles(:all) do
      within release_path do
        db_config_file = "/var/www/myApp/shared/database.yml"
        execute :cp, "#{db_config_file} ./config/database.yml"
      end
    end
  end
  desc "Set Environment Values"
  task :set_env_values do
    on roles(:all) do
      within release_path do
        env_config = "/var/www/myApp/shared/.env"
        execute :cp, "#{env_config} ./.env"
      end
    end
  end
  desc "Restarting application"
  task :restart do
    invoke "unicorn:restart"
  end
end

before "deploy:updated", "deploy:config_database"
before "deploy:updated", "deploy:set_env_values"
after "deploy:publishing", "deploy:restart"

config/deploy/production.rbを編集。以下テンプレ。

# server-based syntax
# ======================
server 'xx.xx.xx.xx', user: 'ec2-user', roles: %w{web app db} # TODO

# role-based syntax
# ==================
role :app, %w{ec2-user@xx.xx.xx.xx} # TODO
role :web, %w{ec2-user@xx.xx.xx.xx} # TODO
role :db, %w{ec2-user@xx.xx.xx.xx} # TODO

# Configuration
# =============
set :stage, :production
set :unicorn_rack_env, "production"
set :branch, 'deployment/production' # TODO
set :rails_env, 'production'
set :migration_role, 'db'

# Custom SSH Options
# ==================
set :ssh_options, {
  keys: [File.expand_path('~/.ssh/sample.pem')], # TODO
  forward_agent: true,
  auth_methods: %w(publickey)
}

6. Unicorn設定

config/unicorn/production.rbを以下のようにします。

# production.rb
root = "/var/www/myApp/current" # TODO
working_directory root
pid "#{root}/tmp/pids/unicorn.pid"
stderr_path "#{root}/log/unicorn.log"
stdout_path "#{root}/log/unicorn.log"

listen "/tmp/unicorn.sock"
worker_processes 3
timeout 30

preload_app true

before_exec do |server|
  ENV["BUNDLE_GEMFILE"] = "#{root}/Gemfile"
end

before_fork do |server, worker|
  # the following is highly recomended for Rails + "preload_app true"
  # as there"s no need for the master process to hold a connection
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  # Before forking, kill the master process that belongs to the .oldbin PID.
  # This enables 0 downtime deploys.
  old_pid = "#{root}/tmp/pids/unicorn.pid.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      # someone else did our job for us
    end
  end
end

after_fork do |server, worker|
  # the following is *required* for Rails + "preload_app true",
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end

他にもstagingなどの環境ごとの設定ファイルを必要に応じてconfig/unicorn以下に作成してください。

7. ssh設定

ssh keyを生成してssh-agentに登録。

$ ssh-keygen -t rsa -C myapp-production
$ ssh-add ~/.ssh/myapp-production

ssh-agentとは、いろんなサーバーsshするときにパスフレーズを省略することができるOpenSSHの標準機能で、

ssh-agent が起動すると、 UNIX ドメインソケット(UNIX でプロセス間通信に使われる、ファイルシステムベースの通信経路)を作成し、その名前を環境変数 "SSH_AUTH_SOCK" に設定します。そして、 ssh コマンドなどが起動したときは、このソケット経由で通信を行い、秘密鍵が必要な認証の処理を ssh-agent に代行させます。シェルの環境変数は子プロセスからは変更できないため、代わりに新しいシェルを起動しているわけです。 http://webos-goodies.jp/archives/50672669.html

という仕組みになってるらしい。

GitHubにDeploy Keyを登録

GitHubで、先ほど生成した公開鍵をDeploy Keyとして登録します。

登録したら、初回だけsshでの接続確認が必要っぽいので通しておきます。

$ ssh -T git@github.com

既存のssh鍵の記憶が邪魔になるときは、以下で記憶を削除できます。

$ ssh-add -D

8. デプロイ

ということでデプロイ。

$ bundle exec cap production deploy

Unicornは以下のようにして起動できます。

$ bundle exec unicorn -D -c /var/www/myApp/current/config/unicorn/production.rb -E production

直面した問題

デプロイ作業中のエラーログです。上での設定ファイルのテンプレなどにはここでの修正も反映してまっす。

rbenvのパス問題

リモートで使うRubyのversionが指定できてなかった。capistrano/rbenvの設定方法を確認して指定する。

# config/deploy.rb
# rbenv Ruby version
set :rbenv_ruby, '2.2.2'

それでも見つからないと思ったら、どうやらrbenvのパスが違うみたい。 multistage 環境で capistrano-rbenv を使うときは rbenv_path の扱いに注意!とかも読んだのですが結局わからず。

パスがどうしても変わらないので...シンボリックリンクを貼るという荒技。完全によくない解決方法なのはわかってますが解決できませんでした...

$ ln -s /usr/local/rbenv/* ~/.rbenv

pg

bundle stdout: An error occurred while installing pg (0.18.2), and Bundler cannot continue

ひとまず$ gem isntall pg試してみる

'mkmf.rb can't find header files for ruby'

的なエラーが出てくる。ぐぐる

The first link you’ve posted is exactly your case: there is no ruby development environment installed. Development env is needed to compile ruby extensions, which are mostly written in C. http://stackoverflow.com/questions/20559255/error-while-installing-json-gem-mkmf-rb-cant-find-header-files-for-ruby

らしい。ということでRubyのdevelopment環境で走らせるためのライブラリをインストール。

$ sudo yum install ruby-devel

ちょっと進んだ、次のエラーは...

No pg_config... trying anyway. If building fails, please try again with...

pgのconfigファイルがないよと。

Install PostgreSQL on AWS EC2(Amazon Linux AMI 2013.03.1)を参考にPostgreSQLのインストール手順を見直してみる。

pgに関しては、後半になってこんなエラーも出た。

PG::ConnectionBad: could not connect to server: No such file or directory

Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

うん、PostgreSQLが走ってなかったみたいね。

PostgreSQLでは必ず最初に初期化処理することー。

$ sudo /sbin/service postgresql initdb

そして起動、停止、再起動は以下のようにすればok。

## 起動・停止・再起動
$ sudo /sbin/service postgresql start
Starting postgresql service:                               [  OK  ]
$ sudo /sbin/service postgresql stop
Stopping postgresql service:                               [  OK  ]
$ sudo /sbin/service postgresql restart
Stopping postgresql service:                               [  OK  ]
Starting postgresql service:                               [  OK  ]

ユーザー・DBの作成は以下のようにすればmigrationまでうまくいけました。

http://totutotu.hatenablog.com/entry/2015/08/30/PostgreSQL%E3%81%AF%E3%81%98%E3%82%81%E3%81%AE%E3%81%84%E3%81%A3%E3%81%BD

JSのRuntime

ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime.

指定してるブランチで反映するの忘れてた。Gemfileでtherubyracerを使うよう宣言しときます。

と思ったらまだエラー。nodejsをインストールしないといけなかった。

ところが普通にyumでインストールしようとするも見つからず。How to yum install Node.JS on Amazon Linuxを参考にこんな感じのコマンドでインストールします。

$ sudo yum install nodejs npm --enablerepo=epel

The option --enablerepo=epel causes yum to search for the packages in the EPEL repository.

ということでEPELのパッケージも検索してくれます。EPELは確かもっといろんなパッケージを置いてる場所だったよね。この文章が詳しくてよい。

EPEL (Extra Packages for Enterprise Linux) is open source and free community based repository project from Fedora team which provides 100% high quality add-on software packages for Linux distribution including RHEL (Red Hat Enterprise Linux), CentOS, and Scientific Linux. Epel project is not a part of RHEL/Cent OS but it is designed for major Linux distributions by providing lots of open source packages like networking, sys admin, programming, monitoring and so on. Most of the epel packages are maintained by Fedora repo.

Via http://www.tecmint.com/how-to-enable-epel-repository-for-rhel-centos-6-5/

Bundler

SSHKit::Runner::ExecuteError: Exception while executing as ec2-user@54.65.96.201: bundle...bundle stdout: bundler: command not found: unicorn Install missing gem executables with bundle install

Bundlerは入ってるっぽい。

$ bundle -v
Bundler version 1.10.6

サーバーに接続して$ bundle install|grep unicornとかやってもどうやらインストールでいてない。ちゃんとGemfileみてみたら、そうだ、こっちはGitHubからfetchしてるから内容はリモートのHEADになるんだった。

あまりの凡ミスに悲しくなるが、一応つまずく人もいるかな(未来の自分ではないことを願う...笑)と思い書き留めておく。

secret_key

app error: Missing secret_token and secret_key_base for 'production' environment, set these values in config/secrets.yml (RuntimeError)

デプロイ後反映されないので、Railsapp/unicorn.rbを確認すると、secret_tokentとsecret_key_baseがないよと。

そうだった。環境変数から読み込む設定にしてたんだった。設定する。 

以下に従って環境変数を定義すれば大丈夫になりました。

http://stackoverflow.com/questions/23180650/how-to-solve-error-missing-secret-key-base-for-production-environment-on-h

ttyが必要

以下で解決しました。

sudo: sorry, you must have a tty to run sudo - Shell Tips!

Capistranoでsudo実行時にttyエラー