Google Compute EngineのインスタンスにSSH接続できなくなった時の対処方法
はじめに
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のインスタンスには「起動スクリプト」というインスタンス起動時に自動実行するスクリプトを指定することができ、この起動スクリプトを使うことでインスタンス起動時にシリアルコンソール用のログインユーザを作成することができます。
起動スクリプトを設定後、インスタンスを再起動すれば起動スクリプトが実行されてシリアルコンソール用のユーザを作成でき、シリアルコンソールにログインすることができます。 以降でこの手順をまとめます。
なお、この方法については公式ドキュメントにも記載されており、本記事の内容は以下の公式ドキュメントに従った作業を行います。
このページでは、インスタンスのシリアル コンソールへのインタラクティブ アクセスを有効にして、起動やネットワークの問題のデバッグ、不具合のあるインスタンスのトラブルシューティング、GRand Unified Bootloader(GRUB)の操作、その他のトラブルシューティングを実行する方法を説明します。
シリアルコンソールでの接続を有効にする
まずはじめに、GCPプロジェクトでシリアルコンソールでの接続を有効にしておく必要があります。何もしていなければデフォルトでは無効になっています。
まず、「VMインスタンス」にあるシリアルコンソールでのアクセスを有効にしたいインスタンス名をクリックします。
続いて「編集」をクリックします。以下のように「シリアルポートへの接続が無効になっています」と表示されていると思います。もしここが「シリアルポートへの接続が有効になっています」、もしくは「プロジェクト全体のメタデータで、シリアルポートへの接続が有効になっています」と表示されている場合はすでに有効になっているので次節からの作業のみ必要になります。
以下のように「シリアルポートへの接続を有効にする」にチェックを入れて、ページ下部にある「保存」をクリックすれば完了です。
プロジェクト全体で有効にしたい場合
特定のインスタンスだけでなく、プロジェクトに属する全てのインスタンスでシリアルコンソールを有効にしたい場合は、メタデータを設定します。
GCEのメタデータで「編集」をクリックします。もしくは「メタデータを追加」ボタンのクリックでもOKです。
以下のページが開くので、キーにserial-port-enable
、その対応する値にTRUE
を入力して「保存」をクリックします。
以下のように「メタデータの保存が正常終了しました」と表示されて一覧にも追加されます。
以上でプロジェクトに属する全てのインスタンスでシリアルコンソールへの接続が有効になります。
起動スクリプトでローカルユーザを設定する
前節の手順と同様に、目的のインスタンス名をクリックして、「編集」をクリックします。
以下のようにインスタンスの編集ページ内に「メタデータ」という項目があり、そこに「自動化」というフィールドがあります。
ここに以下のシェルスクリプトを貼り付けます。以下のmyuser
、yourpassword
はそれぞれシリアルコンソールのログイン用のユーザ名とパスワードになります。各自が使用したい値に置き換えてください。
以下にはユーザ名myuser
が3か所、パスワードyourpassword
が1か所あるので間違えずに置き換えてください。
#!/bin/bash
adduser myuser
echo myuser:yourpassword | chpasswd
usermod -aG google-sudoers myuser
実際には以下のような形になります。貼り付けたらページ下部にある「保存」をクリックします。
以下のようにインスタンスのページに遷移するので、「リセット」をクリックしてインスタンスを再起動します。「リセット」ではインスタンス内のHDDのデータが削除されたり、IPアドレスが解放されたりすることはありません。メモリ内のデータを削除するだけになります。詳細は公式ドキュメントのVM をリセットするに記載があります。
リセット後、再度インスタンスのページにアクセスし、「シリアルコンソールに接続」をクリックします。
すると以下のようにブラウザの別ウィンドウが開いて以下のように表示されます。
なお、シリアルコンソール上にはインスタンスのログが表示されてしまうので不要な点は以下ではモザイク加工していますが、インスタンス名 login:
と表示されている点が目的の表示です。ここで先ほど起動スクリプト内で指定したユーザ名(ここではmuyser
)を入力してEnterを押下し、さらに指定したパスワードを入力すればログインできます。
後はいつも通り作業できるので、SSH接続についてのログを確認するかなどして復旧できると思います。
まとめ
Google Compute Engineのインスタンスで急にSSH接続ができなくなると焦りますが、シリアルコンソール接続が用意されているのでこれと起動スクリプトを活用することで復旧できる場合もあると思います。
関連記事
- 公開日:2022/09/09 更新日:2022/09/09
Meilisearchを認証ユーザのみ使用できるようAPIキーを設定する
認証ユーザにのみMeilisearchの使用を許可して保護するためには、Meilisearchのマスターキーの設定とAPIキーの作成が必要になります。この手順をまとめます。
- 公開日:2022/09/09 更新日:2022/09/09
MeilisearchをGoogle Compute Engineにデプロイして独自ドメインを設定する
Firebaseで全文検索を実装するために調査していたところ、Meilisearchというオープンソースを見つけました。調べてみるとMeilisearchが良さそうだったため、Google Compute Engine上にデプロイし、独自ドメインを設定して動作確認してみました。その手順をメモします。
- 公開日:2022/09/08 更新日:2022/09/08
Google Compute EngineのインスタンスにSSH接続する
Google Compute Engineのインスタンスにssh接続するための手順をまとめます。
- 公開日:2018/02/10 更新日:2018/02/10
CentOSでrootのときだけ日本語が文字化けする時の原因と対処方法
さくらVPSでCentOSを使いはじめたところ、一般ユーザで使用している時はvimなどのエディタで編集していても日本語が問題なく表示されていましたが、root権限で同様に編集のためにファイルを開いたら日本語が文字化けしてしまいました。以降ではこの原因と対処方法についてメモします。