Configurar acceso privado a servicios

En esta página se describe cómo configurar el acceso privado a los servicios en su red de VPC.

El acceso a servicios privados se implementa como una conexión de emparejamiento de VPC entre tu red de VPC y la red de VPC subyacente Google Cloud en la que reside tu instancia de Cloud SQL. La conexión privada permite que las instancias de VM de tu red de VPC y los servicios a los que accedas se comuniquen exclusivamente mediante direcciones IP internas. Las instancias de VM no necesitan acceso a Internet ni direcciones IP externas para acceder a los servicios disponibles a través del acceso a servicios privados.

Antes de empezar

Cloud SQL requiere acceso a servicios privados para cada red de VPC que se utilice en conexiones de IP privada. Para gestionar una conexión de acceso de servicios privados, el usuario debe tener los siguientes permisos de gestión de identidades y accesos:

  • compute.networks.list
  • compute.addresses.create
  • compute.addresses.list
  • servicenetworking.services.addPeering

Si no tienes estos permisos, pueden aparecer errores de permisos insuficientes.

Si utilizas una red de VPC compartida, también debes hacer lo siguiente:

  • Añade tu usuario al proyecto host.
  • Asigna los mismos cuatro permisos a ese usuario en el proyecto host.
  • Concede el permiso de IAM compute.globalAddresses.list al usuario.

Configurar el acceso privado a servicios para Cloud SQL

El proceso de configuración del acceso privado a servicios se divide en dos partes:

  • Seleccionar un intervalo de direcciones IP ya creado o asignar uno nuevo.

    También puede permitir que Google asigne el intervalo. En este caso, Google asignará automáticamente un intervalo de IPs cuyo prefijo tenga una longitud de /20 y le pondrá el nombre default-ip-range.

    Si vas a crear instancias en varias regiones o para diferentes tipos de bases de datos, debes tener un intervalo /24 de direcciones IP disponible como mínimo para cada región o tipo de base de datos. Esto incluye otras aplicaciones, como Filestore o Memorystore. En el caso de una nueva región o un nuevo tipo de base de datos, Cloud SQL debe tener un intervalo /24 gratuito.

  • Crear una conexión privada desde tu red de VPC a la red del productor de servicios subyacente.

Asignar un intervalo de direcciones IP

Consola

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

    Ir a redes de VPC

  2. Selecciona la red de VPC que quieras usar.
  3. Selecciona la pestaña Conexión de servicio privada.
  4. Seleccione la pestaña Intervalos de direcciones IP asignados para los servicios.
  5. Haz clic en Asignar intervalo de IPs.
  6. En Nombre del intervalo asignado, especifica google-managed-services-VPC_NETWORK_NAME, donde VPC_NETWORK_NAME es el nombre de la red VPC a la que te vas a conectar (por ejemplo, google-managed-services-default). La Descripción es opcional.
  7. Selecciona la opción Personalizado y, a continuación, introduce el intervalo de direcciones IP que quieras asignar en notación CIDR.
  8. Haga clic en Asignar para crear el intervalo asignado.

gcloud

Elige una de estas opciones:

  • Para especificar un intervalo de direcciones y una longitud de prefijo (máscara de subred), usa las marcas addresses y prefix-length. Por ejemplo, para asignar el bloque CIDR 192.168.0.0/16, especifica 192.168.0.0 para la dirección y 16 para la longitud del prefijo.
  •         gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \
            --global \
            --purpose=VPC_PEERING \
            --addresses=192.168.0.0 \
            --prefix-length=16 \
            --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
            
  • Para especificar solo la longitud del prefijo (máscara de subred), usa la marca prefix-length. Si no especificas el intervalo de direcciones, Google Cloud se seleccionará automáticamente un intervalo de direcciones sin usar en tu red de VPC. En el siguiente ejemplo se selecciona un intervalo de direcciones IP sin usar con una longitud de prefijo de 16 bits.
  •         gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \
            --global \
            --purpose=VPC_PEERING \
            --prefix-length=16 \
            --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
            

