Acceder a las APIs de Google a través de endpoints

En este documento se explica cómo usar los puntos finales de Private Service Connect para conectarse a las APIs de Google. En lugar de enviar solicitudes a la API a las direcciones IP disponibles públicamente de los endpoints de servicio, como storage.googleapis.com, puedes enviar las solicitudes a la dirección IP interna de un endpoint.

También puedes usar Private Service Connect para acceder a servicios de otra red de VPC y para publicar servicios.

Roles

Los siguientes roles de gestión de identidades y accesos proporcionan los permisos necesarios para realizar las tareas de esta guía.

Tarea Roles
Crear un punto final Todos los roles siguientes:
Compute Administrador de red (roles/compute.networkAdmin),
Service Editor de directorios (roles/servicedirectory.editor) y
Administrador de DNS (roles/dns.admin)
Configurar Acceso privado de Google (opcional) Administrador de red de Compute (roles/compute.networkAdmin)

Antes de empezar

  • Consulta Información sobre la conexión a las APIs de Google mediante endpoints para obtener más información, como la configuración de DNS y las limitaciones.

  • Private Service Connect no habilita ninguna API automáticamente. Debes habilitar las APIs de Google que quieras usar por separado en la página APIs y servicios de la Google Cloud consola.

  • Debes habilitar la API Compute Engine en tu proyecto.

  • Debes habilitar la API Service Directory en tu proyecto.

  • Debes habilitar la API Cloud DNS en tu proyecto.

  • Debes elegir una dirección IP que se usará en el endpoint. Para obtener información sobre las direcciones IP que puedes usar, consulta los requisitos de las direcciones IP.

  • Las reglas de cortafuegos de salida deben permitir el tráfico al endpoint. La configuración predeterminada del cortafuegos de una red de VPC permite este tráfico, ya que contiene una regla de salida implícita. Comprueba que no hayas creado una regla de salida con una prioridad más alta que bloquee el tráfico.

  • Las instancias de máquina virtual (VM) a las que no se les ha asignado una dirección IP externa deben usar una subred con la opción Acceso privado de Google habilitada para acceder a las APIs y los servicios de Google mediante un endpoint.

    Una VM con una dirección IP externa puede acceder a las APIs y los servicios de Google mediante endpoints, aunque Acceso privado de Google esté inhabilitado en su subred. La conectividad con el endpoint se mantiene en la red de Google.

  • Si tu red de VPC no contiene ningún endpoint, comprueba si existe una zona privada de Cloud DNS para p.googleapis.com. Si la zona existe, elimínela antes de crear el endpoint. Si no lo eliminas, no se podrá crear la zona DNS de Directorio de servicios que se usa para Private Service Connect. Para obtener más información, consulta la sección Solución de problemas.

  • No se puede acceder a los endpoints desde redes de VPC emparejadas.

Habilitar el acceso privado de Google en una subred

Las VMs que no tengan asignada una dirección IP externa deben conectarse a una subred con el acceso privado de Google habilitado para acceder a las APIs y los servicios de Google mediante un endpoint.

Si la VM tiene más de una interfaz, conecta la interfaz que esté configurada con una ruta predeterminada (normalmente, nic0).

La dirección IP de origen de los paquetes enviados desde la VM debe coincidir con la dirección IPv4 interna principal de la interfaz de la VM o con una dirección IPv4 interna de un intervalo de IPs de alias.

Para habilitar Acceso privado de Google en una subred, sigue estos pasos.

Consola

  1. En la Google Cloud consola, ve a la página Redes de VPC.

    Ir a redes de VPC

  2. Haga clic en el nombre de la red que contiene la subred en la que debe habilitar Acceso privado de Google.

  3. Haz clic en el nombre de la subred. Se mostrará la página Detalles de la subred.

  4. Haz clic en Editar.

  5. En la sección Acceso privado de Google, selecciona Activado.

  6. Haz clic en Guardar.

