GCP入門:terraformで作成したリソースにSSH接続する

スポンサーリンク
GCP入門:terraformで作成したリソースにSSH接続する ノウハウ
GCP入門:terraformで作成したリソースにSSH接続する
この記事は約7分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、terraformで作成したリソースにSSH接続する方法について解説しています。

スポンサーリンク

背景

terraformで作成したリソースにSSH接続する方法について調査する機会がありましたので、その時の内容を備忘として記事に残しました。

terraformで作成したリソースにSSH接続する方法

Terraformで作成したGCP (Google Cloud Platform) のCompute Engineインスタンスにssh接続する方法をいくつか紹介します。

  1. gcloud コマンドを使用する方法: これが最も簡単で推奨される方法です。
   gcloud compute ssh flask-vm --zone=us-west1-a --project=terraform-20240707

このコマンドは自動的に適切な認証を処理し、SSHキーの生成やインスタンスへの追加も行います。

  1. 標準のsshコマンドを使用する方法: まず、SSHキーペアを生成し、GCPプロジェクトのメタデータに公開鍵を追加する必要があります。 a. SSHキーの生成: ssh-keygen -t rsa -f ~/.ssh/gcp_key -C [YOUR_USERNAME] b. GCPプロジェクトのメタデータに公開鍵を追加:
    GCPコンソールから、またはgcloudコマンドで行います。 c. インスタンスのIPアドレスを確認: gcloud compute instances describe flask-vm --zone=us-west1-a --format='get(networkInterfaces[0].accessConfigs[0].natIP)' d. ssh接続: ssh -i ~/.ssh/gcp_key [YOUR_USERNAME]@[INSTANCE_IP]

その後、terraform output instance_ipコマンドでIPアドレスを取得し、sshコマンドで接続できます。

注意点:

  • ファイアウォールルールが適切に設定されていることを確認してください。SSHトラフィック(通常ポート22)を許可する必要があります。
  • セキュリティのため、特定のIPアドレスからのみSSHアクセスを許可することをお勧めします。
  • プロダクション環境では、踏み台サーバーやVPNの使用を検討してください。

これらの方法のいずれかを使用して、Terraformで作成したインスタンスにSSH接続できます。

22ポートを許可する

前回作成したmain.tfにsshを許可する設定をいれます。

修正内容は下記になります。

% git diff .
diff --git a/35_learn-terraform-gcp/main.tf b/35_learn-terraform-gcp/main.tf
index 8564b93..c7f5b9b 100644
--- a/35_learn-terraform-gcp/main.tf
+++ b/35_learn-terraform-gcp/main.tf
@@ -5,6 +5,20 @@ resource "google_compute_network" "my" {
   mtu                     = 1460
 }
 
+resource "google_compute_firewall" "ssh" {
+  project = "terraform-20240707"
+  name    = "allow-ssh"
+  allow {
+    ports    = ["22"]
+    protocol = "tcp"
+  }
+  direction     = "INGRESS"
+  network       = google_compute_network.my.id
+  priority      = 1000
+  source_ranges = ["0.0.0.0/0"]
+  target_tags   = ["ssh"]
+}
+
 resource "google_compute_subnetwork" "my" {
   project       = "terraform-20240707"
   name          = "my-custom-subnet"

修正の反映

下記のコマンドを実行します。

# GCPリソースの作成
terraform apply

動作確認

下記のコマンドを実行して、ssh接続できることを確認します。

gcloud compute ssh flask-vm --zone=us-west1-a --project=terraform-20240707

下記のような結果になれば成功です。

% gcloud compute ssh flask-vm --zone=us-west1-a --project=terraform-20240707
(略)
xxxx@flask-vm:~$ 

解説

このTerraformコードはGoogle Cloud Platform (GCP)上でファイアウォールルールを作成します。具体的には、SSH接続を許可するためのルールを設定しています。以下に各部分の詳細な解説を行います:

  1. リソースタイプ:
    google_compute_firewall – GCPのファイアウォールルールを定義します。
  2. リソース名:
    “ssh” – このリソースをTerraform内で参照するための名前です。
  3. プロジェクト:
    project = “terraform-20240707” – このファイアウォールルールが適用されるGCPプロジェクトを指定します。
  4. ファイアウォールルール名:
    name = “allow-ssh” – GCP上で表示されるファイアウォールルールの名前です。
  5. 許可設定:
   allow {
     ports    = ["22"]
     protocol = "tcp"
   }
  • ポート22(標準のSSHポート)へのTCPトラフィックを許可します。
  1. 方向:
    direction = “INGRESS” – 入力トラフィック(外部から内部へ)に対するルールであることを指定します。
  2. ネットワーク:
    network = google_compute_network.my.id – このルールが適用されるネットワークを指定します。ここでは前述のコードで作成したカスタムネットワークを参照しています。
  3. 優先度:
    priority = 1000 – ファイアウォールルールの優先順位を設定します(0-65535の範囲、数字が小さいほど優先度が高い)。
  4. ソース範囲:
    source_ranges = [“0.0.0.0/0”] – すべてのIPアドレス(インターネット全体)からのアクセスを許可します。セキュリティ上、本番環境では特定のIPアドレス範囲に制限することを推奨します。
  5. ターゲットタグ:
    target_tags = [“ssh”] – このルールが適用されるインスタンスを指定するためのタグです。前述のCompute Engineインスタンス作成コードでこのタグが使用されています。

このファイアウォールルールにより、タグ “ssh” が付けられたインスタンスに対して、インターネット上のどの場所からでもSSH接続(ポート22経由)が可能になります。

セキュリティ上の注意点:

  • source_ranges を “0.0.0.0/0” に設定することは、開発環境では便利ですが、本番環境ではセキュリティリスクとなる可能性があります。実際の運用では、信頼できる特定のIPアドレス範囲に制限することを強く推奨します。
  • 可能であれば、VPNや踏み台サーバーを使用してSSHアクセスを制御することも検討してください。

本記事のソース

この記事のソースは下記のリポジトリに保存しています。

おわりに

今日は、 terraformで作成したリソースにSSH接続する方法について解説しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました