Configurer le DNS dans Private Service Connect

Cette page explique comment configurer le DNS dans Private Service Connect.

Présentation

Le DNS est la méthode recommandée pour se connecter aux instances sur lesquelles Private Service Connect est activé. Un nom DNS permet à différents réseaux de se connecter à la même instance, où les points de terminaison Private Service Connect de chaque réseau peuvent avoir des adresses IP différentes. De plus, le proxy d'authentification Cloud SQL et les connecteurs de langage nécessitent des noms DNS pour se connecter à ces instances.

Les instances Cloud SQL sur lesquelles Private Service Connect est activé peuvent avoir deux types de noms DNS :

  • Nom DNS par instance. Cette fonctionnalité est disponible pour les instances de toutes les éditions de Cloud SQL. L'instance principale et chaque instance répliquée ont des noms DNS par instance différents.

  • Nom DNS d'un point de terminaison d'écriture global. Cette option est disponible pour les instances de l'édition Cloud SQL Enterprise Plus afin de faciliter la reprise après sinistre avancée. Un point de terminaison d'écriture est un nom DNS global qui pointe automatiquement vers l'adresse IP de l'instance principale actuelle. En cas d'opération de basculement ou de commutation d'instance répliquée, ce point de terminaison d'écriture redirige automatiquement les connexions entrantes vers la nouvelle instance principale. En utilisant un point de terminaison d'écriture, vous pouvez éviter d'avoir à modifier la connexion de l'application lorsque vous effectuez une opération de basculement ou de commutation d'instance répliquée pour la récupération après une panne régionale ou un exercice de reprise après sinistre.

Automatisation DNS dans Private Service Connect

Pour créer un nom DNS par instance, vous pouvez utiliser la fonctionnalité d'automatisation DNS Cloud SQL pour configurer les enregistrements et le nom DNS à votre place. Lorsque vous activez l'automatisation DNS, Cloud SQL provisionne et gère automatiquement les enregistrements DNS pour le nom DNS par instance dans vos réseaux VPC consommateurs autorisés.

Si l'automatisation DNS est activée sur une instance Cloud SQL Enterprise Plus, vous pouvez également activer un nom DNS de point de terminaison d'écriture global qui pointe toujours automatiquement vers l'adresse IP de l'instance principale actuelle.

Vous pouvez éventuellement configurer manuellement un enregistrement DNS par instance pour l'instance (consultez Configurer manuellement le DNS), mais nous vous recommandons d'utiliser l'automatisation DNS. La configuration manuelle du DNS est une option obsolète.

Conditions préalables à l'activation de l'automatisation DNS

  • Pour utiliser l'automatisation DNS ou un nom DNS de point de terminaison d'écriture global, vous devez activer l'API Cloud DNS.
  • L'automatisation DNS ne peut être activée que lorsque Private Service Connect est activé (utilisez le paramètre --enable-private-service-connect).
  • L'automatisation DNS ne peut être activée que si au moins une connexion automatique Private Service Connect est spécifiée (utilisez --psc-auto-connections=network).
  • Un nom DNS de point de terminaison d'écriture global ne peut être activé que pour une instance Cloud SQL Enterprise Plus dont l'automatisation DNS est activée.

Configuration de l'automatisation DNS

Vous pouvez activer l'automatisation DNS et le nom DNS du point de terminaison d'écriture global lorsque vous créez une instance avec Private Service Connect activé, comme indiqué dans Créer une instance Cloud SQL.

Vous pouvez également activer ou désactiver l'automatisation DNS pour les instances existantes. Dans ce cas, Cloud SQL provisionne ou nettoie automatiquement les enregistrements DNS associés dans les réseaux respectifs.

gcloud

gcloud sql instances patch INSTANCE_NAME \
  --enable-psc-auto-dns=DNS_ENABLEMENT \
  --enable-psc-write-endpoint-dns=GLOBAL_DNS_ENABLEMENT \

REST

La méthode HTTP et l'URL se présenteraient comme suit :

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

Le corps de la requête JSON se présenterait comme suit :

{
  "name": "INSTANCE_NAME",
  "project": "PROJECT_ID",
  "region": "REGION_NAME",
  "databaseVersion": "DATABASE_VERSION",
  "kind": "sql#instance",
  "settings": {
    "availabilityType": "AVAILABILITY_TYPE",
    "ipConfiguration": {
      "ipv4Enabled": false,
      "pscConfig": {
        "allowedConsumerProjects": [
          "ALLOWED_PROJECTS"
        ],
        "pscAutoConnections": [
          {
            "consumerProject":"CONSUMER_PROJECT",
            "consumerNetwork":"projects/PARENT_PROJECT/global/networks/CONSUMER_NETWORK"
          }
        ],
        "pscEnabled": true,
        "pscAutoDnsEnabled": DNS_ENABLEMENT,
        "pscWriteEndpointDnsEnabled": GLOBAL_DNS_ENABLEMENT,
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "SYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

Effectuez les remplacements suivants :

  • DNS_ENABLEMENT : true ou false, selon que vous souhaitez activer ou désactiver l'automatisation DNS.
  • GLOBAL_DNS_ENABLEMENT : true ou false, selon que vous souhaitez activer ou désactiver un nom DNS de point de terminaison d'écriture global. Si la valeur est true, enable-psc-auto-dns doit également être true.

Afficher les noms DNS

Vous pouvez trouver le nom DNS par instance pour une instance et le nom DNS du point de terminaison d'écriture global pour le projet à l'aide de la commande describe.

gcloud

Nom DNS par instance

Pour trouver le nom DNS par instance créé à l'aide de l'automatisation DNS, utilisez la commande gcloud sql instances describe comme suit :

    gcloud sql instances describe INSTANCE_NAME \
      --project=PROJECT_ID  \
      --flatten="dnsNames[]" \
      --format="csv[no-heading](dnsNames.dnsScope, dnsNames.recordManager, dnsNames.name)" \
        | grep "INSTANCE,CLOUD_SQL_AUTOMATION"
  

Le résultat doit se présenter comme suit (où DNS_NAME correspond au nom DNS par instance de l'instance) :

INSTANCE,CLOUD_SQL_AUTOMATION,DNS_NAME

Le nom DNS se terminera par le nom de la région de l'instance, suivi de .sql-psc-goog, comme ceci :
INSTANCE,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.us-central1.sql-psc.goog.
Pour renvoyer uniquement le nom DNS non décoré, ajoutez | cut -d, -f3 à la fin de la commande.

Nom DNS du point de terminaison d'écriture global

De même, vous pouvez utiliser la commande describe pour trouver le nom DNS du point de terminaison d'écriture global de votre cluster de réplication :

    gcloud sql instances describe INSTANCE_NAME \
      --project=INSTANCE_NAME  \
      --flatten="dnsNames[]" \
      --format="csv[no-heading](dnsNames.dnsScope, dnsNames.recordManager, dnsNames.name)" \
        | grep "CLUSTER,CLOUD_SQL_AUTOMATION"
  

Le résultat se présente comme suit (où GLOBAL_DNS_NAME correspond au nom DNS du point de terminaison d'écriture global pour votre cluster de réplication) :

CLUSTER,CLOUD_SQL_AUTOMATION,GLOBAL_DNS_NAME

Le nom DNS du point de terminaison d'écriture global se termine par .global.sql-psc-goog, comme ceci :
CLUSTER,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.global.sql-psc.goog. Pour renvoyer uniquement le nom DNS sans décoration, ajoutez | cut -d, -f3 à la fin de la commande.

REST

La méthode HTTP et l'URL se présenteraient comme suit :

GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

Le nom DNS par instance et le nom DNS du point de terminaison d'écriture global sont renvoyés dans le champ dnsNames de la réponse, comme suit :

{
  "dnsNames": [
    {
      "connectionType": "PRIVATE_SERVICE_CONNECT",
      "dnsScope": "INSTANCE",
      "name": "31f5395197d0.3e0v7ztul56ph.us-central1.sql.goog.",
      "recordManager": "CUSTOMER"
    },
    {
      "connectionType": "PRIVATE_SERVICE_CONNECT",
      "dnsScope": "INSTANCE",
      "name": "31f5395197d0.3e0v7ztul56ph.us-central1.sql-psc.goog",
      "recordManager": "CLOUD_SQL_AUTOMATION"
    },
    {
      "connectionType": "PRIVATE_SERVICE_CONNECT",
      "dnsScope": "CLUSTER",
      "name": "3lbvojtu2fo6q.3e0v7ztul56ph.global.sql-psc.goog",
      "recordManager": "CLOUD_SQL_AUTOMATION"
    }
  ],
}

Vous pouvez utiliser le nom DNS du point de terminaison d'écriture global ou le nom DNS par instance pour vous connecter à l'instance. Consultez Se connecter à l'aide d'un enregistrement DNS.

Champs d'état de l'automatisation DNS

Vous pouvez déterminer l'état du DNS pour votre instance et votre cluster de réplication dans ces deux champs de sortie :

  • instanceAutoDnsStatus : affiche l'état du DNS par instance.
  • writeEndpointAutoDnsStatus : affiche l'état du DNS du point de terminaison d'écriture global.

Ces deux champs peuvent présenter les valeurs suivantes :

  • AUTO_DNS_STATUS_UNSPECIFIED
  • AUTO_DNS_OK
  • AUTO_DNS_FAILED
  • AUTO_DNS_UNKNOWN

Ces champs apparaissent dans le champ de sortie pscAutoConnections :

    "pscAutoConnections": [
      {
        "consumerNetwork": "projects/my-psc-project/global/networks/psc-dns-net2",
        "consumerNetworkStatus": "VALID",
        "consumerProject": "my-psc-project",
        "instanceAutoDnsStatus": "AUTO_DNS_OK",
        "ipAddress": "10.0.2.4",
        "status": "ACTIVE",
        "writeEndpointAutoDnsStatus": "AUTO_DNS_OK"
      }
    ]

Résoudre les problèmes d'automatisation DNS

Si l'API Cloud DNS n'est pas activée, si la règle de connexion Private Service Connect est manquante ou si des erreurs de backend se produisent lors de la création d'un enregistrement DNS, l'automatisation DNS peut ne pas créer d'enregistrement DNS par instance ni de nom DNS de point de terminaison d'écriture global.

Si vous rencontrez une situation où l'automatisation DNS n'a pas été correctement provisionnée, vous pouvez utiliser deux options avec l'API update/patch ou la gcloud CLI :

  • --reconcile-psc-networking (boolean) : lorsque cette option est activée, Cloud SQL tente de restaurer les parties de l'automatisation DNS qui ne fonctionnent pas. Cette option n'entraîne aucun temps d'arrêt.
  • --reconcile-psc-networking-force (boolean) : semblable à reconcile-psc-networking, mais si cette option est définie, Cloud SQL tente de restaurer complètement toute l'automatisation DNS au prix d'un bref temps d'arrêt sur les parties d'automatisation DNS PSC existantes qui fonctionnent. Cela peut aider dans certains cas où reconcile-psc-networking ne le fait pas.

Attribuer des noms DNS personnalisés

Vous pouvez configurer des noms DNS personnalisés pour vos instances Cloud SQL Private Service Connect. Il vous suffit de créer un enregistrement CNAME avec le nom DNS de l'instance Private Service Connect comme valeur. Par exemple, si vous souhaitez configurer vos applications à l'aide du nom DNS de la base de données sample-db.mycompany.example.com pour faire référence à l'instance de base de données avec le nom DNS Private Service Connect abcdef123456.987654321fedcb.us-central1.sql-psc.goog, vous devez d'abord configurer l'instance avec un nom DNS personnalisé, puis créer un enregistrement DNS CNAME à l'aide du fournisseur DNS :

NOM TYPE Valeur TTL VALEUR
sample-db.mycompany.example.com CNAME 600 abcdef123456.987654321fedcb.us-central1.sql-psc.goog

Configurer le DNS manuellement

Nous vous recommandons d'utiliser l'automatisation DNS, car la configuration DNS manuelle est une option obsolète. Vous pouvez également configurer manuellement un enregistrement DNS par instance pour l'instance. Un nom DNS permet d'utiliser le proxy d'authentification ou les connecteurs de langage de manière cohérente pour se connecter à partir de différents réseaux. La réponse de l'API de recherche d'instance fournit un nom DNS suggéré que vous pouvez utiliser pour créer l'enregistrement DNS dans une zone DNS privée du réseau VPC correspondant.

gcloud

  1. Pour afficher des informations récapitulatives sur une instance Cloud SQL, y compris son nom DNS, utilisez la commande gcloud sql instances describe :

            gcloud sql instances describe INSTANCE_NAME \
              --project=PROJECT_ID
          

    Effectuez les remplacements suivants :

    • INSTANCE_NAME : nom de l'instance Cloud SQL
    • PROJECT_ID : ID ou numéro de projet du projet Google Cloud contenant l'instance

    Dans la réponse, vérifiez que le nom DNS apparaît. Ce nom a le format suivant : INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.. Exemple : 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog..

    Si vous souhaitez utiliser un nom DNS personnalisé pour vous connecter à une instance Cloud SQL au lieu d'utiliser le nom DNS prédéfini dans cette section, configurez le paramètre de nom alternatif du sujet (SAN) personnalisé lors de la création de l'instance. Le nom DNS personnalisé que vous insérez dans le paramètre SAN personnalisé est ajouté au champ SAN du certificat de serveur de l'instance. Cela vous permet d'utiliser le nom DNS personnalisé avec la validation du nom d'hôte de manière sécurisée.

    Pour en savoir plus sur la configuration du paramètre SAN personnalisé, consultez Créer des instances.

  2. Pour créer une zone DNS privée, utilisez la commande gcloud dns managed-zones create. Cette zone est associée au réseau VPC utilisé pour se connecter à l'instance Cloud SQL via le point de terminaison Private Service Connect.

      gcloud dns managed-zones create ZONE_NAME \
        --project=PROJECT_ID \
        --description="DESCRIPTION" \
        --dns-name=DNS_NAME \
        --networks=NETWORK_NAME \
        --visibility=private
          

    Effectuez les remplacements suivants :

    • ZONE_NAME : nom de la zone DNS
    • PROJECT_ID : ID ou numéro de projet du projet Google Cloud contenant la zone.
    • DESCRIPTION : description de la zone (par exemple, une zone DNS pour l'instance Cloud SQL)
    • DNS_NAME : nom du suffixe DNS pour la zone, tel que REGION_NAME.sql.goog. (où REGION_NAME correspond au nom de la région pour la zone).
    • NETWORK_NAME : nom du réseau VPC.
  3. Après avoir créé le point de terminaison Private Service Connect, utilisez la commande gcloud dns record-sets create pour créer un enregistrement DNS dans la zone :

       gcloud dns record-sets create DNS_RECORD \
         --project=PROJECT_ID \
         --type=RRSET_TYPE \
         --rrdatas=RR_DATA \
         --zone=ZONE_NAME
          

    Effectuez les remplacements suivants :

    • DNS_RECORD : nom de l'enregistrement DNS. Cet enregistrement est défini sur le nom DNS que vous avez récupéré à partir de l'instance Cloud SQL précédemment dans cette procédure (par exemple,
      1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.).
    • RRSET_TYPE : type d'enregistrement de ressource du jeu d'enregistrements DNS. Si l'adresse IP interne que vous avez réservée pour le point de terminaison Private Service Connect est une adresse IPv4, spécifiez A pour ce paramètre. Sinon, si l'adresse IP du point de terminaison est une adresse IPv6, spécifiez AAAA.
    • RR_DATA : adresse IP allouée au point de terminaison Private Service Connect (par exemple, 198.51.100.5). Vous pouvez également saisir plusieurs valeurs, telles que rrdata1 rrdata2 rrdata3 (par exemple,
      10.1.2.3 10.2.3.4 10.3. 4.5).

REST

  1. Procurez-vous le nom DNS d'une instance Cloud SQL.
  2. Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • PROJECT_ID : ID ou numéro de projet du projet Google Cloud contenant l'instance.
    • INSTANCE_NAME : nom de l'instance

    Méthode HTTP et URL :

    GET https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

    Pour envoyer votre requête, développez l'une des options suivantes :

    Vous devriez recevoir une réponse JSON de ce type :

    {
      ...
      "dnsName": "INSTANCE_ID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog."
    }
    

    Le champ dnsName affiche le nom DNS de l'instance Cloud SQL. Les noms DNS se terminent toujours par un point (.).

  3. Créez une zone DNS privée. Cette zone est associée au réseau VPC utilisé pour se connecter à l'instance Cloud SQL via le point de terminaison Private Service Connect.
  4. Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • PROJECT_ID : ID ou numéro de projet du projet Google Cloud contenant la zone DNS.
    • ZONE_NAME : nom de la zone.
    • DESCRIPTION : une description de la zone (par exemple, une zone DNS pour l'instance Cloud SQL).
    • DNS_NAME : nom du suffixe DNS pour la zone, tel que REGION_NAME.sql.goog. (où REGION_NAME correspond au nom de la région pour la zone).
    • NETWORK_NAME : nom du réseau VPC.

    Méthode HTTP et URL :

    POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones

    Corps JSON de la requête :

    {
      "name": "ZONE_NAME",
      "description": "DESCRIPTION",
      "dnsName": "DNS_NAME",
      "visibility": "private",
      "privateVisibilityConfig": {
        "kind": "dns#managedZonePrivateVisibilityConfig",
        "networks": [
          {
            "kind": "dns#managedZonePrivateVisibilityConfigNetwork",
            "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME"
          }
        ]
      }
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    Vous devriez recevoir une réponse JSON de ce type :

    {
      "name": "ZONE_NAME",
      "dnsName": "DNS_NAME",
      "description": "DESCRIPTION",
      "id": "ID",
      "nameServers": [
        "ns-gcp-private.googledomains.com."
      ],
      "creationTime": "2024-05-10T17:05:34.607Z",
      "visibility": "private",
      "privateVisibilityConfig": {
        "networks": [
          {
            "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME",
            "kind": "dns#managedZonePrivateVisibilityConfigNetwork"
          }
        ],
        "gkeClusters": [],
        "kind": "dns#managedZonePrivateVisibilityConfig"
      },
      "cloudLoggingConfig": {
        "kind": "dns#managedZoneCloudLoggingConfig"
      },
      "kind": "dns#managedZone"
    }
    
  5. Après avoir créé le point de terminaison Private Service Connect, créez un enregistrement DNS dans la zone.
  6. Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • PROJECT_ID : ID ou numéro de projet du projet Google Cloud contenant la zone DNS.
    • ZONE_NAME : nom de la zone.
    • DNS_RECORD : nom de l'enregistrement DNS. Cet enregistrement est défini sur le nom DNS que vous avez récupéré à partir de l'instance Cloud SQL précédemment dans cette procédure (par exemple, 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.).
    • RRSET_TYPE : type d'enregistrement de ressource du jeu d'enregistrements DNS. Si l'adresse IP interne que vous avez réservée pour le point de terminaison Private Service Connect est une adresse IPv4, spécifiez A pour ce paramètre. Sinon, si l'adresse IP du point de terminaison est IPv6, spécifiez AAAA.
    • TTL : valeur TTL (Time To Live) du jeu d'enregistrements exprimée en nombre de secondes (par exemple, 300).
    • RR_DATA : adresse IP allouée au point de terminaison Private Service Connect (par exemple, 198.51.100.5). Vous pouvez également saisir plusieurs valeurs, telles que rrdata1 rrdata2 rrdata3 (par exemple 10.1.2.3 10.2.3.4 10.3.4.5).

    Méthode HTTP et URL :

    POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/ZONE_NAME

    Corps JSON de la requête :

    {
      "deletions": []
      "additions": [
        {
          "name": "DNS_RECORD",
          "type": "RRSET_TYPE",
          "ttl": TTL,
          "rrdatas": [
            "RR_DATA"
          ]
        }
      ]
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    Vous devriez recevoir une réponse JSON de ce type :

    {
      "additions": [
        {
          "name": "DNS_RECORD",
          "type": "RRSET_TYPE",
          "ttl": TTL,
          "rrdatas": [
            "RR_DATA"
          ],
          "signatureRrdatas": [],
          "kind": "dns#resourceRecordSet"
        }
      ],
      "deletions": [],
      "startTime": "2024-05-10T17:29:44.375Z",
      "id": "CHANGE_ID",
      "status": "pending",
      "kind": "dns#change"
    }