Configure um nome DNS personalizado para uma instância do Cloud SQL

Esta página descreve como configurar um nome do sistema de nomes de domínio (DNS) personalizado para a sua instância do Cloud SQL.

Vista geral

Pode configurar uma instância do Cloud SQL para que as suas aplicações possam estabelecer ligação através de um nome DNS personalizado gerido pela sua organização. Se quiser usar um nome DNS personalizado para se ligar a uma instância do Cloud SQL em vez de usar um endereço IP, configure um nome alternativo do assunto (SAN) personalizado. Pode configurar um SAN personalizado quando cria ou atualiza uma instância.

Quando adiciona um nome DNS personalizado como uma configuração SAN personalizada à sua instância, o Cloud SQL insere o nome DNS personalizado no campo SAN do certificado do servidor da instância. Esta personalização permite-lhe usar o nome DNS personalizado com a validação do nome do anfitrião de forma segura. Pode adicionar uma lista separada por vírgulas de até três nomes DNS personalizados à configuração SAN personalizada. Por motivos de segurança, pode usar uma configuração SAN personalizada apenas para instâncias que configurar com CUSTOMER_MANAGED_CAS_CA como o modo de CA do servidor.

Depois de configurar o nome DNS personalizado para a sua instância, pode usar esse nome DNS personalizado para ligar os clientes ou as aplicações da base de dados, incluindo os conetores de linguagem do Cloud SQL e o proxy Auth do Cloud SQL.

Fluxo de trabalho

Para configurar um nome DNS personalizado para uma instância, faça o seguinte:

  1. Crie uma instância configurada com a AC gerida pelo cliente.
  2. Adicione valores SAN personalizados à instância. Os valores SAN personalizados são inseridos no campo SAN do certificado do servidor da instância.
  3. Determine o endereço IP da instância.
  4. Crie registos DNS personalizados para a sua instância.
  5. Estabeleça ligação à instância através do nome DNS personalizado.

Antes de começar

Antes de configurar um nome DNS personalizado para a sua instância, certifique-se de que tem as funções e as autorizações necessárias.

Se estiver a criar uma nova instância do Cloud SQL, para usar o SAN personalizado, a instância também tem de usar uma autoridade de certificação (CA) gerida pelo cliente para o respetivo modo de CA do servidor.

Crie uma instância com valores SAN personalizados

Para criar uma instância com valores SAN personalizados, use o seguinte comando 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

Faça as seguintes substituições:

  • INSTANCE_NAME com o nome da instância do Cloud SQL que quer criar.
  • DATABASE_VERSION com o enum da versão da instância do Cloud SQL que quer criar.
  • PROJECT_ID com o ID do projeto onde planeia criar as suas instâncias do Cloud SQL.
  • PROJECT_ID_CAS com o ID do projeto onde criou o seu CA_POOL_ID. Este projeto pode ser igual ou diferente do local onde quer criar a sua instância do Cloud SQL.
  • REGION com a região onde criou o grupo de CA. Tem de criar a instância na mesma região que o conjunto de ACs.
  • CA_POOL_ID com o ID do conjunto de ACs que criou.
  • CUSTOM_DNS_NAME com até três nomes DNS personalizados, separados por vírgulas e sem espaços entre os valores. Por exemplo, develop.example.com,test.example.com,production.example.com.

Terraform

Para criar uma instância com valores SAN personalizados, use um recurso do Terraform. O exemplo seguinte também cria recursos pré-requisitos para a nova instância.

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             = "postgres-instance"
  region           = "asia-northeast1"
  database_version = "POSTGRES_17"
  settings {
    edition = "ENTERPRISE"
    tier    = "db-f1-micro"
    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/postgres/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"]
    }
  }
}

Adicione ou atualize valores SAN personalizados para uma instância

Para adicionar ou atualizar valores SAN personalizados para uma instância existente, faça o seguinte:

gcloud

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

Faça as seguintes substituições:

  • INSTANCE_NAME com o nome da instância do Cloud SQL que quer atualizar.
  • CUSTOM_DNS_NAME com até três nomes DNS personalizados, separados por vírgulas sem espaços entre os valores. Por exemplo, develop.example.com,new-test.example.com,production.example.com.

