GCP Compute EngineでのVMインスタンス環境構築とSSH認証の備忘録

生成AIに聞いて勉強してます。
この記事は最後にAIにまとめさせて、Human in the loopで修正を加えているものです。VMへのログインコマンドとか忘れちゃうから残したい。

### はじめに

Google Cloud Platform (GCP) のCompute Engine上にアプリケーションをデプロイする際、VMインスタンスの環境構築とSSH認証のセットアップは最初の、そして最も重要なステップです。特に、SSH認証鍵の取り扱いにおいては、多くの初心者が躓きやすいポイントがいくつか存在します。

本記事は、筆者が実際にGCP Compute EngineにDiscord Botをデプロイする過程で直面したSSH認証の課題と、その解決策に焦点を当てた備忘録です。VMインスタンスの作成からSSH認証鍵の設定、そしてよくある「Permission denied (publickey)」エラーの対処法までを詳述します。

### 前提

* GCPアカウントが作成済みであること。
* Google Cloud SDKがローカルPCにインストールされていることが推奨されますが、必須ではありません。
* SSH鍵ペア（公開鍵と秘密鍵）の基本的な概念を理解していること。

### 1. GCP Compute Engine VMインスタンスの作成

[GCPの無料枠](https://cloud.google.com/free/docs/free-cloud-features#compute)を活用し、`e2-micro` マシンタイプでVMインスタンスを作成しました。

1.  **GCPコンソールにログイン**し、「Compute Engine」→「VMインスタンス」へ。
2.  「**インスタンスを作成**」をクリック。
3.  **インスタンスの詳細設定**:
    * **名前**: `sharedule-bot-instance` など、わかりやすい名前を付けます。
    * **リージョンとゾーン**: `us-west`。
    * **マシン構成**:
        * **マシンファミリー**: `E2`
        * **マシンタイプ**: `e2-micro` (無料枠対象)
    * **ブートディスク**:
        * **オペレーティング システム**: 今回はLinuxで`Ubuntu 22.04 LTS`にしました。
        * **サイズ**: 30GB（使えるもんは使っとけ精神）
    * **ファイアウォール**: 必要に応じて「HTTP トラフィックを許可する」「HTTPS トラフィックを許可する」にチェックを入れます。
    * **SSH認証鍵**: **ここが最も重要です。**
        * 「SSH認証鍵を表示して追加」をクリックします。
        * **ローカルPCで作成した公開SSH鍵**（例: `~/.ssh/google_cloud_key.pub` の中身）を貼り付けます。
            * **公開鍵の取得方法**: ローカルPCのターミナルで `cat ~/.ssh/google_cloud_key.pub` コマンドを実行し、表示される文字列全体をコピーします。（もし`google_cloud_key.pub`というファイル名でなければ、ご自身の公開鍵ファイル名に合わせてください。）
        * **ポイント**: ここで貼り付けた鍵のコメント部分（例: `user@hostname`）が、VMインスタンス上で自動生成されるユーザー名になります。後々の作業の混乱を避けるため、**このユーザー名を正確に控えておきましょう**（1敗）。このユーザー名が、VMにログインする際のユーザー名になります。
        * **注意**: もし既存のプロジェクト全体のSSH認証鍵をブロックしたい場合は、「プロジェクト全体の SSH 認証鍵をブロック」にチェックを入れます。その場合、ここに手動で追加した鍵のみが有効になります。
4.  「**作成**」ボタンをクリックします。VMの作成には数分かかります。

### 2. VMインスタンスへのSSH接続

作成したVMインスタンスにSSHで接続します。ローカルPCのターミナルから接続することで、後のファイル転送（`scp`）もスムーズに行えます。

1.  **VMインスタンスの外部IPアドレスを確認**:
    GCPコンソールのVMインスタンス一覧画面で、作成したVMの「外部IPアドレス」を控えます。

2.  **ローカルPCのターミナルからSSH接続**:
    * **重要**: ここで接続するユーザー名は、**VM作成時にSSH認証鍵に紐付けたユーザー名**を使用します。
    ```bash
    ssh -i ~/.ssh/google_cloud_key ユーザー名@YOUR_VM_EXTERNAL_IP
    ```
    * `~/.ssh/google_cloud_key`: あなたのローカルPCの**秘密鍵**のパスです。
    * `YOUR_VM_EXTERNAL_IP`: 先ほど確認したVMの外部IPアドレスです。
    * パスフレーズを求められた場合は、秘密鍵作成時に設定したパスフレーズを正確に入力します。

3.  **接続成功の確認**:
    プロンプトが `ユーザー名@sharedule-bot-instance:~$` のように変われば成功です。`whoami` コマンドでユーザー名が `ユーザー名` であることを確認しておきましょう。

### 3. SSH認証におけるトラブルシューティング集

SSH接続で最も多く直面するエラーが `Permission denied (publickey)` です。このエラーに遭遇した場合の主な原因と対処法をまとめました。

#### 3.1. 原因1: ローカルPCの秘密鍵パーミッションが不正

SSHクライアントは、秘密鍵のパーミッションが厳しく設定されていないと、セキュリティ上の理由でその鍵の使用を拒否します。
* **エラーメッセージ例**: 通常は何も出力されずに `Permission denied` となりますが、まれに `bad permissions` などのヒントが出ます。
* **確認方法（ローカルPCのターミナルで実行）**:
    ```bash
    ls -l ~/.ssh/google_cloud_key
    ```
    出力が `-rw-------` (600) となっていることを確認します。もし違う場合は、以下のコマンドで修正します。
* **対処法（ローカルPCのターミナルで実行）**:
    ```bash
    chmod 600 ~/.ssh/google_cloud_key
    ```

#### 3.2. 原因2: SSHエージェントが秘密鍵を管理していない

`ssh` や `scp` コマンドが秘密鍵を自動で見つけられない、またはパスフレーズを毎回入力したくない場合に、SSHエージェントが鍵を管理します。
* **エラーメッセージ例**: `Could not open a connection to your authentication agent.` や、パスフレーズを求められずに `Permission denied`。
* **確認方法（ローカルPCのターミナルで実行）**:
    ```bash
    ssh-add -l
    ```
    `The agent has no identities.` または `Could not open a connection...` と表示される場合、エージェントが起動していないか、鍵が追加されていません。
* **対処法（ローカルPCのターミナルで実行）**:
    **以下の2つのコマンドを必ずセットで、この順番で実行します。**
    ```bash
    eval "$(ssh-agent -s)" # SSHエージェントを起動
    ssh-add ~/.ssh/google_cloud_key # 秘密鍵をエージェントに追加
    ```
    * `ssh-add` 実行時にパスフレーズを求められた場合は、正確に入力します。
    * 成功すると `Identity added: ...` と表示されます。

#### 3.3. 原因3: VMインスタンスに登録されている公開鍵が正しくない

これが最も陥りやすい罠です。ローカルPCの秘密鍵に対応する公開鍵が、VMインスタンスの認証鍵リストに正確に登録されていない場合に発生します。
* **エラーメッセージ例**: `Permission denied (publickey).`
* **確認方法**:
    1.  **ローカルPCで公開鍵の内容を正確に再コピー**:
        ```bash
        cat ~/.ssh/google_cloud_key.pub
        ```
        表示された文字列全体をコピーします。
    2.  **GCPコンソールでVMインスタンスの設定画面を開く**:
        「Compute Engine」→「VMインスタンス」→該当VMをクリック→「編集」ボタン。
    3.  **「セキュリティ」セクションの「手動で生成した SSH 認証鍵の追加」を確認**:
        ここに登録されている公開鍵の文字列と、手順1でコピーした内容が**一文字一句正確に一致しているか**を慎重に確認します。もし異なれば、一度削除し、正確な内容を貼り付けて再登録します。
    4.  **「プロジェクト全体の SSH 認証鍵をブロック」設定の影響も確認**:
        もしこれがチェックされている場合、手動で追加した鍵以外は使えません。設定との整合性も確認しましょう。
* **対処法**: 公開鍵の正確な再登録が最も重要です。保存後、再度SSH接続を試みます。

### 4. まとめ

認証回りむずかしい