gcloud

  1. Determina el nombre y la región de la subred. Para enumerar las subredes de una red concreta, usa el siguiente comando:

    gcloud compute networks subnets list --filter=NETWORK_NAME
    
  2. Ejecuta el siguiente comando para habilitar el acceso privado de Google:

    gcloud compute networks subnets update SUBNET_NAME \
    --region=REGION \
    --enable-private-ip-google-access
    
  3. Verifica que la función Acceso privado de Google esté habilitada ejecutando este comando:

    gcloud compute networks subnets describe SUBNET_NAME \
    --region=REGION \
    --format="get(privateIpGoogleAccess)"
    

Haz los cambios siguientes:

  • SUBNET_NAME: el nombre de la subred
  • REGION: la región de la subred
  • NETWORK_NAME: el nombre de la red de VPC que contiene la subred.

Terraform

Puedes usar el recurso de Terraform para habilitar el acceso privado de Google en una subred.

resource "google_compute_network" "network" {
  project                 = var.project # Replace this with your project ID in quotes
  name                    = "tf-test"
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "vpc_subnetwork" {
  project                  = google_compute_network.network.project
  name                     = "test-subnetwork"
  ip_cidr_range            = "10.2.0.0/16"
  region                   = "us-central1"
  network                  = google_compute_network.network.id
  private_ip_google_access = true
}

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Crear un punto final

Una vez que hayas elegido una dirección IP que cumpla los requisitos, podrás crear un endpoint.

Un endpoint se conecta a las APIs y los servicios de Google mediante una regla de reenvío global. Cada regla de reenvío se tiene en cuenta en la cuota por red de VPC de Private Service Connect.

No puedes actualizar un endpoint de las APIs y los servicios de Google después de crearlo. Si necesitas actualizar un endpoint de las APIs y los servicios de Google, elimínalo y crea uno nuevo.

Consola

  1. En la Google Cloud consola, ve a la página Private Service Connect.

    Ir a Private Service Connect

  2. Haz clic en la pestaña Puntos finales conectados.

  3. Haz clic en Conectar punto final.

  4. En Destino, selecciona el paquete de APIs de destino que quieras usar:

    • Todas las APIs de Google
    • VPC-SC
  5. En Nombre del endpoint, escribe el nombre del endpoint.

  6. Selecciona una red para el endpoint.

  7. Selecciona una dirección IP para el endpoint.

    La dirección IP debe cumplir estos requisitos.

    Si necesitas una dirección IP nueva, puedes crearla:

    1. Haz clic en Crear dirección IP.
    2. Escribe un nombre y una descripción para la dirección IP.
    3. Introduce la dirección IP que quieras usar y haz clic en Guardar .
  8. Si aún no se ha configurado una región de Service Directory para esta red VPC, selecciona la región que quieras usar.

    Todos los endpoints que se usan para acceder a las APIs y los servicios de Google en una red de VPC determinada usan la misma región de Service Directory.

  9. Si aún no se ha configurado un espacio de nombres de Service Directory para esta red VPC, configura el espacio de nombres que quieras usar:

    • Para usar un espacio de nombres asignado automáticamente, haz clic en el menú desplegable Espacio de nombres y selecciona el espacio de nombres asignado automáticamente.

    • Para seleccionar un espacio de nombres que ya se esté usando en otra red, haz clic en el menú desplegable Espacio de nombres y selecciona un espacio de nombres de la lista. En la lista se muestran todos los espacios de nombres del proyecto. Debes seleccionar un espacio de nombres que se use únicamente para los endpoints que se utilicen para acceder a las APIs de Google.

    • Para crear un espacio de nombres, haz clic en el menú desplegable Espacio de nombres y, a continuación, en Crear espacio de nombres. Introduce el espacio de nombres y haz clic en Crear.

    Todos los endpoints que usas para acceder a las APIs y los servicios de Google en una red VPC determinada usan el mismo espacio de nombres de Service Directory.

  10. Haz clic en Añadir endpoint.

gcloud

  1. Reserva una dirección IP interna global para asignarla al endpoint.

    gcloud compute addresses create ADDRESS_NAME \
      --global \
      --purpose=PRIVATE_SERVICE_CONNECT \
      --addresses=ENDPOINT_IP \
      --network=NETWORK_NAME
    

    Haz los cambios siguientes:

    • ADDRESS_NAME: el nombre que se asignará a la dirección IP reservada.

    • ENDPOINT_IP: la dirección IP que se va a reservar para el endpoint.

      La dirección IP debe cumplir estos requisitos.

    • NETWORK_NAME: nombre de la red de VPC del endpoint.

  2. Crea una regla de reenvío para conectar el punto final a las APIs y los servicios de Google.

    gcloud compute forwarding-rules create ENDPOINT_NAME \
      --global \
      --network=NETWORK_NAME \
      --address=ADDRESS_NAME \
      --target-google-apis-bundle=API_BUNDLE \
      [ --service-directory-registration=REGION_NAMESPACE_URI ]
    

    Haz los cambios siguientes:

    • ENDPOINT_NAME: el nombre que se asignará al endpoint. El nombre debe ser una cadena de entre 1 y 20 caracteres que solo contenga letras minúsculas y números. El nombre debe empezar por una letra.

    • NETWORK_NAME: nombre de la red de VPC del endpoint.

    • ADDRESS_NAME: el nombre de la dirección reservada en la red asociada.

    • API_BUNDLE: el paquete de APIs que se va a poner a disposición mediante el endpoint. Consulta la lista de APIs admitidas.

      • Usa all-apis para dar acceso a todas las APIs admitidas.

      • Usa vpc-sc para restringir el acceso a las APIs de Google que admiten Controles de Servicio de VPC.

    • REGION_NAMESPACE_URI: el URI de la región o el espacio de nombres del Directorio de servicios que quieras usar. Este URI debe hacer referencia al mismo proyecto en el que estás creando el endpoint.

      • Solo puedes definir una región con projects/PROJECT_NAME/locations/REGION.

      • Puedes definir una región y un espacio de nombres con projects/PROJECT_NAME/locations/REGION/namespaces/NAMESPACE.

      Si omite --service-directory-registration por completo o define una región sin un espacio de nombres, ocurrirá lo siguiente:

      • Si ya se ha configurado una región o un espacio de nombres para esta red de VPC, se usarán esos valores predeterminados.

      • Si no se configura ninguna región, se asigna el valor us-central1. Si no se configura ningún espacio de nombres, se asignará uno generado por el sistema.

API

  1. Reserva una dirección IP interna global para asignarla al endpoint.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses
    
    {
    "name": ADDRESS_NAME,
    "address": ENDPOINT_IP,
    "addressType": "INTERNAL",
    "purpose": PRIVATE_SERVICE_CONNECT,
    "network": NETWORK_URL
    }
    

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto.

    • ADDRESS_NAME: el nombre que se asignará a la dirección IP reservada.

    • ENDPOINT_IP: la dirección IP que se va a reservar para el endpoint.

      La dirección IP debe cumplir estos requisitos.

    • NETWORK_URL: la red de VPC del punto final. Usa el método network.list o gcloud compute networks list --uri para encontrar las URLs de tus cadenas.

  2. Crea una regla de reenvío para conectar el punto final a las APIs y los servicios de Google.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules
    {
     "IPAddress": ADDRESS_URL,
     "network": NETWORK_URL,
     "name": ENDPOINT_NAME,
     "target": API_BUNDLE,
     "serviceDirectoryRegistrations : [
       {
         "service_directory_region": REGION,
         "namespace": "NAMESPACE"
    
       }
     ],
    }
    

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto.

    • ENDPOINT_NAME: el nombre que se asignará al endpoint. El nombre debe ser una cadena de entre 1 y 20 caracteres que solo contenga letras minúsculas y números. El nombre debe empezar por una letra.

    • NETWORK_URL: la red de VPC del punto final. Usa el método network.list o gcloud compute networks list --uri para encontrar las URLs de tus cadenas.

    • ADDRESS_URL: URL de la dirección reservada en la red asociada. Usa el método globalAddresses.list o gcloud compute addresses list --uri para encontrar las URLs de tus direcciones reservadas.

    • API_BUNDLE: el paquete de APIs que se va a poner a disposición mediante el endpoint. Consulta la lista de APIs admitidas.

      • Usa all-apis para dar acceso a todas las APIs admitidas.

      • Usa vpc-sc para restringir el acceso a las APIs de Google que admiten Controles de Servicio de VPC.

    • REGION: la región de Directorio de servicios que quieras usar. Por ejemplo, us-central1. Si omite REGION y ya se ha configurado una región para esta red VPC, se usará esa región. Si no se configura ninguna región, se asigna el valor us-central1.

    • NAMESPACE: nombre del espacio de nombres del Directorio de servicios que quieras usar. Si omites NAMESPACE y ya se ha configurado un espacio de nombres para esta red de VPC, se usará ese espacio de nombres. Si no se configura ningún espacio de nombres, se asigna uno generado por el sistema.

