AWS(EC2)へ自動デプロイ時に、Pumaを再起動しよう!

STEP18:AWS(EC2)へ自動デプロイ時に、Pumaを再起動しよう!#AWS

Pocket
LINEで送る

今回は、Amazon Linux(AWS)のEC2へ、Capistrano3で、自動デプロイ実行後に、Pumaを再起動するタスクを追加したいと思います。

ではでは、早速、「Rails4+Capistrano3+pumaで、自動デプロイをしよう!」で設定した、config/deploy.rbに、Pumaを再起動するタスクを追加していきます。

 

1.config/deploy.rbに、タスクを追加

config/deploy.rbに下記のように、タスクを追加します。

# config valid only for current version of Capistrano
lock '3.4.0'

set :application, ‘アプリケーション名'
set :repo_url, ‘GitHubのリポジトリURL'
set :deploy_to, “デプロイ先のパス"

set :rbenv_custom_path, '/opt/rbenv'
set :rbenv_ruby, '2.2.3'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
set :rbenv_map_bins, %w{rake gem bundle ruby}

set :file_permissions_paths, [ 'tmp' ]
set :file_permissions_groups, [ 'www' ]
set :file_permissions_chmod_mode, '0770'

after 'deploy:publishing', 'deploy:restart'
after 'deploy:finishing', 'deploy:cleanup'

namespace :deploy do
  after :restart, :clear_cache do
    on roles(:app), in: :groups, limit: 3, wait: 10 do
      invoke 'server:restart_puma'
    end
  end
end

2.タスクのスクリプトを作成

今回は、lib/capistrano/tasks/restart-puma-pgnyumon.rakeとして、新規作成を行いました。
スクリプトの内容は、こんな感じ。

namespace :server do
  desc "Restart puma"
  task :restart_puma do
    on roles(:all) do
      execute "sudo /sbin/service puma-pgnyumon restart"
    end
  end
end

3.Capistranoで自動デプロイを実行

では、下準備は整ったと思われるので、Capistranoからデプロイを実行してみます!

$ bundle exec cap production deploy
INFO [657520c7] Running /usr/bin/env mkdir -p /tmp/pgnyumon/ as deploy@pgnyumon.com
DEBUG [657520c7] Command: /usr/bin/env mkdir -p /tmp/pgnyumon/
・・・途中省略
INFO [77235a4b] Running /usr/bin/env sudo /sbin/service puma-pgnyumon restart as deploy@pgnyumon.com
DEBUG [77235a4b] Command: sudo /sbin/service puma-pgnyumon restart
DEBUG [77235a4b]    sudo
DEBUG [77235a4b]    : 
DEBUG [77235a4b]    sudo を実行するには tty がなければいけません。すみません
DEBUG [77235a4b]    
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as deploy@pgnyumon.com: Exception while executing as deploy@pgnyumon.com: sudo /sbin/service puma-pgnyumon restart exit status: 1
sudo /sbin/service puma-pgnyumon restart stdout: Nothing written
sudo /sbin/service puma-pgnyumon restart stderr: sudo: sudo を実行するには tty がなければいけません。すみません

SSHKit::Runner::ExecuteError: Exception while executing as deploy@pgnyumon.com: sudo /sbin/service puma-pgnyumon restart exit status: 1
sudo /sbin/service puma-pgnyumon restart stdout: Nothing written
sudo /sbin/service puma-pgnyumon restart stderr: sudo: sudo を実行するには tty がなければいけません。すみません