Terraform

Para atualizar uma instância que já tenha valores SAN personalizados, use um recurso do Terraform.

resource "google_sql_database_instance" "default" {
  name             = "postgres-instance"
  region           = "asia-northeast1"
  database_version = "POSTGRES_17"
  settings {
    edition = "ENTERPRISE"
    tier    = "db-f1-micro"
    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/postgres/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"]
    }
  }
}

Limpe todos os valores SAN personalizados de uma instância

Para limpar todos os valores SAN personalizados de uma instância, faça o seguinte:

gcloud

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

Substitua INSTANCE_NAME pelo nome da instância do Cloud SQL que quer atualizar.

Crie registos DNS personalizados

Antes de poder estabelecer ligação à instância através do nome DNS personalizado com os seus clientes e aplicações, configure o mapeamento entre o nome DNS e o endereço IP. Esta associação é conhecida como resolução de DNS. Se estiver a estabelecer ligação de forma privada, crie o registo DNS numa zona DNS privada na rede da nuvem virtual privada (VPC) correspondente.

Para criar registos de DNS personalizados para a sua instância, faça o seguinte:

  1. Recupere o endereço IP da sua instância. Execute o seguinte comando:

    gcloud sql instances describe INSTANCE_NAME \
     --project=PROJECT_ID

    Faça as seguintes substituições:

    • INSTANCE_NAME: o nome da instância do Cloud SQL
    • PROJECT_ID: o ID ou o número do projeto do projeto Google Cloud que contém a instância
  2. Na resposta, procure o campo ipAddresses:.

    Por exemplo:

    ipAddresses:
    - ipAddress: 192.0.2.4
      type: PRIVATE
    

    Pode obter o endereço IP privado de uma instância configurada para o acesso privado aos serviços, o Private Service Connect ou ambos.

  3. Adicione dois registos de DNS a uma zona de DNS usada pela sua aplicação. Pode usar um servidor DNS que gere de forma autónoma ou a zona privada do Cloud DNS usada pela sua aplicação.

    • Crie um registo A para o endereço IP da instância
    • Crie um registo TXT que contenha o nome da ligação da instância.

    Os clientes de base de dados padrão usam o registo A para procurar o endereço IP para estabelecer a ligação. Os conetores de linguagem do Cloud SQL e o proxy Auth do Cloud SQL usam o registo TXT para procurar o nome de ligação da instância.

    Por exemplo, a string de ligação para a sua instância é my-project:region:my-instance, mas quer estabelecer ligação através do nome DNS prod-db.mycompany.example.com. Se o endereço IP da instância na rede da sua empresa for 192.0.2.4, crie os seguintes registos 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
    

Estabeleça ligação a uma instância através de um nome DNS personalizado

Quando se ligar à instância do Cloud SQL para PostgreSQL, configure o nome DNS personalizado como o nome do anfitrião e ative a validação da identidade do servidor no seu cliente.

Por exemplo, quando usar o cliente psql, especifique a flag sslmode=verify-full. Outros controladores de cliente do PostgreSQL têm flags de configuração semelhantes.

Se estiver a estabelecer ligação a uma instância privada do Cloud SQL a partir de uma rede externa, tem de configurar a instância do Cloud SQL e a respetiva rede de nuvem virtual privada (VPC) para permitir ligações externas e permitir que o Cloud DNS comunique com sistemas no local. Para mais informações acerca desta configuração, consulte os artigos Estabeleça ligação a partir de uma origem externa e Configure o DNS para sistemas no local.

Limitações

  • Não pode adicionar mais de três nomes DNS como valores SAN personalizados ao certificado do servidor de uma instância do Cloud SQL.
  • O comprimento máximo de um nome de DNS que pode adicionar ao certificado como um valor SAN personalizado para uma instância é de 253 carateres.
  • Os nomes DNS que adiciona ao certificado de uma instância não podem ter carateres universais (*) nem pontos finais. Por exemplo, test.example.com. não é permitido.
  • Os nomes DNS têm de ser válidos, conforme especificado no RFC 1034.
  • Só pode especificar valores SAN personalizados para instâncias CUSTOMER_MANAGED_CAS_CA.

O que se segue?