Panoramica del processo di compilazione

Questa guida mostra la panoramica del processo di compilazione per le funzioni di cui è stato eseguito il deployment utilizzando il comando gcloud functions. Per scoprire di più sul processo di compilazione per le funzioni di cui è stato eseguito il deployment utilizzando il comando gcloud run, consulta:

Quando esegui il deployment del codice sorgente della funzione utilizzando il comando gcloud functions deploy, il codice sorgente viene archiviato in un bucket Cloud Storage. Cloud Build compila quindi automaticamente il codice in un'immagine container ed esegue il push dell'immagine in un registro delle immagini.

Il processo di creazione dell'immagine è completamente automatico e non richiede alcun input diretto da parte tua. Tutte le risorse utilizzate nel processo di compilazione vengono eseguite nel tuo progetto utente.

L'esecuzione del processo di compilazione all'interno del progetto comporta quanto segue:

  • Hai accesso diretto a tutti i log di build.

  • Non esiste una quota preimpostata per il tempo di compilazione, anche se Cloud Build ha una propria quota di concorrenza predefinita.

  • Puoi visualizzare l'immagine container attuale e le immagini container di cui è stato eseguito il deployment in precedenza, archiviate in Artifact Registry.

  • Cloud Storage viene utilizzato nel tuo progetto per archiviare la directory del codice sorgente per le tue funzioni. Tieni presente quanto segue:

    • Se crei una funzione utilizzando Google Cloud CLI, viene creato un bucket di caricamento per contenere il codice sorgente. Il nome di questo bucket di caricamento è gcf-v2-uploads-PROJECT_NUMBER-REGION.cloudfunctions.appspot.com.
    • Dopo il caricamento, il codice della funzione viene archiviato in un bucket di origine separato:
      • Se utilizzi la crittografia predefinita, il nome di questo bucket è gcf-v2-sources-PROJECT_NUMBER-REGION.
      • Se proteggi i tuoi dati con CMEK, il nome del bucket è gcf-v2-sources-PROJECT_NUMBER-REGION-CMEK_KEY_HASH.
    • Sia il bucket di origine che quelli di caricamento non hanno un periodo di conservazione.

Caratteristiche del processo di compilazione

Il processo di compilazione ha le seguenti caratteristiche:

  • L'API Cloud Build deve essere abilitata per il tuo progetto.

    Per abilitare l'API manualmente, fai clic sul link precedente, seleziona il tuo progetto dal menu a discesa e segui le istruzioni per abilitare la UI.

  • Poiché l'intero processo di compilazione si svolge nel contesto del tuo progetto, il progetto è soggetto ai prezzi delle risorse incluse:

    • Per i prezzi di Cloud Build, consulta la pagina Prezzi. Questo processo utilizza le dimensioni dell'istanza predefinite di Cloud Build, poiché queste istanze vengono preparate in anticipo e sono disponibili più rapidamente. Cloud Build offre un livello gratuito: consulta il documento sui prezzi per ulteriori dettagli.

    • Per informazioni sui prezzi di Cloud Storage, consulta la pagina Prezzi. Cloud Storage offre un livello gratuito: consulta il documento sui prezzi per ulteriori dettagli.

    • Per i prezzi di Artifact Registry, consulta la pagina Prezzi.

  • Poiché il processo di compilazione è soggetto a fatturazione, il tuo progetto deve avere un account di fatturazione Cloud collegato.

Visualizza i log di build dell'immagine

Un vantaggio fondamentale dell'avere il processo di creazione dell'immagine nel tuo progetto utente è l'accesso ai log di build. Puoi utilizzare gcloud CLI o la console Google Cloud per accedere ai log, disponibili tramite Cloud Logging.

gcloud

  1. Esegui il deployment della funzione utilizzando il comando gcloud functions deploy.

  2. L'URL dei log viene mostrato come parte della risposta nella finestra del terminale. Ad esempio:

    Deploying function (may take a while - up to 2 minutes)...⠹
    **For Cloud Build Stackdriver Logs**, visit:
    https://console.cloud.google.com/logs/viewer?project=&advancedFilter=resource.type%
    3Dbuild%0Aresource.labels.build_id%3D38d5b662-2315-45dd-8aa2-
    380d50d4f5e8%0AlogName%3Dprojects%2F%
    2Flogs%2Fcloudbuild
    Deploying function (may take a while - up to 2 minutes)...done.

Console Google Cloud

