🐘

Cloud SQL for PostgreSQLをTerraformでデプロイする

2024/12/21に公開

Cloud SQL for PostgreSQL

https://cloud.google.com/sql/postgresql?hl=ja

概要:
GCPが提供するフルマネージドのPostgreSQLサービスで、データベースのセットアップ、保守、管理を簡素化します
特徴:

  • 高可用性: プライマリインスタンスとスタンバイインスタンスを使用した自動フェイルオーバー機能を提供します
  • スケーラビリティ: 読み取り専用のレプリカを作成して、読み取り負荷を分散できます
  • セキュリティ: データの暗号化、IAMとの統合、SSL/TLS接続などのセキュリティ機能を備えています
  • バージョン対応: PostgreSQL 9.6から最新のバージョンまで対応しています

前提

  1. Terraformがインストールされている。
  2. GCPプロジェクトが作成されており、適切なAPIが有効化されている。
  3. サービスアカウントの認証情報が設定されている。

動作環境

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のバージョン

https://cloud.google.com/sql/docs/postgres/db-versions?hl=ja#database-version-support

今回は最終的に PostgreSQL 16 を使うように設定していきたいと思います。

まずは database_version の部分を見ていきたいと思います。現時点で利用できるバージョンは👇になります。

※ 2024/12 時点

image1.png

Terraformのドキュメントは以下になります。

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/sql_database_instance#database_version-1

また、POSTGRES_16 を指定するとデフォルトで Enterprise Plus エディション になってしまうらしく、、

: インスタンスのデータベース バージョンが PostgreSQL 16 以降の場合、デフォルトの Cloud SQL エディションは Enterprise Plus です。データベース バージョンが PostgreSQL 16 より前の場合、デフォルトのエディションは Enterprise です。

https://cloud.google.com/sql/docs/postgres/create-instance?hl=ja

明示的に Enterprise エディション を指定する必要があります。

  settings {
    tier      = "${var.tier}"
    edition   = "ENTERPRISE"
    ...
  }

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/sql_database_instance#edition-1

各エディションの違いはこちらを参照👇

https://cloud.google.com/sql/docs/postgres/editions-intro?hl=ja#edition-features

マシンタイプ

https://cloud.google.com/sql/pricing?hl=ja

  • 共有コアマシンタイプ
    • 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" と指定する

Terraformのドキュメントは以下になります。

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/sql_database_instance#tier-1

Private IPの場合

次に、Private IP 内でCloudSQL for PostgreSQLを構築しSSL接続を想定している場合の設定を見ていきたいと思います。

  settings {
    tier      = "${var.tier}"
    edition   = "ENTERPRISE"
    ...
    ip_configuration {
      private_network = "..."
      allocated_ip_range = "..."
    }
  }

まずは使用する private_networkallocated_ip_range を設定します。

private_network に関しては👇を

https://cloud.google.com/sql/docs/postgres/connect-overview?hl=ja#private_ip

allocated_ip_range に関しては👇を参照して下さい。

https://cloud.google.com/sql/docs/postgres/private-ip?hl=ja#allocated_ip_address_ranges

次に settings > ip_configuration > ssl_mode を見ていきます。

ssl_mode

DB接続におけるSSL接続の強制方法を指定します。 サポートされる値は ALLOW_UNENCRYPTED_AND_ENCRYPTED, ENCRYPTED_ONLY, TRUSTED_CLIENT_CERTIFICATE_REQUIRED (SQL Server ではサポートされません) です。 詳細はAPIリファレンスドキュメントを参照

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/sql_database_instance#ssl_mode-1

こちらは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 を使用して接続する方法で進めてきます。

https://cloud.google.com/sql/docs/mysql/connect-auth-proxy?hl=ja

Cloud SQL Auth Proxy について

https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=ja

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のページへ移動 > 概要 > 対象のインスタンス > このインスタンスとの接続 > 接続名 で確認できます
      image2.png
  • 接続コマンド

    ./cloud-sql-proxy --port 5432 --private-ip ***INSTANCE_CONNECTION_NAME***
    

    👆このコマンドを叩くとProxyが有効になるので、あとは localhost として接続が可能になります!

参考URL

https://zenn.dev/monicle/articles/e03a329c021873

https://zenn.dev/monicle/articles/d98a8c269c9839

Discussion