Google Compute EngineのインスタンスにSSH接続できなくなった時の対処方法

公開日:2022/09/11 更新日:2022/09/11
Google Compute EngineのインスタンスにSSH接続できなくなった時の対処方法のサムネイル
Photo by Caspar Camille Rubin on Unsplash

はじめに

Google Compute Engine(以降、GCE)のインスタンスにSSH接続できていたのにSSHの設定ミスや原因不明で急にSSH接続できなくなった時の対処方法をメモします。自分のPCからだけでなく、Google Cloud Platform(以降、GCP)上での管理画面からもSSHできない場合にも有効です。

症状と前提

以下が症状となります。

  • 元々自分のPCからSSH接続できていた
  • 接続するSSHのポート番号を変更するためにインスタンスのSSHの設定ファイル(/etc/ssh/sshd_config)を修正後、SSH接続できなくなった。GCPの管理画面からも同様。
  • GCP管理画面からシリアルコンソールを試すもログインユーザを作成していなかったのでログインできない

上記のような場合の対処方法になります。 以降の内容が有効なのは以下が条件になります。

  • SSH接続できなくなったインスタンスの起動はできること
  • インスタンスの停止、再起動ができること
  • GCPの管理画面でインスタンスの設定を修正できること

少し調べたところ、事前にシリアルコンソール用のユーザ作成をしていないとシリアルコンソールには接続できないという情報をいくつか確認しましたが、少なくともこの記事執筆時点では事前にユーザ作成していなくともシリアルコンソールでの接続は可能です。 よって、元々SSH接続だけしていたインスタンスで急にSSH接続できなくなってシリアルコンソールでの接続もしたことがない場合でも問題ありません。

なお、以降の内容は、SSH接続が成功しない場合(接続しようとしているポート番号が間違っている、公開鍵や認証鍵がおかしい、ファイアウォールの設定がおかしい)についての対処方法ではなく、あくまでも元々SSH接続できていたのに設定ミスや原因わからずにSSH接続できなくなった場合についての対処法になります。

対処方法の概要

対象方法としては、SSH接続の代わりにGCPの管理画面からシリアルコンソールでの接続をおこないます。繰り返しになりますが、事前にシリアルコンソール接続をしたことがなくても問題ありません。

GCEのインスタンスには「起動スクリプト」というインスタンス起動時に自動実行するスクリプトを指定することができ、この起動スクリプトを使うことでインスタンス起動時にシリアルコンソール用のログインユーザを作成することができます。

起動スクリプトを設定後、インスタンスを再起動すれば起動スクリプトが実行されてシリアルコンソール用のユーザを作成でき、シリアルコンソールにログインすることができます。 以降でこの手順をまとめます。

なお、この方法については公式ドキュメントにも記載されており、本記事の内容は以下の公式ドキュメントに従った作業を行います。

cloud.google.com

このページでは、インスタンスのシリアル コンソールへのインタラクティブ アクセスを有効にして、起動やネットワークの問題のデバッグ、不具合のあるインスタンスのトラブルシューティング、GRand Unified Bootloader(GRUB)の操作、その他のトラブルシューティングを実行する方法を説明します。

シリアルコンソールでの接続を有効にする

まずはじめに、GCPプロジェクトでシリアルコンソールでの接続を有効にしておく必要があります。何もしていなければデフォルトでは無効になっています。
まず、「VMインスタンス」にあるシリアルコンソールでのアクセスを有効にしたいインスタンス名をクリックします。 click-your-instance.png

続いて「編集」をクリックします。以下のように「シリアルポートへの接続が無効になっています」と表示されていると思います。もしここが「シリアルポートへの接続が有効になっています」、もしくは「プロジェクト全体のメタデータで、シリアルポートへの接続が有効になっています」と表示されている場合はすでに有効になっているので次節からの作業のみ必要になります。 enable-serial-console-access-for-instance.png

以下のように「シリアルポートへの接続を有効にする」にチェックを入れて、ページ下部にある「保存」をクリックすれば完了です。 check-enable-serial-port-access-mod.png

プロジェクト全体で有効にしたい場合

特定のインスタンスだけでなく、プロジェクトに属する全てのインスタンスでシリアルコンソールを有効にしたい場合は、メタデータを設定します。 GCEのメタデータで「編集」をクリックします。もしくは「メタデータを追加」ボタンのクリックでもOKです。 add-metadata-click.png

以下のページが開くので、キーにserial-port-enable、その対応する値にTRUEを入力して「保存」をクリックします。

set-metadata.png

以下のように「メタデータの保存が正常終了しました」と表示されて一覧にも追加されます。 success-to-add-metadata.png

以上でプロジェクトに属する全てのインスタンスでシリアルコンソールへの接続が有効になります。

起動スクリプトでローカルユーザを設定する

前節の手順と同様に、目的のインスタンス名をクリックして、「編集」をクリックします。 以下のようにインスタンスの編集ページ内に「メタデータ」という項目があり、そこに「自動化」というフィールドがあります。 add-metadata.png

ここに以下のシェルスクリプトを貼り付けます。以下のmyuseryourpasswordはそれぞれシリアルコンソールのログイン用のユーザ名とパスワードになります。各自が使用したい値に置き換えてください。 以下にはユーザ名myuserが3か所、パスワードyourpasswordが1か所あるので間違えずに置き換えてください。

#!/bin/bash
adduser myuser
echo myuser:yourpassword | chpasswd
usermod -aG google-sudoers myuser

実際には以下のような形になります。貼り付けたらページ下部にある「保存」をクリックします。 set-startup-script.png

以下のようにインスタンスのページに遷移するので、「リセット」をクリックしてインスタンスを再起動します。「リセット」ではインスタンス内のHDDのデータが削除されたり、IPアドレスが解放されたりすることはありません。メモリ内のデータを削除するだけになります。詳細は公式ドキュメントのVM をリセットするに記載があります。 reset-vm.png

以下のように確認されるので、「リセット」をクリックします。 confirm-reset.png

リセット後、再度インスタンスのページにアクセスし、「シリアルコンソールに接続」をクリックします。 access-serial-console.png

すると以下のようにブラウザの別ウィンドウが開いて以下のように表示されます。 なお、シリアルコンソール上にはインスタンスのログが表示されてしまうので不要な点は以下ではモザイク加工していますが、インスタンス名 login:と表示されている点が目的の表示です。ここで先ほど起動スクリプト内で指定したユーザ名(ここではmuyser)を入力してEnterを押下し、さらに指定したパスワードを入力すればログインできます。 login-mod.png

後はいつも通り作業できるので、SSH接続についてのログを確認するかなどして復旧できると思います。

まとめ

Google Compute Engineのインスタンスで急にSSH接続ができなくなると焦りますが、シリアルコンソール接続が用意されているのでこれと起動スクリプトを活用することで復旧できる場合もあると思います。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。