Per visualizzare i log delle funzioni nella pagina Cloud Run:

  1. Vai a Cloud Run

  2. Fai clic sulla funzione scelta nell'elenco visualizzato.

  3. Fai clic sulla scheda LOG per visualizzare i log delle richieste e dei container per tutte le revisioni di questa funzione. Puoi filtrare in base al livello di gravità del log.

Registro delle immagini

Artifact Registry viene utilizzato per archiviare le immagini create dal codice sorgente della funzione. Le immagini sono archiviate in un repository denominato REGION-docker.pkg.dev/PROJECT_ID/gcf-artifacts che si trova nello stesso progetto in cui viene creata la funzione.

Per specificare un repository Artifact Registry autogestito, esegui questo comando:

gcloud functions deploy FUNCTION_NAME \
   --docker-repository=REPOSITORY \
   [FLAGS...]

Sostituisci quanto segue:

  • FUNCTION_NAME: il nome della funzione.
  • REPOSITORY: il nome completo del repository Artifact Registry, nel seguente formato: projects/PROJECT_NAME/locations/LOCATION/repositories/REPOSITORY.

Quando specifichi un repository Artifact Registry che si trova in un progetto o in una regione diversi, potresti dover prendere in considerazione configurazioni aggiuntive:

Configurazioni IAM:

  • Configurazioni IAM: assicurati che il service account di build sia autorizzato ad accedere in lettura e scrittura al REPOSITORY.
  • Configurazioni di rete: assicurati che il REPOSITORY di destinazione sia raggiungibile dalla configurazione del progetto corrente.
  • Configurazioni dei Controlli di servizio VPC: assicurati che il service account di build possa raggiungere il REPOSITORY di destinazione all'interno del perimetro VPC-SC.
  • Vincoli di residenza dei dati: se specifichi un REPOSITORY in una regione diversa da quella in cui si trova la tua funzione, i dati verranno trasferiti tra le regioni.

Proteggi la build con i pool privati

Per consentire alle tue funzioni di utilizzare le dipendenze (ad esempio i pacchetti npm), per impostazione predefinita Cloud Build ha accesso illimitato a internet durante il processo di compilazione. Se hai configurato un perimetro dei Controlli di servizio VPC (VPC SC) e vuoi limitare l'accesso della build solo alle dipendenze archiviate all'interno del perimetro, puoi utilizzare la funzionalità pool di worker privati di Cloud Build.

In generale, segui questi passaggi per configurare il tuo pool privato:

  1. Crea il tuo pool di worker privato. Consulta Crea e gestisci pool privati.
  2. Configura il perimetro dei Controlli di servizio VPC. Consulta Utilizzo dei Controlli di servizio VPC.

  3. Se il tuo pool di worker privato si trova in un progetto diverso dalla tua funzione, devi concedere al service account Service agent Cloud Functions (service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) il ruolo cloudbuild.workerPoolUser in modo che il servizio Cloud Build possa accedere al pool di worker.

    gcloud projects add-iam-policy-binding PRIVATE_POOL_PROJECT_ID \
        --member serviceAccount:service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
        --role roles/cloudbuild.workerPoolUser

    Sostituisci FUNCTION_PROJECT_NUMBER con il numero del progetto in cui viene eseguita la funzione e PRIVATE_POOL_PROJECT_ID con l'ID del progetto in cui si trova il pool di worker. Per saperne di più, consulta Esecuzione delle build in un pool privato.

  4. Esegui il deployment della funzione per la build utilizzando un pool privato:

    gcloud functions deploy FUNCTION_NAME \
       --runtime RUNTIME \
       --build-worker-pool PRIVATE_POOL_NAME
       [FLAGS...]

    Sostituisci FUNCTION_NAME con il nome della funzione, RUNTIME con il runtime che stai utilizzando e PRIVATE_POOL_NAME con il nome del pool.

Per interrompere l'utilizzo di un determinato pool privato e utilizzare invece il pool Cloud Build predefinito, utilizza il flag --clear-build-worker-pool durante il nuovo deployment.

gcloud functions deploy FUNCTION_NAME \
   --runtime RUNTIME \
   --clear-build-worker-pool
   [FLAGS...]

Sostituisci FUNCTION_NAME con il nome della funzione e RUNTIME con il runtime che stai utilizzando.

Proteggi la build con un service account personalizzato