Sustituye VPC_NETWORK_NAME por el nombre de tu red de VPC, como my-vpc-network.

En el siguiente ejemplo, se asigna un intervalo de IPs que permite que los recursos de la red de VPC my-vpc-network se conecten a instancias de Cloud SQL mediante una IP privada.

    gcloud compute addresses create google-managed-services-my-vpc-network \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=16 \
    --network=projects/myprojectid/global/networks/myvpcnetwork \
    --project=my-project
    

Terraform

Para asignar un intervalo de direcciones IP, usa un recurso de Terraform.

resource "google_compute_global_address" "private_ip_address" {
  name          = "private-ip-address"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16
  network       = google_compute_network.peering_network.id
}

Aplica los cambios

Para aplicar la configuración de Terraform en un proyecto, sigue los pasos que se indican en las siguientes secciones. Google Cloud

Preparar Cloud Shell

  1. Abre Cloud Shell.
  2. Define el Google Cloud proyecto Google Cloud predeterminado en el que quieras aplicar tus configuraciones de Terraform.

    Solo tiene que ejecutar este comando una vez por proyecto y puede hacerlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Las variables de entorno se anulan si defines valores explícitos en el archivo de configuración de Terraform.

Preparar el directorio

Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

  1. En Cloud Shell, crea un directorio y un archivo nuevo en ese directorio. El nombre del archivo debe tener la extensión .tf. Por ejemplo, main.tf. En este tutorial, nos referiremos al archivo como main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si estás siguiendo un tutorial, puedes copiar el código de ejemplo de cada sección o paso.

    Copia el código de ejemplo en el archivo main.tf que acabas de crear.

    También puedes copiar el código de GitHub. Se recomienda cuando el fragmento de Terraform forma parte de una solución integral.

  3. Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo tienes que hacerlo una vez por directorio.
    terraform init

    Si quieres usar la versión más reciente del proveedor de Google, incluye la opción -upgrade:

    terraform init -upgrade

Aplica los cambios

  1. Revisa la configuración y comprueba que los recursos que va a crear o actualizar Terraform se ajustan a tus expectativas:
    terraform plan

    Haga las correcciones necesarias en la configuración.

  2. Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo yes en la petición:
    terraform apply

    Espera hasta que Terraform muestre el mensaje "Apply complete!".

  3. Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola, ve a tus recursos en la interfaz de usuario para asegurarte de que Terraform los ha creado o actualizado.

Eliminar los cambios

Para quitar los recursos que se hayan aplicado anteriormente con tu configuración de Terraform, ejecuta el siguiente comando e introduce yes en la petición:

terraform destroy

Crear conexión privada

Consola

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

    Ir a redes de VPC

  2. Selecciona la red de VPC que quieras usar.
  3. Selecciona la pestaña Conexión de servicio privada.
  4. Selecciona la pestaña Conexiones privadas a los servicios.
  5. Haz clic en Crear conexión para crear una conexión privada entre tu red y un productor de servicios.
  6. En Asignación realizada, selecciona uno o varios rangos asignados que no estén usando otros productores de servicios.
  7. Haz clic en Conectar para crear la conexión.

gcloud

  1. Crea una conexión privada.

    gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-VPC_NETWORK_NAME \
    --network=VPC_NETWORK_NAME \
    --project=PROJECT_ID

    El comando inicia una operación de larga duración de la instancia de Cloud SQL y devuelve un ID de operación.

  2. Comprueba si la operación se ha realizado correctamente.

    gcloud services vpc-peerings operations describe \
    --name=OPERATION_ID

Puedes especificar más de un intervalo asignado al crear una conexión privada. Por ejemplo, si se ha agotado un intervalo, puedes asignar intervalos adicionales. El servicio usa las direcciones IP de todos los intervalos proporcionados en el orden que hayas especificado.

