為 Cloud SQL 執行個體設定自訂 DNS 名稱

本頁面說明如何為 Cloud SQL 執行個體設定自訂網域名稱系統 (DNS) 名稱。

總覽

您可以設定 Cloud SQL 執行個體,讓應用程式使用貴組織管理的自訂 DNS 名稱連線。如要使用自訂 DNS 名稱 (而非 IP 位址) 連線至 Cloud SQL 執行個體,請設定自訂主體別名 (SAN)。建立或更新執行個體時,您可以設定自訂 SAN。

將自訂 DNS 名稱做為自訂 SAN 設定新增至執行個體時,Cloud SQL 會將自訂 DNS 名稱插入執行個體伺服器憑證的 SAN 欄位。這項自訂功能可讓您安全地搭配主機名稱驗證使用自訂 DNS 名稱。您可以在自訂 SAN 設定中,新增以逗號分隔的清單,最多可包含三個自訂 DNS 名稱。基於安全考量,只有將伺服器 CA 模式設為 CUSTOMER_MANAGED_CAS_CA 的執行個體,才能使用自訂 SAN 設定。

為執行個體設定自訂 DNS 名稱後,您可以使用該自訂 DNS 名稱連線資料庫用戶端或應用程式,包括 Cloud SQL 語言連接器和 Cloud SQL Auth Proxy。

工作流程

如要為執行個體設定自訂 DNS 名稱,請按照下列步驟操作:

  1. 建立設定客戶自行管理 CA 的執行個體。
  2. 在執行個體中新增自訂 SAN 值。自訂 SAN 值會插入執行個體伺服器憑證的 SAN 欄位。
  3. 判斷執行個體的 IP 位址。
  4. 為執行個體建立自訂 DNS 記錄。
  5. 使用自訂 DNS 名稱連線至執行個體。

事前準備

為執行個體設定自訂 DNS 名稱之前,請確認您具備必要角色和權限。

如要建立新的 Cloud SQL 執行個體,並使用自訂 SAN,執行個體的伺服器 CA 模式也必須使用客戶自行管理的憑證授權單位 (CA)。

建立具有自訂 SAN 值的執行個體

如要建立具有自訂 SAN 值的執行個體,請使用下列 gcloud sql instances create 指令:

gcloud

gcloud sql instances create "INSTANCE_NAME" \
  --database-version=DATABASE_VERSION \
  --project=PROJECT_ID \
  --region=REGION \
  --server-ca-mode=CUSTOMER_MANAGED_CAS_CA \
  --server-ca-pool=projects/PROJECT_ID_CAS/locations/REGION/caPools/CA_POOL_ID
  --custom-subject-alternative-names=CUSTOM_DNS_NAME

請依指示取代下列項目:

  • INSTANCE_NAME 替換成要建立的 Cloud SQL 執行個體名稱。
  • DATABASE_VERSION 替換為要建立的 Cloud SQL 執行個體版本 enum。
  • PROJECT_ID:您要建立 Cloud SQL 執行個體的專案 ID。
  • PROJECT_ID_CAS:您建立 CA_POOL_ID 的專案 ID。這個專案可能與您要建立 Cloud SQL 執行個體的專案相同或不同。
  • 將 REGION 替換為建立 CA 集區的區域。您必須在 CA 集區所在的區域建立執行個體。
  • CA_POOL_ID:您建立的 CA 集區 ID。
  • CUSTOM_DNS_NAME,最多可輸入三個自訂 DNS 名稱,並以半形逗號分隔,值之間不留空格。例如:develop.example.com,test.example.com,production.example.com。

Terraform

如要建立具有自訂 SAN 值的執行個體,請使用 Terraform 資源。下列範例也會為新執行個體建立必要資源。

resource "google_project_service_identity" "default" {
  provider = google-beta
  service  = "sqladmin.googleapis.com"
}

resource "random_string" "default" {
  length  = 10
  special = false
  upper   = false
}

resource "google_privateca_ca_pool" "default" {
  name     = "customer-ca-pool-${random_string.default.result}"
  location = "asia-northeast1"
  tier     = "DEVOPS"
  publishing_options {
    publish_ca_cert = false
    publish_crl     = false
  }
}

# This is required for setting up customer managed CAS (Certificate Authority Service) instances.
resource "google_privateca_certificate_authority" "default" {
  pool                                   = google_privateca_ca_pool.default.name
  certificate_authority_id               = "my-certificate-authority"
  location                               = "asia-northeast1"
  lifetime                               = "86400s"
  type                                   = "SELF_SIGNED"
  deletion_protection                    = false # set to "true" in production
  skip_grace_period                      = true
  ignore_active_certificates_on_deletion = true
  config {
    subject_config {
      subject {
        organization = "my organization"
        common_name  = "my certificate authority name"
      }
    }
    x509_config {
      ca_options {
        is_ca = true
      }
      key_usage {
        base_key_usage {
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
          server_auth = false
        }
      }
    }
  }
  key_spec {
    algorithm = "RSA_PKCS1_4096_SHA256"
  }
}

resource "google_privateca_ca_pool_iam_member" "default" {
  ca_pool = google_privateca_ca_pool.default.id
  role    = "roles/privateca.certificateRequester"

  member = "serviceAccount:${google_project_service_identity.default.email}"
}

