はじめに
先日、Deployerでのデプロイ実行中にエラー「Permission denied (publickey).」が発生しましたが、無事に解決することができました。この記事では、この問題とその対処法を紹介します。
※対象となるデプロイ方法
Deployerがインストールされているサーバー上(弊社では踏み台サーバー)にて、デプロイ先のリモートサーバーに対してDeployerのデプロイコマンド(dep deploy)を実行するやり方。
バージョン情報
踏み台サーバー: OpenSSH_6.6.1、Deployer_6.4.6
リモートサーバー: OpenSSH_7.4
Laravelプロジェクト: PHP_7.3、Laravel_8.8
エラー内容
リモートサーバーへのデプロイの際に、以下のエラーが出ていました。
エラーの内容的には、デプロイ先のリモートサーバーへのSSH接続でパーミッションが拒否されているというような内容です。
In Client.php line 103:
[Deployer\Exception\RuntimeException (-1)]
The command "rm -f /var/www/html/.dep/deploy.lock" failed.
Exit Code: -1 (Unknown error)
Host Name: [弊社リモートサーバーのPrivate IP]
================
Warning: Permanently added '[弊社リモートサーバーのPrivate IP]' (ECDSA) to the list of known hosts.
Permission denied (publickey).
対処法
Deployerの設定ファイルであるdeploy.php
に記述されていた以下のコードを編集しました。
host($ip)
->user('appdeploy')
->port(22)
// ->identityFile('~/.ssh/id_rsa') →ココを削除
->stage('develop')
->set('deploy_path', $deploy_path)
->addSshOption('UserKnownHostsFile', '/dev/null')
->addSshOption('StrictHostKeyChecking', 'no');
上記のコードではデプロイ時に必要なSSH接続を設定していますが、結果的には->identityFile('~/.ssh/id_rsa')
というコードを削除することでエラーは解消されました。
おわりに: なぜエラーが起きたのか
sshコマンドは認証キーのパスを指定(-i
)しない場合は、自動的に利用可能な認証キーを検索して有効な認証キーを利用することでSSH接続を実行します。つまり、今回のエラーの原因は認証キーのパスを指定していたことによってうまくSSH接続ができていなかったことになります。
ただし、なぜ認証キーのパスを指定するとSSH接続ができなくなるのかは今のところ不明です。しかし、弊社ではAWS OpsWorksを利用しているので、その関係でOpenSSHのバージョンが変わったりなど、そのほか環境の変化により今回の問題が発生したのではないかと社内では結論づけています。
最後に
私たちの会社、ナイトレイでは一緒に自社開発のWebサービスを盛り上げてくれるエンジニアメンバーを募集しています!
基本的には直接ユーザーと接することのないポジションですが、セールス部門から
「顧客の声」を教えてもらったり、希望すればユーザーとのMTGに参加することも可能です。
モチベーションの高め方はあなた次第。
このような方は是非Wantedlyからお気軽にご連絡ください(もしくはこちらまで recruit@nightley.jp )
✔︎ 自社Webサービスの開発で事業の発展に携わってみたい
✔︎ 自分が開発したサービスで地域活性化に貢献したい
✔︎ 位置情報ビッグデータに興味があり、新しい活用方法を提案したい
✔︎ 地理や地図が好きで仕事中も眺めていたい
一つでも当てはまる方は是非こちらの記事をご覧ください
「受託開発一切なし!自社WEBサービスを社長やセールスチームと一緒に開発!」
▼ナイトレイとは?