Cloud SQL for PostgreSQLをTerraformでデプロイする
Cloud SQL for PostgreSQL
概要:
GCPが提供するフルマネージドのPostgreSQLサービスで、データベースのセットアップ、保守、管理を簡素化します
特徴:
- 高可用性: プライマリインスタンスとスタンバイインスタンスを使用した自動フェイルオーバー機能を提供します
- スケーラビリティ: 読み取り専用のレプリカを作成して、読み取り負荷を分散できます
- セキュリティ: データの暗号化、IAMとの統合、SSL/TLS接続などのセキュリティ機能を備えています
- バージョン対応: PostgreSQL 9.6から最新のバージョンまで対応しています
前提
- Terraformがインストールされている。
- GCPプロジェクトが作成されており、適切なAPIが有効化されている。
- サービスアカウントの認証情報が設定されている。
動作環境
terraform {
required_version = "1.9.8"
required_providers {
google = {
source = "hashicorp/google"
version = "6.11.0"
}
}
backend "gcs" {}
}
シンプルなTerraform テンプレート
👇ChatGPTで最小限のテンプレートを生成してもらい、ポイントになりそうな部分を深掘って見ていきたいと思います。
provider "google" {
project = "<YOUR_PROJECT_ID>" # あなたのGCPプロジェクトIDをここに入力
region = "us-central1" # インスタンスを作成するリージョン
}
resource "google_sql_database_instance" "postgres_instance" {
name = "my-postgres-instance" # Cloud SQLインスタンス名
database_version = "POSTGRES_14" # 使用するPostgreSQLのバージョン
region = "us-central1" # リージョン
settings {
tier = "db-f1-micro" # マシンタイプ(最小構成の無料枠を使用)
}
}
resource "google_sql_database" "default_db" {
name = "defaultdb" # データベース名
instance = google_sql_database_instance.postgres_instance.name
}
resource "google_sql_user" "default_user" {
name = "myuser" # ユーザー名
password = "mypassword" # パスワード
instance = google_sql_database_instance.postgres_instance.name
}
利用できるPostgreSQLのバージョン
今回は最終的に PostgreSQL 16
を使うように設定していきたいと思います。
まずは database_version
の部分を見ていきたいと思います。現時点で利用できるバージョンは👇になります。
※ 2024/12 時点
Terraformのドキュメントは以下になります。
また、POSTGRES_16
を指定するとデフォルトで Enterprise Plus エディション
になってしまうらしく、、
注: インスタンスのデータベース バージョンが PostgreSQL 16 以降の場合、デフォルトの Cloud SQL エディションは Enterprise Plus です。データベース バージョンが PostgreSQL 16 より前の場合、デフォルトのエディションは Enterprise です。
明示的に Enterprise エディション
を指定する必要があります。
settings {
tier = "${var.tier}"
edition = "ENTERPRISE"
...
}
各エディションの違いはこちらを参照👇
マシンタイプ
- 共有コアマシンタイプ
-
db-f1-micro
: 最小限のリソースを必要とする軽量なワークロード向け -
db-g1-small
:db-f1-micro
よりも高いリソースを提供し、軽度のワークロードに適している
-
- カスタムマシンタイプ
-
db-custom-<vCPU数>-<メモリ量(MB>
のフォーマットで指定 - 例
- 2 vCPU と 7.5 GB(7,680 MB)のメモリを持つインスタンスを作成する場合、
tier = "db-custom-2-7680"
と指定する
- 2 vCPU と 7.5 GB(7,680 MB)のメモリを持つインスタンスを作成する場合、
-
Terraformのドキュメントは以下になります。
Private IPの場合
次に、Private IP 内でCloudSQL for PostgreSQLを構築しSSL接続を想定している場合の設定を見ていきたいと思います。
settings {
tier = "${var.tier}"
edition = "ENTERPRISE"
...
ip_configuration {
private_network = "..."
allocated_ip_range = "..."
}
}
まずは使用する private_network
と allocated_ip_range
を設定します。
private_network
に関しては👇を
ま allocated_ip_range
に関しては👇を参照して下さい。
次に settings
> ip_configuration
> ssl_mode
を見ていきます。
ssl_mode
DB接続におけるSSL接続の強制方法を指定します。 サポートされる値は ALLOW_UNENCRYPTED_AND_ENCRYPTED, ENCRYPTED_ONLY, TRUSTED_CLIENT_CERTIFICATE_REQUIRED (SQL Server ではサポートされません) です。 詳細はAPIリファレンスドキュメントを参照
こちらはGCPコンソールの CloudSQL
> 対象のインスタンス
> 接続
> セキュリティ
> SSL モードの管理
に該当します。
例)
settings {
tier = "${var.tier}"
edition = "ENTERPRISE"
...
ip_configuration {
ssl_mode = "TRUSTED_CLIENT_CERTIFICATE_REQUIRED"
}
}
環境構築後の踏み台サーバーからのアクセス
最後にPrivate IPで構築したCloud SQL for PostgreSQLに踏み台サーバーからアクセスする場合どうするかを見てみたいと思います。今回はCloud SQL Auth Proxy を使用して接続する方法で進めてきます。
Cloud SQL Auth Proxy について
Cloud SQL Auth Proxyは、Google CloudのCloud SQLインスタンスに対するセキュアで簡単な接続を実現するツールです。IAM認証を活用し、パスワードやIP制限なしで安全に接続できます。また、接続設定やSSL証明書の管理が不要で、ローカル開発環境からも同様の接続が可能です。プロキシは、Google Cloud APIを介してアプリケーションとCloud SQL間の通信を管理し、複雑さを軽減します。インストール後、簡単なコマンドでプロキシを起動し、ローカルホスト経由でアプリケーションを接続可能にします。
- 踏み台サーバーへのインストール
$ curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.13.0/cloud-sql-proxy.linux.amd64
$ chmod +x cloud-sql-proxy
-
接続対象の
*INSTANCE_CONNECTION_NAME
* を参照する- Cloud SQLのページへ移動 > 概要 > 対象のインスタンス > このインスタンスとの接続 > 接続名 で確認できます
- Cloud SQLのページへ移動 > 概要 > 対象のインスタンス > このインスタンスとの接続 > 接続名 で確認できます
-
接続コマンド
./cloud-sql-proxy --port 5432 --private-ip ***INSTANCE_CONNECTION_NAME***
👆このコマンドを叩くとProxyが有効になるので、あとは
localhost
として接続が可能になります!
参考URL
Discussion