Il codice sorgente della funzione viene inviato a Cloud Build per essere containerizzato. La funzione containerizzata viene archiviata in Artifact Registry e ne viene eseguito il deployment in Cloud Run come servizio. Cloud Run Functions utilizza Cloud Build durante la creazione e il deployment della funzione Cloud Run. Per impostazione predefinita, Cloud Run Functions utilizza il service account Cloud Build predefinito come entità durante l'esecuzione della build. A partire da luglio 2024, è cambiato il comportamento predefinito di utilizzo dei service account di Cloud Build nei nuovi progetti. A seguito di questa modifica, i nuovi progetti che eseguono il deployment di funzioni per la prima volta potrebbero utilizzare un service account Cloud Build predefinito con autorizzazioni insufficienti per la creazione di una funzione.

Per i progetti Google Cloud creati prima di luglio 2024, Cloud Build utilizza il service account Cloud Build legacy. Questo service account era progettato per aiutare gli utenti a eseguire un'ampia gamma di casi d'uso che potrebbero essere troppo permissivi per le esigenze del tuo progetto. Se vuoi spostare i progetti esistenti da questo service account, puoi seguire questi passaggi per proteggere ulteriormente l'ambiente di build delle funzioni:

Impedisci l'utilizzo del service account Cloud Build legacy per la build

Puoi verificare se il tuo progetto utilizza il service account Cloud Build legacy esaminando i dettagli della build della tua funzione. Il service account di build predefinito ha il seguente formato:

PROJECT_NUMBER@cloudbuild.gserviceaccount.com.

Puoi disattivare forzatamente l'utilizzo di questo service account impostando il vincolo della policy dell'organizzazione cloudbuild.useBuildServiceAccount su Not Enforced. In alternativa, la rimozione di tutti i ruoli concessi limiterà la sua capacità di accedere alle risorse Google Cloud.

Impedisci l'utilizzo del service account Compute predefinito per la build

Il service account Compute predefinito ha il formato PROJECT_NUMBER-compute@developer.gserviceaccount.com. Puoi disattivarne l'utilizzo come predefinito per la build impostando la policy dell'organizzazione cloudbuild.useComputeServiceAccount su Not Enforced. In alternativa, la disattivazione di questo service account impedisce che venga utilizzato per accedere alle risorse Google Cloud .

Fornisci un service account per la compilazione delle funzioni

Nell'ambito della configurazione di una funzione, è possibile specificare un service account di build durante il deployment della funzione. Quando viene impedito l'utilizzo del service account Cloud Build legacy e del service account Compute predefinito per la build, devi specificare un service account di build per eseguire il deployment di una funzione, come descritto in questa sezione.

Se le modifiche descritte in Modifica del service account Cloud Build hanno effetto sulle tue operazioni, puoi procedere in uno dei modi seguenti:

  • Consulta le indicazioni di Cloud Build sulle modifiche al service account predefinito e disattiva queste modifiche.

  • Aggiungi il ruolo Cloud Build Account (roles/cloudbuild.builds.builder) al service account Compute Engine predefinito.

  • Crea un service account Cloud Build personalizzato per i deployment delle funzioni.

Di seguito sono riportati alcuni scenari in cui potresti voler fornire un service account diverso da utilizzare quando Cloud Build compila la tua funzione:

  • Vuoi avere un maggiore controllo sui service account da aggiungere al perimetro VPC-SC.

  • Vuoi che Cloud Build venga eseguito con autorizzazioni diverse da quelle del service account predefinito senza dover revocare ogni autorizzazione singolarmente.

  • Vuoi impostare autorizzazioni Cloud Build granulari specificamente per le tue funzioni, non condividere un service account Cloud Build ottimizzato per altri scopi.

  • La tua organizzazione ha disattivato l'utilizzo del service account predefinito.

Le sezioni seguenti mostrano come creare un service account Cloud Build personalizzato per i deployment delle funzioni.

Crea un service account

Crea un nuovo service account come descritto in Crea un service account.

Concedi autorizzazioni

