こんにちは。よっしーです(^^)
今日は、terraformで作成したリソースにデプロイしたFlaskアプリへ接続する方法について解説しています。
背景
terraformで作成したリソースにデプロイしたFlaskアプリへ接続する方法について調査する機会がありましたので、その時の内容を備忘として記事に残しました。
使用するFlaskアプリは下記の記事を御覧ください。
外部から接続するには
GCPにデプロイしたFlaskアプリケーションに外部から接続するには、いくつかの手順が必要です。以下に主な手順を示します:
- ファイアウォールルールの設定:
- GCPコンソールで「VPCネットワーク」→「ファイアウォール」に移動します。
- 新しいルールを作成し、アプリケーションのポート(通常は8080や5000)を開放します。
- 静的IPアドレスの割り当て:
- 「VPCネットワーク」→「外部IPアドレス」で静的IPを予約します。
- この静的IPをインスタンスに割り当てます。
- Flaskアプリケーションの設定:
- アプリケーションが0.0.0.0にバインドするように設定します。
例:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
- インスタンスの起動スクリプト:
- インスタンスの起動時にFlaskアプリが自動的に開始するよう設定します。
- ドメイン名の設定(オプション):
- 静的IPアドレスにドメイン名を関連付けます。
- HTTPS化(推奨):
- セキュリティを高めるため、SSL証明書を取得してHTTPS接続を設定します。
これらの手順を完了すると、外部からhttp://<your-static-ip>:<port>
またはhttps://<your-domain>
でアプリケーションにアクセスできるようになります。
セキュリティの観点から、必要最小限のポートのみを開放し、適切な認証メカニズムを実装することをお勧めします。
本記事では、5000ポートを開放して、httpで接続できるところまでを確認します。
修正内容
main.tf に下記の修正を追加します。
% git diff .
diff --git a/35_learn-terraform-gcp/main.tf b/35_learn-terraform-gcp/main.tf
index c7f5b9b..8433309 100644
--- a/35_learn-terraform-gcp/main.tf
+++ b/35_learn-terraform-gcp/main.tf
@@ -19,6 +19,18 @@ resource "google_compute_firewall" "ssh" {
target_tags = ["ssh"]
}
+resource "google_compute_firewall" "flask" {
+ project = "terraform-20240707"
+ name = "flask-app-firewall"
+ network = google_compute_network.my.id
+
+ allow {
+ protocol = "tcp"
+ ports = ["5000"]
+ }
+ source_ranges = ["0.0.0.0/0"]
+}
+
resource "google_compute_subnetwork" "my" {
project = "terraform-20240707"
name = "my-custom-subnet"
@@ -53,3 +65,7 @@ resource "google_compute_instance" "my" {
}
}
+// A variable for extracting the external IP address of the VM
+output "Web-server-URL" {
+ value = join("", ["http://", google_compute_instance.my.network_interface.0.access_config.0.nat_ip, ":5000"])
+}
修正反映
下記のコマンドを実行します。
terraform apply
下記のように出力されていれば成功です。
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
Web-server-URL = "http://xxx.xxx.xxx.xxx:5000"
動作確認
ブラウザで「http://xxx.xxx.xxx.xxx:5000」にアクセスして、下記の画面のようになっていれば成功です。
解説
resource "google_compute_firewall" "flask"
このコードはTerraformを使用してGoogle Cloud Platform (GCP)上にファイアウォールルールを作成するものです。具体的に解説していきます:
resource "google_compute_firewall" "flask"
:
- これはGCPのファイアウォールリソースを定義しています。
- “flask”はこのリソースのTerraform内での識別子です。
project = "terraform-20240707"
:
- このファイアウォールルールを作成するGCPプロジェクトIDを指定しています。
name = "flask-app-firewall"
:
- GCP上でのファイアウォールルールの名前を設定しています。
network = google_compute_network.my.id
:
- このファイアウォールルールを適用するネットワークを指定しています。
google_compute_network.my.id
は、同じTerraform設定内で別に定義されているVPCネットワークのIDを参照しています。
allow { ... }
:
- 許可するトラフィックのルールを定義しています。
protocol = "tcp"
:
- TCPプロトコルのトラフィックを許可します。
ports = ["5000"]
:
- ポート5000へのトラフィックを許可します。これはFlaskアプリケーションのデフォルトポートです。
source_ranges = ["0.0.0.0/0"]
:
- すべてのIPアドレス(0.0.0.0/0)からのトラフィックを許可します。
- これは全インターネットからのアクセスを許可することを意味するため、プロダクション環境ではセキュリティリスクとなる可能性があります。
このコードは、指定されたGCPプロジェクト内の特定のネットワークに対して、ポート5000へのTCPトラフィックを全てのIPアドレスから許可するファイアウォールルールを作成します。これにより、Flaskアプリケーションへの外部アクセスが可能になります。
セキュリティ上の注意点として、source_ranges
を必要な範囲に制限することをお勧めします。
output “Web-server-URL”
このコードは、Terraformの出力(output)を定義しています。具体的には、作成されたVMインスタンスの外部IPアドレスを使って、WebサーバーのURLを生成しています。以下に詳細を解説します:
output "Web-server-URL"
:
- “Web-server-URL”という名前の出力を定義しています。
- この出力は、Terraformの実行後に表示されたり、他のTerraformモジュールで参照したりできます。
value = join("", [...])
:
join
関数を使用して、複数の文字列を結合しています。- 第一引数の
""
は、結合する際の区切り文字(この場合は何も使用しない)を指定しています。
["http://", ..., ":5000"]
:
- URLの各部分を配列として定義しています。
- “http://” はプロトコルを指定します。
- “:5000” はポート番号を指定します(Flaskアプリケーションのデフォルトポート)。
google_compute_instance.my.network_interface.0.access_config.0.nat_ip
:
- これは、作成されたVMインスタンスの外部IPアドレス(NAT IP)を参照しています。
google_compute_instance.my
は、同じTerraform設定内で定義されているVMインスタンスリソースを指しています。network_interface.0
は最初のネットワークインターフェースを指します。access_config.0.nat_ip
はそのインターフェースに割り当てられた外部IPアドレスを指します。
このコードの結果として、例えば以下のような出力が得られます:
Web-server-URL = http://35.200.100.100:5000
この出力を使用することで、デプロイ後すぐにWebサーバーのURLを知ることができ、アプリケーションにアクセスするのが容易になります。
ただし、セキュリティの観点から、本番環境ではHTTPSを使用し、適切なドメイン名を設定することをお勧めします。また、ポート番号をURLに含めない方が一般的です。
おわりに
今日は、 terraformで作成したリソースにデプロイしたFlaskアプリへ接続する方法について解説しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント