Configura el acceso privado a los servicios

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

El acceso privado a los servicios se implementa como una conexión de intercambio de tráfico de VPCentre tu red de VPC y la red de VPC de los servicios de Google subyacente en la que reside la instancia de Cloud SQL. La conexión privada permite que las instancias de VM en la red de VPC y los servicios a los que accedes se comuniquen de forma exclusiva mediante direcciones IP internas. Las instancias de VM no necesitan acceso a Internet o direcciones IP externas para alcanzar los servicios que están disponibles a través del acceso privado a los servicios.

Antes de comenzar

Cloud SQL requiere acceso privado a servicios para cada red de VPC que se usa en conexiones IP privadas. Para administrar una conexión de acceso privado a servicios, el usuario debe tener los siguientes permisos de IAM:

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

Si no tienes estos permisos, puedes encontrar errores de permisos insuficientes.

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

  • Agrega tu usuario al proyecto host.
  • Asigna los mismos cuatro permisos a ese usuario en el proyecto host.
  • Otorga el permiso de IAM compute.globalAddresses.list al usuario.

Configura el acceso privado a servicios para Cloud SQL

El proceso de configuración del acceso privado a servicios se conforma por las siguientes partes:

  • Selecciona un rango de direcciones IP existente o asigna uno nuevo.

    También tienes la opción de permitir que Google asigne el rango por ti. En este caso, Google asignará un rango de IP automáticamente con una longitud de prefijo /20 y usará el nombre default-ip-range.

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

  • Creación de una conexión privada desde la red de VPC hacia la red del productor de servicios

Asigna un rango de direcciones IP

Console

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

    Ir a las redes de VPC

  2. Selecciona la red de VPC que deseas usar.
  3. Selecciona la pestaña Conexión privada a servicios.
  4. Selecciona la pestaña Rangos de IP asignados para los servicios.
  5. Haz clic en Asigna rangos de IP.
  6. Para el Nombre del rango asignado, especifica google-managed-services-VPC_NETWORK_NAME, en el que VPC_NETWORK_NAME es el nombre de la red de VPC que conectas (por ejemplo, google-managed-services-default). La Descripción es opcional.
  7. Selecciona la opción Personalizado y, luego, ingresa el rango de direcciones IP que se asignará, en notación CIDR.
  8. Haz clic en Asignar para crear un rango asignado.

gcloud

Realice una de las acciones siguientes:

  • Para especificar un rango de dirección y una longitud de prefijo (máscara de subred), usa las marcas addresses y prefix-length. Por ejemplo, a fin de asignar el bloque CIDR 192.168.0.0/16, especifica 192.168.0.0 para la dirección y 16 como la longitud de 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 una longitud de prefijo (máscara de subred), usa la marca prefix-length. Cuando omites el rango de direcciones, Google Cloud selecciona automáticamente un rango de direcciones sin usar en tu red de VPC. En el siguiente ejemplo, se selecciona un rango 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
            

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

En el siguiente ejemplo, se asigna un rango de IP que permite que los recursos en 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 rango 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
}

Aplique los cambios

Para aplicar tu configuración de Terraform en un proyecto de Google Cloud, completa los pasos de las siguientes secciones.

Prepara Cloud Shell

  1. Inicia Cloud Shell
  2. Establece el proyecto de Google Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.

    Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

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

Prepara 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 dentro de ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo, main.tf. En este instructivo, el archivo se denomina main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.

    Copia el código de muestra en el main.tf recién creado.

    De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

  3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
    terraform init

    De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

    terraform init -upgrade

Aplica los cambios

  1. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
    terraform plan

    Corrige la configuración según sea necesario.

  2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
    terraform apply

    Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

  3. Abre tu proyecto de Google Cloud para ver los resultados. En la consola de Google Cloud, navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

Borra los cambios

Quita los recursos que se aplicaron antes con tu configuración de Terraform mediante la ejecución del siguiente comando y, luego, ingresa yes cuando se te solicite:

terraform destroy

Crea una conexión privada

Console

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

    Ir a las redes de VPC

  2. Selecciona la red de VPC que deseas usar.
  3. Selecciona la pestaña Conexión privada a servicios.
  4. Selecciona la pestaña Conexiones privadas a servicios.
  5. Haz clic en Crear una conexión para crear una conexión privada entre tu red y un productor de servicios.
  6. Para la Asignación designada, selecciona uno o más rangos asignados existentes que no estén siendo usados por 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 instancia de Cloud SQL de larga duración y muestra un ID de operación.

  2. Verifica si la operación se realizó correctamente.

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

Puedes especificar más de un rango asignado cuando creas una conexión privada. Por ejemplo, si se agotó un rango, puedes asignar rangos adicionales. El servicio usa direcciones IP de todos los rangos proporcionados, en el orden que especificaste.

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

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

Si ves un error sobre el permiso compute.globalAddresses.list o el permiso compute.projects.get para el 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

Cambia la configuración del acceso privado a servicios

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

Para cambiar el rango de direcciones asignado, realiza las siguientes acciones:

Console

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

    Ir a las redes de VPC

  2. Selecciona la red de VPC que deseas usar.
  3. Selecciona la pestaña Conexión privada a servicios.
  4. Selecciona la pestaña Rangos de IP asignados a servicios.
  5. Selecciona el nombre del rango que deseas borrar.

  6. Haz clic en Liberar.

  7. Haz clic en Asigna rangos de IP.

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

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

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

Cambia la dirección IP privada de una instancia de Cloud SQL existente

Para cambiar la dirección IP privada de una instancia de Cloud SQL existente, mueve la instancia de su red original a una temporal. Luego, cambia la configuración de acceso privado a los servicios de la red original de la instancia y mueve la instancia de Cloud SQL a su red original.

Para pasar a una red de VPC diferente, sigue todos los pasos, excepto el último (traslada la instancia) en el siguiente procedimiento. En este caso, TEMPORARY_VPC_NETWORK_NAME es la nueva red de VPC. Además, borra la conexión privada anterior. La conexión privada borrada puede tardar unos días en desaparecer de la consola de Google Cloud.

Si la instancia de Cloud SQL se aloja 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.

Console

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

    Ir a las redes de VPC

  2. Crea una red de VPC temporal.
  3. Crea una asignación de IP en la red de 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 del acceso privado a servicios en la red original para agregar un rango asignado nuevo o borrar los existentes.

  7. Mueve la instancia de Cloud SQL a la red de 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