Configurar un nombre DNS personalizado para una instancia de Cloud SQL

En esta página se describe cómo configurar un nombre de sistema de nombres de dominio (DNS) personalizado para tu instancia de Cloud SQL.

Información general

Puedes configurar una instancia de Cloud SQL para que tus aplicaciones puedan conectarse mediante un nombre DNS personalizado gestionado por tu organización. Si quieres usar un nombre DNS personalizado para conectarte a una instancia de Cloud SQL en lugar de una dirección IP, configura un nombre alternativo de asunto (SAN) personalizado. Puedes configurar un SAN personalizado cuando crees o actualices una instancia.

Cuando añades un nombre de DNS personalizado como configuración SAN personalizada a tu instancia, Cloud SQL inserta el nombre de DNS personalizado en el campo SAN del certificado de servidor de la instancia. Esta personalización te permite usar el nombre de DNS personalizado con la validación de nombre de host de forma segura. Puedes añadir una lista separada por comas de hasta tres nombres DNS personalizados a la configuración SAN personalizada. Por motivos de seguridad, solo puedes usar una configuración SAN personalizada en las instancias que configures con CUSTOMER_MANAGED_CAS_CA como modo de CA del servidor.

Una vez que hayas configurado el nombre de DNS personalizado de tu instancia, podrás usarlo para conectar tus clientes o aplicaciones de bases de datos, incluidos los conectores de lenguaje de Cloud SQL y el proxy de autenticación de Cloud SQL.

Flujo de trabajo

Para configurar un nombre de DNS personalizado para una instancia, sigue estos pasos:

  1. Crea una instancia configurada con una CA gestionada por el cliente.
  2. Añade valores SAN personalizados a la instancia. Los valores SAN personalizados se insertan en el campo SAN del certificado de servidor de la instancia.
  3. Determina la dirección IP de la instancia.
  4. Crea registros DNS personalizados para tu instancia.
  5. Conéctate a la instancia mediante el nombre DNS personalizado.

Antes de empezar

Antes de configurar un nombre de DNS personalizado para tu instancia, asegúrate de que tienes los roles y permisos necesarios.

Si vas a crear una instancia de Cloud SQL, para usar SAN personalizado, tu instancia también debe usar una autoridad de certificación (CA) gestionada por el cliente para su modo de CA de servidor.

Crear una instancia con valores SAN personalizados

Para crear una instancia con valores SAN personalizados, usa el siguiente 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

Haz las siguientes sustituciones:

  • INSTANCE_NAME con el nombre de la instancia de Cloud SQL que quieras crear.
  • DATABASE_VERSION con la enum de la versión de la instancia de Cloud SQL que quieras crear.
  • PROJECT_ID por el ID del proyecto en el que tienes previsto crear tus instancias de Cloud SQL.
  • PROJECT_ID_CAS por el ID del proyecto en el que has creado tu CA_POOL_ID. Este proyecto puede ser el mismo o diferente del proyecto en el que quieras crear tu instancia de Cloud SQL.
  • REGION con la región en la que has creado el grupo de ACs. Debes crear tu instancia en la misma región que el grupo de CAs.
  • CA_POOL_ID con el ID del grupo de ACs que has creado.
  • CUSTOM_DNS_NAME con un máximo de tres nombres de DNS personalizados separados por comas y sin espacios entre los valores. Por ejemplo, develop.example.com,test.example.com,production.example.com.

Terraform

Para crear una instancia con valores SAN personalizados, usa un recurso de Terraform. En el siguiente ejemplo también se crean los recursos necesarios para la nueva instancia.

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"]
    }
  }
}

Añadir o actualizar valores SAN personalizados de una instancia

Para añadir o actualizar valores SAN personalizados de una instancia, sigue estos pasos:

gcloud

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

Haz las siguientes sustituciones:

  • INSTANCE_NAME con el nombre de la instancia de Cloud SQL que quieras actualizar.
  • CUSTOM_DNS_NAME con un máximo de tres nombres de DNS personalizados, separados por comas y sin espacios entre los valores. Por ejemplo, develop.example.com,new-test.example.com,production.example.com.

