【GCP】GCEで外部IPアドレスが割り振られてるVMインスタンスにSSH接続できない


GCEで外部IPアドレスが割り振られてるVMインスタンスにSSH接続できない場合の対応方法の1つを紹介します。

状況

  • 自分で作成したVPCネットワーク内にVMインスタンスを作成
  • 作成したVMインスタンスには外部IPアドレスが割り振られている
  • 下のコマンドを実行したがエラーになる
$ gcloud beta compute ssh --zone "ゾーン名" "VMインスタンス名" --project "GCPプロジェクト名"

# エラー内容
ssh: connect to host 34.84.16.138 port 22: Operation timed out
ERROR: (gcloud.beta.compute.ssh) [/usr/bin/ssh] exited with return code [255].

今回の場合の解決方法

  • 接続元IPアドレスからtcpプロトコルの22番ポートのアクセスを許可するFirewallルールを作成するだけでOK
  • VMインスタンスにtagを設定してる場合は、Firewallルールでtagを指定してもOK

公式ドキュメント

解説

GCPのVPCネットワークの特徴

AWSは外部からアクセスできるインスタンスを用意するためには、VPC、subnet、IGW、ルーティング、セキュリティーグループを用意する必要があります。

GCPの場合はVPCネットワークを作成するだけで、サブネット、インターネットゲートウェイ、ルーティング、Firewallなど、様々なものを自動で作成してくれます。
なので、GCPでは基本的に、VPCネットワークを作成し、その中に外部IPアドレスを持つVMインスタンスを起動するだけで外部のネットワークと接続できる状態になります。

暗黙のFirewallルール

GCPの全てのVPCネットワークには2つの暗黙のFirewallルールがあります。

  • ほとんどの下りトラフィックを許可
  • すべての上りトラフィックを拒否

(詳細 -> https://cloud.google.com/vpc/docs/vpc?hl=ja#affiliated_resources
VPCネットワークを作成すると絶対に存在するFirewallルールになります。
この暗黙のルールはコンソールに表示されません。なので、編集することもできません。

上にあるように暗黙のFirewallルールにより、VMインスタンスへの上りのトラフィックは拒否されてしまいます。
なので、新たにFirewallルールを設定して、VMインスタンスへSSH接続できるようにします。

Firewallルールを作成する

接続元IPアドレスからtcpプロトコルの22番ポートのアクセスを許可するFirewallルールを作成します。
VMインスタンスにtagをつけてる場合は、tagを設定してあげたほうがいいと思います。

作成したFirewallルールは以下のような感じになります。

おわり

GCPはいろいろなものを勝手にやってくれるので楽チンな面もありますが、勝手に色々やられてるので煩わしい面もありますね😅