Terraform

Puedes usar los siguientes recursos de Terraform para crear un endpoint:

resource "google_compute_global_address" "default" {
  project      = google_compute_network.network.project
  name         = "global-psconnect-ip"
  address_type = "INTERNAL"
  purpose      = "PRIVATE_SERVICE_CONNECT"
  network      = google_compute_network.network.id
  address      = "10.3.0.5"
}
resource "google_compute_global_forwarding_rule" "default" {
  project               = google_compute_network.network.project
  name                  = "globalrule"
  target                = "all-apis"
  network               = google_compute_network.network.id
  ip_address            = google_compute_global_address.default.id
  load_balancing_scheme = ""
}

Verificar que el endpoint funciona

Crea una instancia de VM en la red de VPC en la que esté configurado Private Service Connect. Ejecuta el siguiente comando en la VM para verificar que el endpoint de Private Service Connect funciona. Los endpoints no responden a las solicitudes de ping (ICMP).

curl -v ENDPOINT_IP/generate_204

Sustituye ENDPOINT_IP por la dirección IP del endpoint.

Si el endpoint funciona, verás un código de respuesta HTTP 204.

Permiso para mostrar puntos finales.

Puedes enumerar todos los endpoints configurados.

Consola

  1. En la Google Cloud consola, ve a la página Private Service Connect.

    Ir a Private Service Connect

  2. Haz clic en la pestaña Puntos finales conectados.

    Se muestran los endpoints.

