AWS設定やった手順まとめ
参考サイト
0から始めるAWS入門:概要
http://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde
ここの連続の記事を参考にさせていただきながら設定していきます。
さいしょに
最初に以下のことを行っておく。
- アカウントを登録
- リージョンをTokyoに変更
概要
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 VPC
でVPCを作成する。設定はこんな感じで。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(地理的にサーバーを離しておくことで緊急時に備えている)を設定する
この要領でもうひとつ別のAvailable ZoneのSubnetを作成しておく。
CIDRを10.0.1.0/24とかにする。
Internet Gatewayの追加
Create Internet GatewayでGatewayを作成して、それを選択したまま上のボタンのAttach to VPCでVPCと紐づける。
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 LinuxはRed 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が返ってくるはず。
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なんだね。
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
手順
目次
EC2のインスタンスはすでに作成して設定済みという前提です。
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
自動起動設定
PostgreSQLをchkconfigで自動で起動する設定をしておく。
$ 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。。
PostgreSQLの設定は、以下を参考にしていつも自分でやってます。
手順
手順をまとめると、以下のようになります。
- 前準備
- nginxの設定
- 設定ファイルの用意
- 権限変更
- Capistrano設定
- Unicorn設定
- ssh設定
- デプロイ
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.conf
でconf.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
以下の.env
やdatabase.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-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までうまくいけました。
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
andsecret_key_base
for 'production' environment, set these values in config/secrets.yml (RuntimeError)
デプロイ後反映されないので、Railsのapp/unicorn.rb
を確認すると、secret_tokentとsecret_key_baseがないよと。
そうだった。環境変数から読み込む設定にしてたんだった。設定する。
以下に従って環境変数を定義すれば大丈夫になりました。
ttyが必要
以下で解決しました。