前提
・CircleCIでCIを構築済
・ローカルからCapistranoを使ってEC2に自動デプロイができている
参考にした記事
CircleCIとCapistranoを使った自動デプロイを構築するにあたって以下の記事を参考にさせていただきました。
筆者の場合は、上記で掲出した記事の内容以外でもSSH接続に関して複数のエラーに遭遇したため、それらのエラーと対処法をまとめていきます。
CircleCIからEC2へのSSH接続に失敗する①
EC2へのSSH接続の際に、まず下記のようなエラーが起きました。
Caused by:
Net::SSH::ConnectionTimeout: Net::SSH::ConnectionTimeout
Caused by:
Errno::ETIMEDOUT: Connection timed out - connect(2) for user [ユーザー名]@[ElasticIP]
EC2のセキュリティグループの設定でローカルIPを設定していたことが原因で、CircleCIからの接続を拒否されていました。
こちらの記事を参考に解決しました。
CircleCIからEC2へのSSH接続に失敗する②
①を実行した後、エラー内容が変わりました。
Caused by:
Net::SSH::AuthenticationFailed: Authentication failed for user [ユーザー名]@[ElasticIP]
CircleCIのAdditional SSH Keys
にもEC2に接続するための正しい秘密鍵を登録しているのに、認証エラーとされています。
ここでどハマりしましたが、1つずつ考えられる原因を潰していきました。
結論、CircleCIにSSH接続しデバックを行うのが近道でした。
CircleCIにSSH接続をしデバッグを行う
CircleCIの実行経過がわかるページの右上にあるRerun
のRerun job with SSH
をクリックし、実行を待つとWait for SSH sessions
に$ ssh -p [ポート番号] xxx.xxx.xxx.xxx
と表示されます。
ローカルから下記コマンドを入力するとCiecleCIにSSH接続できます。
ssh -p [ポート番号] xxx.xxx.xxx.xxx -i ~/.ssh/[GitHubに接続する際に使用する秘密鍵]
こちらの記事を参考にしました。
※CircleCIを無料プランで使用している場合、複数コンテナを同時にビルドすることはできないため、デバッグが終了したらRerun
のCancel Job
をクリックしてください。
CircleCIにSSH接続できたら、そこから下記コマンドを入力しEC2に接続できるか確認します。
ssh [ユーザー名]@[ElasticIP]
筆者はここでEC2への接続が成功したため、Additional SSH Keys(秘密鍵)
は正しく動作していることが分かりました。
そこで、Capistrano設定ファイルの秘密鍵の指定が間違っているのではないかと推測し、SSH接続しているコンテナ内の秘密鍵を確認したところ(cd ~/.ssh
→ls
)、id_rsa_[Fingerprintの:がない文字列]
が表示され、中身を確認したところCircleCIに登録したEC2へのSSH接続のための秘密鍵と一致しました。
筆者はCapistranoのset :ssh_options
のkeys
に[アプリ名]_rsa
を指定していたため、上記で確認したid_rsa_[Fingerprintの:がない文字列]
に設定し直すことで、無事CircleCIでCapistranoを使ってEC2にSSH接続することができました!!
まとめ
Capistranoの設定ファイルで指定したkeys
の秘密鍵ファイルが存在しない場合でも、ファイルが見つからないエラーではなく、認証エラーが出ることを学びました。
また、CircleCIに登録する秘密鍵の名前を[アプリ名]_rsa
にする方法も調べましたが、見つけることができませんでした。
ローカルとCircleCI上では秘密鍵のファイル名が違う状態になっていますが、keys
に環境変数を用いて秘密鍵を指定することで、ローカルからでもCircleCIからでもCapistranoによるEC2への接続を可能にしました。