Service account personalizzato per Cloud Build (1ª gen.)

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. Questa modifica è descritta in dettaglio nella pagina Modifica del service account Cloud Build. 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. Se questa modifica ti riguarda, puoi procedere in uno dei seguenti modi:

  • 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.

Questo documento descrive come passare un service account creato dall'utente da utilizzare con Cloud Build durante il deployment della funzione.

Puoi eseguire il deployment di funzioni con service account personalizzati utilizzando Google Cloud CLI, la consoleGoogle Cloud o l'API Cloud Run Functions.

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.

Abilita le API

Questa funzionalità richiede l'abilitazione dell'API IAM.

Utilizza Google Cloud CLI per abilitare le API necessarie per eseguire il deployment di una funzione Cloud Run oppure utilizza la consoleGoogle Cloud :

gcloud services enable iam.googleapis.com

Configura il service account

Questo documento descrive come creare un nuovo service account e concedere le autorizzazioni richieste. Se vuoi utilizzare un service account esistente, devi avere l'indirizzo email del service account che intendi utilizzare. Per i dettagli, consulta Configurazione dei service account specificati dall'utente.

Puoi visualizzare i service account esistenti come segue o utilizzare la consoleGoogle Cloud :

gcloud iam service-accounts list

Crea il service account

Utilizza Google Cloud CLI per creare il service account o utilizza la console Google Cloud :

gcloud iam service-accounts create SA_EMAIL

Sostituisci SA_EMAIL con l'indirizzo email del tuo service account.

Concedi le autorizzazioni

Il service account che utilizzi deve disporre dei seguenti ruoli:

  • roles/logging.logWriter: obbligatorio per archiviare i log di build in Cloud Logging.
  • roles/artifactregistry.writer: obbligatorio 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 "gcf-sources-*". A questo scopo, puoi aggiungere una condizione IAM alla concessione del ruolo, ad esempio: (resource.type == "storage.googleapis.com/Object" && (resource.name.startsWith("gcf-sources-")))

  • roles/storage.objectAdmin: obbligatorio per Container Registry (ora deprecato). Per accedere a Container Registry, è necessario l'accesso ai bucket denominati *.artifacts.PROJECT_ID.appspot.com.

Concedi i ruoli seguenti 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

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

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

Puoi utilizzare Google Cloud CLI per eseguire il deployment di una funzione che utilizza un service account personalizzato per Cloud Build:

  • 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 \
   --no-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.