SSHKit::Command::Failed: sudo /sbin/service puma-pgnyumon restart exit status: 1
sudo /sbin/service puma-pgnyumon restart stdout: Nothing written
sudo /sbin/service puma-pgnyumon restart stderr: sudo: sudo を実行するには tty がなければいけません。すみません
/Users/kana/ticklecode/pgnyumon/lib/capistrano/tasks/restart-puma-pgnyumon.rake:5:in `block (3 levels) in <top (required)>'
Tasks: TOP => deploy:clear_cache
(See full trace by running task with --trace)
The deploy has failed with an error: Exception while executing as deploy@pgnyumon.com: Exception while executing as deploy@pgnyumon.com: sudo /sbin/service puma-pgnyumon restart exit status: 1
sudo /sbin/service puma-pgnyumon restart stdout: Nothing written
sudo /sbin/service puma-pgnyumon restart stderr: sudo: sudo を実行するには tty がなければいけません。すみません

すごく、あやまられました(^^A;
sudoを実行するには、ttyが必要みたいです。

Capistrano3の場合は、config/deploy.rbに下記を追記すればOKでした。

set :pty, true

ちなみに、Capistrano2の記述方法は、こちらだそうです。

default_run_options[:pty] = true 

さらに、ちなみにエラーメッセージでググると、下記のように、visudoコマンドを利用してコメントアウトする方法もヒットするのですが、「set :pty, true」を追記する方が、セキュリティ的にも良さそうです。

Defaults    requiter
 ↓
#Defaults    requiter

そして、満を持して、再度、Capistranoから自動デプロイを試みますが、

[0cb8d7d6]  [sudo] password for deploy: 

この状態のまま、実行が止まってしまいました。。。う〜ん、これだけでいけるように思うのですが、しかたないです。

なので、visudoコマンドを実行して、sudo権限の設定を変更します。

sudo visudo

Capistranoからは、deployアカウントで接続して実行しているので、serviceのリスタートコマンドを、パスワードなしで実行できるように、下記のように追記してみました。

deploy  ALL=(ALL)       ALL, NOPASSWD:/sbin/service puma-pgnyumon restart

再度、capコマンドを実行して、自動デプロイにトライしてみます。

$ bundle exec cap production deploy
INFO [6820686e] Running /usr/bin/env mkdir -p /tmp/pgnyumon/ as deploy@pgnyumon.com
DEBUG [6820686e] Command: /usr/bin/env mkdir -p /tmp/pgnyumon/
・・・途中省略
INFO [eb477ff7] Running /usr/bin/env sudo /sbin/service puma-pgnyumon restart as deploy@pgnyumon.com
DEBUG [eb477ff7] Command: sudo /sbin/service puma-pgnyumon restart
DEBUG [eb477ff7]    Hot-restarting puma...
DEBUG [eb477ff7]    Doublechecking the process restart...
DEBUG [eb477ff7]    No puma process found
DEBUG [eb477ff7]    Puma restart failed :/
DEBUG [eb477ff7]    Trying cold reboot
DEBUG [eb477ff7]    Puma starting in single mode...
DEBUG [eb477ff7]    
DEBUG [eb477ff7]    * Version 2.14.0 (ruby 2.2.3-p173), codename: Fuchsia Friday
DEBUG [eb477ff7]    
DEBUG [eb477ff7]    * Min threads: 0, max threads: 16
DEBUG [eb477ff7]    
DEBUG [eb477ff7]    * Environment: production
DEBUG [eb477ff7]    
DEBUG [eb477ff7]    * Daemonizing...
DEBUG [eb477ff7]    
DEBUG [eb477ff7]    [  OK  ]

Pumaの再起動ができました!!
ちょっと、もやっと残る感じもありますが、、、ひとまず、良しとしたいと思います。

今回は、ここまで!!

 

前回の記事は、「Railsアプリケーションのトップ画面を作成しよう!」

AWSおすすめ書籍

AWSの勉強で参考になった書籍です!

AWSで質問したいことがある!

Teratail(テラテイル)

WEBエンジニア専用のQ&Aサイトです。AWSに関しての質問や回答も活発に行われています。ぜひ、会員登録をして利用してみると良いと思います(^o^)

エンジニアのためのQ&Aサイト【teratail】

Pocket
LINEで送る