Terraform

Para crear una conexión privada, usa un recurso de Terraform.

resource "google_service_networking_connection" "default" {
  network                 = google_compute_network.peering_network.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}

Se concede el rol servicenetworking.serviceAgent a una cuenta de servicio con el formato service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com mientras se crea la conexión privada, ya que la cuenta se aprovisiona justo a tiempo.

Si aparece un error sobre el permiso compute.globalAddresses.list o el permiso compute.projects.get del proyecto, ejecuta este comando gcloud:

gcloud projects add-iam-policy-binding HOST_PROJECT_NAME \
    --member=serviceAccount:service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com \
    --role=roles/servicenetworking.serviceAgent

Cambiar la configuración de acceso privado a servicios

Puedes cambiar el intervalo de direcciones asignado de una conexión de servicio privada sin modificar ninguna instancia de Cloud SQL. Para cambiar la dirección IP privada de una instancia de Cloud SQL, sigue estos pasos.

Para cambiar el intervalo de direcciones asignado, sigue estos pasos:

Consola

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

    Ir a redes de VPC

  2. Selecciona la red de VPC que quieras usar.
  3. Selecciona la pestaña Conexión de servicio privada.
  4. Seleccione la pestaña Intervalos de direcciones IP asignados para los servicios.
  5. Selecciona el nombre del intervalo que quieras eliminar.

  6. Haz clic en Retirar.

  7. Haz clic en Asignar intervalo de IPs.

  8. Crea un intervalo con el mismo nombre y el nuevo intervalo.

    El nombre es importante porque la conexión privada ya se ha establecido con ese nombre de dirección.

gcloud services vpc-peerings update \
--network=VPC_NETWORK_NAME \
--ranges=ALLOCATED_RANGES \
--service=servicenetworking.googleapis.com \
--force

Cambiar la dirección IP privada de una instancia de Cloud SQL

Para cambiar la dirección IP privada de una instancia de Cloud SQL, mueve la instancia de su red original a una red VPC temporal. A continuación, cambia la configuración de acceso a servicios privados de la red original de la instancia y vuelve a mover la instancia de Cloud SQL a su red original.

Para cambiar a otra red de VPC, sigue todos los pasos del procedimiento que se indica a continuación, excepto el último (volver a mover la instancia). En este caso, la TEMPORARY_VPC_NETWORK_NAME es la nueva red de VPC. Además, elimina la conexión privada antigua. La conexión privada eliminada puede tardar unos días en desaparecer de laGoogle Cloud consola.

Si la instancia de Cloud SQL está alojada en una red de VPC compartida, las variables VPC_NETWORK_NAME que se usan en las siguientes instrucciones deben ser los nombres de las redes de VPC del proyecto host. Para especificar una red con una red de VPC compartida, usa la URL completa de la red. Por ejemplo, projects/HOST_PROJECT/global/networks/NETWORK_NAME.

Consola

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

    Ir a redes de VPC

  2. Crea una red de VPC temporal.
  3. Crea una asignación de IP en la red VPC temporal.
  4. Crea una conexión privada en la red de VPC temporal.
  5. Mueve la instancia de Cloud SQL a la red de VPC temporal.

    gcloud beta sql instances patch INSTANCE_ID \
      --project=PROJECT_ID \
      --network=projects/PROJECT_ID/global/networks/TEMPORARY_VPC_NETWORK_NAME \
      --no-assign-ip
  6. Cambia la configuración de acceso a servicios privados en la red original para añadir un nuevo intervalo asignado o eliminar los que ya haya.

  7. Vuelve a mover la instancia de Cloud SQL a la red VPC original.

    gcloud beta sql instances patch INSTANCE_ID \
      --project=PROJECT_ID \
      --network=projects/PROJECT_ID/global/networks/ORIGINAL_VPC_NETWORK_NAME \
      --no-assign-ip