resource "google_sql_database_instance" "default" {
  name             = "sqlserver-instance"
  region           = "asia-northeast1"
  database_version = "SQLSERVER_2022_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
    ip_configuration {
      # The following server CA mode lets the instance use customer-managed CAS CA to issue server certificates.
      # https://cloud.google.com/sql/docs/sqlserver/admin-api/rest/v1beta4/instances#ipconfiguration
      server_ca_mode                   = "CUSTOMER_MANAGED_CAS_CA"
      server_ca_pool                   = google_privateca_ca_pool.default.id
      custom_subject_alternative_names = ["customSan.test.com"]
    }
  }
}

新增或更新執行個體的自訂 SAN 值

如要為現有執行個體新增或更新自訂 SAN 值,請按照下列步驟操作:

gcloud

gcloud sql instances patch INSTANCE_NAME \
  --custom-subject-alternative-names=CUSTOM_DNS_NAME

請依指示取代下列項目:

  • INSTANCE_NAME 替換成要更新的 Cloud SQL 執行個體名稱。
  • CUSTOM_DNS_NAME,最多可輸入三個自訂 DNS 名稱,並以半形逗號分隔,值之間不留空格。例如:develop.example.com,new-test.example.com,production.example.com。

Terraform

如要更新已有自訂 SAN 值的執行個體,請使用 Terraform 資源。

resource "google_sql_database_instance" "default" {
  name             = "sqlserver-instance"
  region           = "asia-northeast1"
  database_version = "SQLSERVER_2022_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
    ip_configuration {
      # The following server CA mode lets the instance use customer-managed CAS CA to issue server certificates.
      # https://cloud.google.com/sql/docs/sqlserver/admin-api/rest/v1beta4/instances#ipconfiguration
      server_ca_mode                   = "CUSTOMER_MANAGED_CAS_CA"
      server_ca_pool                   = google_privateca_ca_pool.default.id
      custom_subject_alternative_names = ["customSan.test.com"]
    }
  }
}

清除執行個體的所有自訂 SAN 值

如要清除執行個體的所有自訂 SAN 值,請按照下列步驟操作:

gcloud

gcloud sql instances patch INSTANCE_NAME \
  --clear-custom-subject-alternative-names

將 INSTANCE_NAME 替換為要更新的 Cloud SQL 執行個體名稱。

建立自訂 DNS 記錄

您必須先設定 DNS 名稱和 IP 位址之間的對應關係,才能使用自訂 DNS 名稱,將用戶端和應用程式連線至執行個體。這項對應稱為 DNS 解析。如果是透過私人連線,請在對應虛擬私有雲 (VPC) 網路的私人 DNS 區域中建立 DNS 記錄。

如要為執行個體建立自訂 DNS 記錄,請按照下列步驟操作:

  1. 擷取執行個體的 IP 位址。執行下列指令:

    gcloud sql instances describe INSTANCE_NAME \
     --project=PROJECT_ID

    請依指示取代下列項目:

    • INSTANCE_NAME:Cloud SQL 執行個體的名稱
    • PROJECT_ID:包含執行個體的 Google Cloud 專案 ID 或專案編號
  2. 在回應中,尋找 ipAddresses: 欄位。

    例如:

    ipAddresses:
    - ipAddress: 192.0.2.4
      type: PRIVATE
    

    您可以擷取設定為私人服務存取權、Private Service Connect 或兩者的執行個體私人 IP 位址。

  3. 將兩筆 DNS 記錄新增至應用程式使用的 DNS 區域。您可以使用自行管理的 DNS 伺服器,或應用程式使用的 Cloud DNS 私人區域。

    • 為執行個體的 IP 位址建立 A 記錄
    • 建立包含執行個體連線名稱的 TXT 記錄。

    標準資料庫用戶端會使用 A 記錄查詢 IP 位址,以便建立連線。Cloud SQL 語言連接器和 Cloud SQL Auth Proxy 會使用 TXT 記錄查詢執行個體連線名稱。

    舉例來說,執行個體的連線字串為 my-project:region:my-instance,但您想使用 DNS 名稱 prod-db.mycompany.example.com 連線。如果公司網路上的執行個體 IP 位址是 192.0.2.4,請建立下列 DNS 記錄:

    Record type: A
    Name: prod-db.mycompany.example.com
    Value: 192.0.2.4
    TTL: 600
    
    Record type: TXT
    Name: prod-db.mycompany.example.com
    Value: my-project:region:my-instance
    TTL: 600
    

使用自訂 DNS 名稱連線至執行個體

連線至 SQL Server 適用的 Cloud SQL 執行個體時,請將自訂 DNS 名稱設為主機名稱。接著,指定 sqlcmd 的 -N 旗標,或選取 SSMS 的「Encrypt Connection/Encryption」(加密連線/加密) 選項,啟用伺服器身分驗證。

其他 SQL Server 驅動程式也有類似的旗標或設定。

如要從外部網路連線至私人 Cloud SQL 執行個體,您必須設定 Cloud SQL 執行個體及其虛擬私有雲 (VPC) 網路,允許外部連線,並讓 Cloud DNS 與地端部署系統通訊。如要進一步瞭解這項設定,請參閱「從外部來源連線」和「為地端部署系統設定 DNS」。

限制

  • Cloud SQL 執行個體的伺服器憑證,最多只能新增三個 DNS 名稱做為自訂 SAN 值。
  • 您可以將 DNS 名稱新增至憑證,做為執行個體的自訂 SAN 值,長度上限為 253 個字元。
  • 您為執行個體新增至憑證的 DNS 名稱不得包含萬用字元 (*) 或結尾點。舉例來說,test.example.com. 就不符合規定。
  • DNS 名稱必須有效,如 RFC 1034 所指定。
  • 您只能為 CUSTOMER_MANAGED_CAS_CA 執行個體指定自訂 SAN 值。

後續步驟