gcloud

gcloud compute forwarding-rules list  \
--filter target="(all-apis OR vpc-sc)" --global

El resultado debería ser similar al siguiente:

NAME  REGION  IP_ADDRESS  IP_PROTOCOL  TARGET
RULE          IP          TCP          all-apis

Obtener información sobre un endpoint

Puede ver todos los detalles de configuración de un endpoint.

Consola

  1. En la Google Cloud consola, ve a la página Private Service Connect.

    Ir a Private Service Connect

  2. Haz clic en la pestaña Puntos finales conectados.

    Se muestran los endpoints.

  3. Haz clic en el endpoint del que quieras ver los detalles.

gcloud

gcloud compute forwarding-rules describe \
    ENDPOINT_NAME --global

Etiquetar un endpoint

Puedes gestionar las etiquetas de los endpoints. Para obtener más información, consulta el artículo sobre etiquetar recursos.

Eliminar un punto final

Puede eliminar un endpoint.

Consola

  1. En la Google Cloud consola, ve a la página Private Service Connect.

    Ir a Private Service Connect

  2. Haz clic en la pestaña Puntos finales conectados.

  3. Selecciona el endpoint que quieras eliminar y haz clic en Eliminar.

gcloud

    gcloud compute forwarding-rules delete \
        ENDPOINT_NAME --global

Sustituye ENDPOINT_NAME por el nombre del endpoint que quieras eliminar.