Il service account che utilizzi deve disporre dei seguenti ruoli:

  • roles/logging.logWriter: necessario per archiviare i log di build in Cloud Logging.
  • roles/artifactregistry.writer: necessario per archiviare le immagini di build in Artifact Registry. Per il comportamento predefinito, il service account deve accedere ai repository denominati "gcf-artifacts" e "cloud-run-source-deploy". L'accesso ai repository può essere impostato nella policy IAM del repository. In alternativa, puoi fornire il tuo repository di artefatti tramite il campo dockerRepository.
  • roles/storage.objectViewer: obbligatorio per recuperare l'origine della funzione dal bucket Cloud Storage e per archiviare le immagini di build in Container Registry. Per il comportamento predefinito, il service account deve accedere ai bucket denominati "run-sources-*", "gcf-v2-sources-*" e "gcf-v2-uploads-*". Per realizzarlo, puoi aggiungere una condizione IAM alla concessione del ruolo, ad esempio (resource.type == "storage.googleapis.com/Object" && (resource.name.startsWith("projects/_/buckets/gcf-v2-sources-") || resource.name.startsWith("projects/_/buckets/gcf-v2-uploads-") || resource.name.startsWith("projects/_/buckets/run-sources-")))

Concedi i seguenti ruoli utilizzando Google Cloud CLI o la consoleGoogle Cloud .

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
    --role=roles/logging.logWriter

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/artifactregistry.writer

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/storage.objectViewer

Sostituisci quanto segue:

Considerazioni sui Controlli di servizio VPC

Se hai un perimetro dei Controlli di servizio VPC che protegge sia il tuo progetto sia l'API Cloud Run Functions e se utilizzi il service account predefinito di Compute Engine come ruolo Cloud Build Service Account per Cloud Run Functions, devi creare le seguenti regole in entrata:

  • Consenti il traffico in entrata dal service account predefinito di Compute Engine a tutti i metodi delle API Cloud Storage e Cloud Logging.
  • Consenti il traffico in entrata dal service account service-[PROJECT_NUMBER]@gcf-admin-robot.iam.gserviceaccount.com a tutti i metodi delle API Cloud Storage e Cloud Logging.

Esegui il deployment di una funzione con un service account personalizzato

Per passare un service account creato dall'utente, che verrà utilizzato da Cloud Build durante il deployment della funzione, esegui questo comando gcloud:

  • Il flag --build-service-account specifica un service account IAM le cui credenziali verranno utilizzate per il passaggio di build. Se non viene fornito un service account personalizzato, la funzione utilizza il service account predefinito del progetto per Cloud Build.
  • Puoi anche utilizzare un pool privato, che specifichi utilizzando il flag --build-worker-pool.

gcloud functions deploy FUNCTION_NAME \
   --gen2 \
   --region=REGION \
   --project=PROJECT_ID \
   --runtime=RUNTIME \
   --entry-point=CODE_ENTRYPOINT \
   --build-service-account=projects/PROJECT_ID/serviceAccounts/SA_EMAIL \
   --memory=256Mi \
   --trigger-http \
   --source=.

Sostituisci quanto segue:

  • FUNCTION_NAME: il nome con cui hai eseguito il deployment della funzione.
  • REGION: il nome della regioneGoogle Cloud in cui vuoi eseguire il deployment della funzione (ad esempio, us-west1).
  • PROJECT_ID: il tuo ID progettoGoogle Cloud .
  • RUNTIME: l'ID runtime di una versione del runtime supportata per eseguire la funzione, ad esempio nodejs18.
  • CODE_ENTRYPOINT: l'entry point della funzione nel codice sorgente. Questo è il codice che verrà eseguito quando viene eseguita la funzione.
  • SA_EMAIL: l'indirizzo email del tuo service account.

Concedi al service account Cloud Build l'accesso al perimetro dei Controlli di servizio VPC

Cloud Run Functions utilizza Cloud Build per creare un container eseguibile dal codice sorgente. Per utilizzare le funzioni Cloud Run con i Controlli di servizio VPC, devi configurare il service account Cloud Build (predefinito o personalizzato) in modo che abbia accesso al perimetro di servizio.

Trova il nome del service account

Se utilizzi il service account Cloud Build predefinito, puoi trovare il nome come segue:

  1. Utilizza la pagina IAM nella console Google Cloud per trovare il service account Cloud Build.

    Apri IAM

  2. Assicurati che nel menu a discesa del progetto venga visualizzato il progetto corretto.

  3. Cerca cloudbuild.gserviceaccount.com. L'indirizzo email nel formato PROJECT_NUMBER@cloudbuild.gserviceaccount.com è il nome del service account.

Se hai un service account Cloud Build personalizzato, utilizza questo nome.

Concedi al service account l'accesso al perimetro di servizio

Una volta ottenuto il nome del service account, segui le istruzioni in Limita l'accesso per utente o service account per creare un livello di accesso per il service account. Poi, segui la procedura descritta in Aggiunta di un livello di accesso a un perimetro esistente per aggiungere il livello di accesso al perimetro di servizio.