Terraform

Para actualizar una instancia que ya tenga valores SAN personalizados, usa un recurso de 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"]
    }
  }
}

Borrar todos los valores SAN personalizados de una instancia

Para borrar todos los valores SAN personalizados de una instancia, haz lo siguiente:

gcloud

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

Sustituye INSTANCE_NAME por el nombre de la instancia de Cloud SQL que quieras actualizar.

Crear registros DNS personalizados

Antes de poder conectarte a la instancia mediante el nombre de DNS personalizado con tus clientes y aplicaciones, configura la asignación entre el nombre de DNS y la dirección IP. Esta asignación se conoce como resolución de DNS. Si te conectas de forma privada, crea el registro DNS en una zona DNS privada en la red de nube privada virtual (VPC) correspondiente.

Para crear registros DNS personalizados para tu instancia, sigue estos pasos:

  1. Obtén la dirección IP de tu instancia. Ejecuta el siguiente comando:

    gcloud sql instances describe INSTANCE_NAME \
     --project=PROJECT_ID

    Haz las siguientes sustituciones:

    • INSTANCE_NAME: el nombre de la instancia de Cloud SQL
    • PROJECT_ID: el ID o el número de proyecto del proyecto Google Cloud que contiene la instancia.
  2. En la respuesta, busca el campo ipAddresses:.

    Por ejemplo:

    ipAddresses:
    - ipAddress: 192.0.2.4
      type: PRIVATE
    

    Puedes obtener la dirección IP privada de una instancia configurada para el acceso a servicios privados, Private Service Connect o ambos.

  3. Añade dos registros DNS a una zona DNS que utilice tu aplicación. Puedes usar un servidor DNS que gestiones tú o la zona privada de Cloud DNS que utilice tu aplicación.

    • Crea un registro A para la dirección IP de la instancia.
    • Crea un registro TXT que contenga el nombre de conexión de la instancia.

    Los clientes de bases de datos estándar usan el registro A para buscar la dirección IP y establecer la conexión. Los conectores de lenguaje de Cloud SQL y el proxy de autenticación de Cloud SQL usan el registro TXT para buscar el nombre de conexión de la instancia.

    Por ejemplo, la cadena de conexión de tu instancia es my-project:region:my-instance, pero quieres conectarte mediante el nombre DNS prod-db.mycompany.example.com. Si la dirección IP de la instancia en la red de tu empresa es 192.0.2.4, crea los siguientes registros 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
    

Conectarse a una instancia mediante un nombre DNS personalizado

Cuando te conectes a la instancia de Cloud SQL para PostgreSQL, configura el nombre de DNS personalizado como nombre de host y habilita la verificación de identidad del servidor en tu cliente.

Por ejemplo, al usar el cliente psql, especifica la marca sslmode=verify-full. Otros controladores de cliente de PostgreSQL tienen marcas de configuración similares.

Si te conectas a una instancia privada de Cloud SQL desde una red externa, debes configurar tu instancia de Cloud SQL y su red de nube privada virtual (VPC) para permitir conexiones externas y para que Cloud DNS se comunique con los sistemas on-premise. Para obtener más información sobre esta configuración, consulta Conectarse desde una fuente externa y Configurar DNS para sistemas on-premise.

Limitaciones

  • No puedes añadir más de tres nombres DNS como valores SAN personalizados al certificado de servidor de una instancia de Cloud SQL.
  • La longitud máxima de un nombre DNS que puedes añadir al certificado como valor SAN personalizado de una instancia es de 253 caracteres.
  • Los nombres de DNS que añadas al certificado de una instancia no pueden incluir caracteres comodín (*) ni puntos finales. Por ejemplo, test.example.com. no está permitido.
  • Los nombres de DNS deben ser válidos, tal como se especifica en la RFC 1034.
  • Solo puede especificar valores SAN personalizados para instancias de CUSTOMER_MANAGED_CAS_CA.

Siguientes pasos