Usar un endpoint

Para usar un endpoint, debes enviar solicitudes a un nombre de host DNS que se resuelva en la dirección IP del endpoint.

  • Puedes usar los nombres de DNS p.googleapis.com creados automáticamente si puedes configurar tus clientes para que usen un endpoint personalizado y si se crean registros de DNS p.googleapis.com para las APIs y los servicios que quieras usar. Para obtener más información, consulta el artículo Usar nombres de DNS p.googleapis.com.

    Por ejemplo, si el nombre de tu endpoint es xyz, se crearán registros DNS para storage-xyz.p.googleapis.com, compute-xyz.p.googleapis.com y otras APIs de uso habitual en el paquete de APIs.

  • Puedes crear registros DNS con los nombres de DNS predeterminados si utilizas un cliente que no se ha configurado para usar un endpoint personalizado o si no existe un registro DNS p.googleapis.com para el servicio que quieres usar. Para obtener más información, consulta el artículo Crear registros DNS con nombres DNS predeterminados.

    Por ejemplo, crea registros DNS para storage.googleapis.com, compute.googleapis.com o *.gke.goog.

Usar nombres de p.googleapis.com DNS

Cuando creas un endpoint, Directory de servicios crea registros DNS para las APIs y los servicios que se usan con frecuencia y que están disponibles mediante el endpoint. Los registros DNS solo se crean para las APIs y los servicios que tienen nombres DNS predeterminados que terminan en googleapis.com, y solo para un subconjunto de esas APIs y servicios.

Los registros DNS se crean en una p.googleapis.comzona privada. Los registros apuntan a la dirección IP del endpoint y usan este formato: SERVICE-ENDPOINT.p.googleapis.com

Por ejemplo, si el nombre de tu endpoint es xyz, se crearán registros DNS para storage-xyz.p.googleapis.com, compute-xyz.p.googleapis.com y otras APIs compatibles.

Los clientes que se pueden configurar para usar un endpoint personalizado pueden usar los nombres de DNS p.googleapis.com para enviar solicitudes a un endpoint.

Consulta la documentación de tu cliente o biblioteca de cliente para obtener información sobre cómo configurarlo para que use endpoints personalizados. Por ejemplo:

  • Python: puedes configurar api_endpoint en Client options.

  • Ir: puedes configurar WithEndpoint en ClientOptions.

  • .NET: puedes configurar Endpoint en la clase de compilación del cliente.

  • gcloud puedes configurar api_endpoint_overrides en la CLI de gcloud.

Crear registros DNS con nombres DNS predeterminados

En las siguientes circunstancias, debes crear registros DNS para dirigir los nombres de DNS predeterminados de las APIs y los servicios a tu endpoint:

  • Tu cliente o aplicación no se puede configurar para usar un nombre de DNS p.googleapis.com.

  • Necesitas acceder a un servicio compatible, pero no se ha creado automáticamente un nombre DNS p.googleapis.com para ese servicio.

Para crear registros DNS que apunten a tu endpoint de Private Service Connect, sigue estas instrucciones:

  1. Crea una zona de DNS para el dominio que necesites usar (por ejemplo, googleapis.com o gcr.io). Para ello, te recomendamos que crees una zona privada de Cloud DNS.

  2. En esta zona DNS:

    1. Crea un registro A para el propio nombre de dominio (zona); por ejemplo, googleapis.com o gcr.io. Dirige este registro A a la dirección IP del endpoint. Si usas Cloud DNS, consulta cómo añadir un registro.

    2. Crea un registro CNAME para todos los nombres de host posibles del dominio adicional. Para ello, usa un asterisco y un punto seguido del nombre del dominio (zona). Por ejemplo, *.googleapis.com o *.gcr.io. Dirige este registro CNAME al registro A de la misma zona. Por ejemplo, del punto *.googleapis.com al googleapis.com o del *.gcr.io al gcr.io.

Acceder al endpoint desde hosts locales

