こんにちは。よっしーです(^^)
今日は、terraformで作成したリソースにSSH接続する方法について解説しています。
背景
terraformで作成したリソースにSSH接続する方法について調査する機会がありましたので、その時の内容を備忘として記事に残しました。
terraformで作成したリソースにSSH接続する方法
Terraformで作成したGCP (Google Cloud Platform) のCompute Engineインスタンスにssh接続する方法をいくつか紹介します。
- gcloud コマンドを使用する方法: これが最も簡単で推奨される方法です。
gcloud compute ssh flask-vm --zone=us-west1-a --project=terraform-20240707
このコマンドは自動的に適切な認証を処理し、SSHキーの生成やインスタンスへの追加も行います。
- 標準の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接続を許可するためのルールを設定しています。以下に各部分の詳細な解説を行います:
- リソースタイプ:
google_compute_firewall
– GCPのファイアウォールルールを定義します。 - リソース名:
“ssh” – このリソースをTerraform内で参照するための名前です。 - プロジェクト:
project = “terraform-20240707” – このファイアウォールルールが適用されるGCPプロジェクトを指定します。 - ファイアウォールルール名:
name = “allow-ssh” – GCP上で表示されるファイアウォールルールの名前です。 - 許可設定:
allow {
ports = ["22"]
protocol = "tcp"
}
- ポート22(標準のSSHポート)へのTCPトラフィックを許可します。
- 方向:
direction = “INGRESS” – 入力トラフィック(外部から内部へ)に対するルールであることを指定します。 - ネットワーク:
network = google_compute_network.my.id – このルールが適用されるネットワークを指定します。ここでは前述のコードで作成したカスタムネットワークを参照しています。 - 優先度:
priority = 1000 – ファイアウォールルールの優先順位を設定します(0-65535の範囲、数字が小さいほど優先度が高い)。 - ソース範囲:
source_ranges = [“0.0.0.0/0”] – すべてのIPアドレス(インターネット全体)からのアクセスを許可します。セキュリティ上、本番環境では特定のIPアドレス範囲に制限することを推奨します。 - ターゲットタグ:
target_tags = [“ssh”] – このルールが適用されるインスタンスを指定するためのタグです。前述のCompute Engineインスタンス作成コードでこのタグが使用されています。
このファイアウォールルールにより、タグ “ssh” が付けられたインスタンスに対して、インターネット上のどの場所からでもSSH接続(ポート22経由)が可能になります。
セキュリティ上の注意点:
- source_ranges を “0.0.0.0/0” に設定することは、開発環境では便利ですが、本番環境ではセキュリティリスクとなる可能性があります。実際の運用では、信頼できる特定のIPアドレス範囲に制限することを強く推奨します。
- 可能であれば、VPNや踏み台サーバーを使用してSSHアクセスを制御することも検討してください。
本記事のソース
この記事のソースは下記のリポジトリに保存しています。
おわりに
今日は、 terraformで作成したリソースにSSH接続する方法について解説しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント