Configura l'uscita VPC diretta per le funzioni di 2ª generazione
L'uscita VPC diretta consente di instradare il traffico dalla funzione Cloud Run Functions (2ª generazione.) direttamente alla rete VPC.
Limitazioni
- L'uscita VPC diretta non è disponibile per le funzioni di 1ª generazione.
- Non puoi utilizzare contemporaneamente i connettori di accesso VPC serverless e l'uscita VPC diretto. Per maggiori dettagli, consulta Confronto tra l'uscita VPC diretta e i connettori VPC.
Prima di iniziare
- Abilita l'API Cloud Functions.
- Installa Google Cloud CLI, quindi inizializzala eseguendo
gcloud init. Aggiorna i componenti di
gcloudalla versione 545.0.0 o successive:gcloud components update
Se non hai ancora una rete VPC nel tuo progetto, creane una.
(Facoltativo) Se la tua funzione deve accedere ad API e servizi Google utilizzando i relativi indirizzi IP interni, abilita l'accesso privato Google nella subnet che utilizzi per l'uscita VPC diretta.
Configurare le autorizzazioni IAM
Per autorizzare l'uscita VPC diretta, chiedi all'amministratore di concedere il ruolo Invoker Cloud Run (roles/run.invoker) al account di servizio della tua funzione.
Assicurati che Cloud Run abbia accesso alla rete VPC utilizzando uno dei seguenti metodi:
Ruolo service agent Cloud Run: per impostazione predefinita, il service agent Cloud Run dispone del ruolo service agent Cloud Run (
roles/run.serviceAgent) che contiene le autorizzazioni necessarie.Autorizzazioni personalizzate: per un controllo più granulare, concedi al service agent Cloud Run le seguenti autorizzazioni aggiuntive sul progetto:
compute.networks.getcompute.subnetworks.getcompute.subnetworks.usesul progetto o sulla subnet specificacompute.addresses.getcompute.addresses.listcompute.addresses.create(obbligatorio solo per le subnet a doppio stack con IPv6 esterno)compute.addresses.delete(obbligatorio solo per le subnet a doppio stack con IPv6 esterno)compute.addresses.createInternalcompute.addresses.deleteInternalcompute.regionOperations.get
Ruolo Utente di rete Compute: se non utilizzi il ruolo Service Agent Cloud Run predefinito o le autorizzazioni personalizzate, concedi il ruolo Utente di rete Compute (
roles/compute.networkUser) al account di servizio Service Agent Cloud Run. Le subnet con IPv6 esterno richiedono anche il ruolo Compute Public IP Admin (roles/compute.publicIpAdmin).Ad esempio, per concedere il ruolo Utente di rete Compute, esegui questo comando:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \ --role "roles/compute.networkUser"
Sostituisci quanto segue:
- PROJECT_ID: l'ID progetto.
- PROJECT_NUMBER: il numero del progetto in cui esegui il deployment della funzione Cloud Run.
Configura l'uscita VPC diretto
Configura l'uscita VPC diretto per le funzioni di 2ª generazione nuove o esistenti.
gcloud
Per configurare l'uscita VPC diretto quando esegui il deployment di una funzione, utilizza il comando
gcloud beta functions deploycon i flag per le impostazioni di rete.gcloud beta functions deploy FUNCTION_NAME \ --source . \ --runtime RUNTIME \ --trigger-http \ --region REGION \ --network=NETWORK \ --subnet=SUBNET \ --network-tags=NETWORK_TAG_NAMES \ --direct-vpc-egress=EGRESS_SETTINGSostituisci quanto segue:
- FUNCTION_NAME: il nome della funzione.
- RUNTIME: il runtime della funzione, ad esempio
nodejs20. - REGION: la regione in cui esegui il deployment della funzione.
- (Facoltativo) NETWORK con il nome della tua rete VPC. Specifica una rete VPC o una subnet oppure entrambe. Se specifichi solo una rete, la subnet utilizza lo stesso nome della rete.
- (Facoltativo) SUBNET con il nome della subnet. Specifica una rete VPC o una subnet oppure entrambe. Se specifichi solo una rete, la subnet utilizza lo stesso nome della rete. Puoi eseguire il deployment o l'esecuzione di più funzioni nella stessa subnet.
- (Facoltativo) NETWORK_TAG_NAMES con i nomi separati da virgole
dei tag di rete
che vuoi associare a una funzione. Ogni funzione può avere
tag di rete diversi, ad esempio
network-tag-2. - EGRESS_SETTING con un
valore di impostazione del traffico in uscita:
all: predefinito. Invia tutto il traffico in uscita attraverso la rete VPC.private-ranges-only: Invia solo il traffico agli indirizzi interni tramite la rete VPC.
(Facoltativo) Per rimuovere tutte le impostazioni di uscita VPC diretta da una funzione, esegui nuovamente il deployment della funzione con i flag
--clear-networke--clear-network-tags.
Terraform
Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.
Per configurare l'uscita VPC diretto, utilizza il provider Terraform google-beta.
Utilizzando l'esempio di uscita VPC diretto di Cloud Run Functions (2ª generazione.) come punto di partenza, aggiorna i seguenti campi:
service_config.network: il nome della tua rete VPC.service_config.subnetwork: il nome della tua subnet VPC.service_config.direct_vpc_egress: il traffico da inviare alla rete VPC.VPC_EGRESS_ALL_TRAFFICinvia tutto il traffico in uscita attraverso la rete VPC.VPC_EGRESS_PRIVATE_RANGES_ONLYinvia il traffico solo agli intervalli di indirizzi IP privati alla rete VPC.
Esempio: chiamare un servizio interno da una funzione
Questo esempio mostra come creare un servizio Cloud Run interno e poi chiamarlo da una funzione Cloud Run Functions (2ª generazione.) che utilizza l'uscita VPC diretto.
Crea il servizio di backend interno
Crea una nuova directory per il servizio di backend e passa a questa directory:
mkdir backend-service cd backend-serviceCrea un file
package.jsoncon il seguente contenuto:{ "name": "backend-service", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.18.1" } }Crea un file
index.jscon il seguente contenuto:const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send("hello world"); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, () => { console.log(`helloworld: listening on port ${port}`); });Esegui il deployment del servizio in Cloud Run con l'ingresso interno:
gcloud run deploy backend \ --source . \ --no-allow-unauthenticated \ --region=REGION \ --ingress internalSostituisci
REGIONcon la tua regione, ad esempious-west1.Salva l'URL del nuovo servizio. Ti servirà nella prossima sezione.
Crea ed esegui il deployment della funzione
Crea una nuova directory per la funzione e accedi alla directory:
cd .. mkdir dvpc-function cd dvpc-functionCrea un file
package.jsoncon il seguente contenuto:{ "name": "sample-http", "version": "0.0.1", "dependencies": { "axios": "0.21.1", "@google-cloud/functions-framework": "^3.0.0" } }Crea un file
index.jscon il seguente contenuto. Questo codice effettua una richiesta autenticata al servizio di backend interno.const axios = require('axios'); const functions = require('@google-cloud/functions-framework'); const callVPCService = async (req, res) => { const backendUrl = process.env.BACKEND_URL; if (!backendUrl) { console.error('BACKEND_URL environment variable not set.'); res.status(500).send('BACKEND_URL not configured.'); return; } try { const metadataServerURL = 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience='; const tokenUrl = metadataServerURL + backendUrl; const tokenResponse = await axios.get(tokenUrl, { headers: { 'Metadata-Flavor': 'Google', }, }); const token = tokenResponse.data; const response = await axios.get(backendUrl, { headers: { Authorization: `bearer ${token}`, }, }); res.status(200).send(`Response from backend: ${response.data}`); } catch (error) { console.error(`Error calling backend service: ${error.message}`); res.status(500).send(`Error calling backend: ${error.message}`); } }; functions.http('callVPCService', callVPCService);Esegui il deployment della funzione con il traffico in uscita VPC diretto configurato per instradare tutto il traffico alla tua rete VPC predefinita:
gcloud beta functions deploy my-2ndgen-function \ --source . \ --runtime nodejs20 \ --trigger-http \ --entry-point callVPCService \ --network=default \ --subnet=default \ --direct-vpc-egress=all \ --region=REGION \ --allow-unauthenticated \ --set-env-vars BACKEND_URL=BACKEND_URLSostituisci quanto segue:
REGION: la regione in cui hai eseguito il deployment del servizio di backend.BACKEND_URL: l'URL del servizio di backend che hai creato.
Dopo il deployment della funzione, richiamala visitando il relativo URL. La funzione chiama il servizio di backend interno e restituisce la relativa risposta.
Passaggi successivi
- Scopri di più sull'uscita VPC diretta e sull'allocazione IP.
- Consulta i suggerimenti per la risoluzione dei problemi.
- Confronta i metodi di uscita in Connessione a una rete VPC.
- Consulta il riferimento al comando
gcloud beta functions deploy.