Si tu red local está conectada a una red de VPC, puedes usar Private Service Connect para acceder a las APIs y los servicios de Google desde hosts locales mediante la dirección IP interna del endpoint.

  • Tu red local debe estar conectada a una red VPC mediante túneles de Cloud VPN o vinculaciones de VLAN para Cloud Interconnect.

  • El endpoint debe estar en la red de VPC conectada a tu red local.

  • La red local debe tener las rutas adecuadas para el endpoint. Configura un anuncio de ruta personalizada de Cloud Router para anunciar rutas del endpoint en la sesión BGP que gestiona las rutas del túnel de Cloud VPN o de la vinculación de VLAN.

    • Si tu red local usa el enrutamiento multipath de igual coste (ECMP) para distribuir el tráfico a los endpoints de Private Service Connect, debes asegurarte de que todos los paquetes de una misma conexión TCP se enruten a través del mismo túnel de Cloud VPN o de la misma vinculación de VLAN. Si los paquetes de una conexión TCP establecida se enrutan a través de varias rutas, es posible que experimentes restablecimientos TCP (RSTs) intermitentes. Para evitar que se produzcan reinicios, configura tus routers peer on-premise para que mantengan destinos de salto siguientes coherentes.
  • Debes configurar los sistemas locales para que puedan hacer consultas a tus zonas DNS privadas.

    Si has implementado las zonas DNS privadas con Cloud DNS, sigue estos pasos:

Solución de problemas

En las siguientes secciones se incluye información sobre cómo resolver problemas con los puntos finales de Private Service Connect que se usan para acceder a las APIs de Google.

Se produce un error al crear una zona de DNS privada

Cuando creas un endpoint, se crea una zona DNS de Directorio de servicios. La creación de zonas puede fallar por los siguientes motivos:

  • No has habilitado la API Cloud DNS en tu proyecto.

  • No tienes los permisos necesarios para crear una zona DNS de Service Directory.

  • Ya existe una zona DNS con el mismo nombre de zona en esta red de VPC.

  • Ya existe una zona DNS para p.googleapis.com en esta red de VPC.

Es posible que haya zonas en conflicto porque se haya producido un error al eliminar una zona anterior.

Para crear la zona DNS de Service Directory, sigue estos pasos:

  1. Comprueba que la API Cloud DNS esté habilitada en tu proyecto.

  2. Verifica que tienes los permisos necesarios para crear la zona DNS de Directorio de servicios:

    • dns.managedZones.create
    • servicedirectory.namespaces.associatePrivateZone
  3. Elimina la zona DNS.

  4. Crea una zona DNS de Directorio de servicios respaldada por el espacio de nombres de Directorio de servicios asociado a tu endpoint.

    Usa los siguientes valores al crear la zona:

    • Nombre de la zona: usa el mismo nombre de zona que el sistema usó durante el intento de creación fallido. El mensaje de error muestra el nombre de la zona que se ha utilizado.

    • Nombre de DNS: p.googleapis.com. (incluye el punto final).

    • Espacio de nombres de Directory de servicios: busca el espacio de nombres de Directory de servicios del endpoint de Private Service Connect que has creado y úsalo al crear la zona DNS de Directory de servicios.

    El espacio de nombres del Directorio de servicios tiene el siguiente formato: goog-psc-NETWORK_NAME-NETWORK_ID.

No se puede eliminar una zona de DNS privada

Cuando eliminas el último endpoint de una red de VPC, se elimina la configuración de Directorio de servicios asociada, incluida la zona DNS.

La eliminación puede fallar por los siguientes motivos:

  • No tienes los permisos necesarios para eliminar la zona DNS.

  • La zona contiene entradas DNS definidas por el usuario que no ha creado Directorio de servicios.

Para solucionar este problema, sigue estos pasos:

  1. Verifica que tienes el permiso dns.managedZones.delete. Para obtener más información, consulta Control de acceso en la documentación de Cloud DNS.

  2. Elimina la zona DNS.