Questo tutorial ti insegna a risolvere gli errori di runtime riscontrati quando utilizzi Eventarc per instradare gli eventi da Cloud Storage a un servizio Cloud Run non autenticato utilizzando Cloud Audit Logs.
Obiettivi
Questo tutorial mostra come completare le seguenti attività:
- Crea un repository standard Artifact Registry per archiviare l'immagine container.
- Crea un bucket Cloud Storage come origine evento.
- Crea, carica ed esegui il deployment di un'immagine container su Cloud Run.
- Crea trigger Eventarc.
- Carica un file nel bucket Cloud Storage.
- Risolvi i problemi e correggi gli errori di runtime.
Costi
In questo documento, utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Prima di iniziare
I vincoli di sicurezza definiti dalla tua organizzazione potrebbero impedirti di completare i passaggi seguenti. Per informazioni sulla risoluzione dei problemi, vedi Sviluppare applicazioni in un ambiente Google Cloud vincolato.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
Se hai creato il progetto, ti viene assegnato il ruolo di base Proprietario (
roles/owner
). Per impostazione predefinita, questo ruolo Identity and Access Management (IAM) include le autorizzazioni necessarie per l'accesso completo alla maggior parte delle risorse Google Cloud e puoi saltare questo passaggio.Se non sei il creatore del progetto, le autorizzazioni richieste devono essere concesse al principal appropriato. Ad esempio, un'entità può essere un Account Google (per gli utenti finali) o un account di servizio (per applicazioni e carichi di lavoro di calcolo). Per saperne di più, consulta la pagina Ruoli e autorizzazioni per la destinazione eventi.
Tieni presente che per impostazione predefinita, le autorizzazioni di Cloud Build includono le autorizzazioni per caricare e scaricare gli artefatti di Artifact Registry.
Autorizzazioni obbligatorie
Per ottenere le autorizzazioni necessarie per completare questo tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Editor Cloud Build (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
roles/run.admin
) -
Amministratore Eventarc (
roles/eventarc.admin
) -
Logs View Accessor (
roles/logging.viewAccessor
) -
Amministratore IAM progetto (
roles/resourcemanager.projectIamAdmin
) -
Amministratore account di servizio (
roles/iam.serviceAccountAdmin
) -
Utente service account (
roles/iam.serviceAccountUser
) -
Amministratore utilizzo servizi (
roles/serviceusage.serviceUsageAdmin
) -
Amministratore spazio di archiviazione (
roles/storage.admin
)
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
-
Editor Cloud Build (
- Per Cloud Storage, abilita l'audit logging per i tipi di accesso ai dati
ADMIN_READ
,DATA_WRITE
eDATA_READ
.- Leggi il criterio Identity and Access Management (IAM) associato al tuo
Google Cloud progetto, alla tua cartella o alla tua organizzazione e archivialo in un file temporaneo:
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- In un editor di testo, apri
/tmp/policy.yaml
e aggiungi o modifica solo la configurazione del log di controllo nella sezioneauditConfigs
:auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- Scrivi il nuovo criterio IAM:
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
Se il comando precedente segnala un conflitto con un'altra modifica, allora ripeti questi passaggi, a partire dalla lettura del criterio IAM. Per ulteriori informazioni, consulta Configurare gli audit log di accesso ai dati con l'API.
- Leggi il criterio Identity and Access Management (IAM) associato al tuo
Google Cloud progetto, alla tua cartella o alla tua organizzazione e archivialo in un file temporaneo:
- Concedi il ruolo
eventarc.eventReceiver
al account di servizio Compute Engine:export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \ --role='roles/eventarc.eventReceiver'
- Se hai attivato l'account di servizio Pub/Sub l'8 aprile 2021 o in una data precedente, concedi il ruolo
iam.serviceAccountTokenCreator
all'account di servizio Pub/Sub:gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\ --role='roles/iam.serviceAccountTokenCreator'
- Imposta i valori predefiniti utilizzati in questo tutorial:
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
Crea un repository standard Artifact Registry
Crea un repository standard di Artifact Registry per archiviare l'immagine container:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
Sostituisci REPOSITORY
con un nome univoco per il repository.
Crea un bucket Cloud Storage
Crea un bucket Cloud Storage in ciascuna delle due regioni come origine evento per il servizio Cloud Run:
Crea un bucket in
us-east1
:export BUCKET1="troubleshoot-bucket1-PROJECT_ID" gcloud storage buckets create gs://${BUCKET1} --location=us-east1
Crea un bucket in
us-west1
:export BUCKET2="troubleshoot-bucket2-PROJECT_ID" gcloud storage buckets create gs://${BUCKET2} --location=us-west1
Dopo aver creato l'origine evento, esegui il deployment del servizio di ricezione di eventi su Cloud Run.
Esegui il deployment del ricevitore di eventi
Esegui il deployment di un servizio Cloud Run che riceve e registra gli eventi.
Recupera il esempio di codice clonando il repository GitHub:
Vai
git clone https://github.com/GoogleCloudPlatform/golang-samples.git cd golang-samples/eventarc/audit_storage
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git cd java-docs-samples/eventarc/audit-storage
.NET
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git cd dotnet-docs-samples/eventarc/audit-storage
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git cd nodejs-docs-samples/eventarc/audit-storage
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/eventarc/audit-storage
Esamina il codice di questo tutorial, che consiste in quanto segue:
Un gestore di eventi che riceve l'evento in entrata come CloudEvent all'interno della richiesta HTTP
POST
:Vai
Java
.NET
Node.js
Python
Un server che utilizza il gestore di eventi:
Vai
Java
.NET
Node.js
Python
Un Dockerfile che definisce l'ambiente operativo per il servizio. I contenuti del Dockerfile variano in base alla lingua:
Vai
Java
.NET
Node.js
Python
Crea l'immagine container con Cloud Build e caricala in Artifact Registry:
export PROJECT_ID=$(gcloud config get-value project) export SERVICE_NAME=troubleshoot-service gcloud builds submit --tag $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1
Esegui il deployment dell'immagine container su Cloud Run:
gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1 \ --allow-unauthenticated
Se il deployment ha esito positivo, la riga di comando visualizza l'URL del servizio.
Crea un trigger
Dopo aver eseguito il deployment di un servizio Cloud Run, configura un trigger per rilevare gli eventi di Cloud Storage tramite i log di controllo.
Crea un trigger Eventarc per rimanere in ascolto degli eventi di Cloud Storage instradati utilizzando Cloud Audit Logs:
gcloud eventarc triggers create troubleshoot-trigger \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
Viene creato un trigger denominato
troubleshoot-trigger
.Per confermare la creazione di
troubleshoot-trigger
, esegui:gcloud eventarc triggers list
L'output dovrebbe essere simile al seguente:
NAME: troubleshoot-trigger TYPE: google.cloud.audit.log.v1.written DESTINATION: Cloud Run service: troubleshoot-service ACTIVE: By 20:03:37 LOCATION: us-central1
Generare e visualizzare un evento
Verifica di aver eseguito correttamente il deployment del servizio e di poter ricevere eventi da Cloud Storage.
Crea e carica un file nel bucket di archiviazione
BUCKET1
:echo "Hello World" > random.txt gcloud storage cp random.txt gs://${BUCKET1}/random.txt
Monitora i log per verificare se il servizio ha ricevuto un evento. Per visualizzare la voce di log:
Filtra le voci di log e restituisci l'output in formato JSON:
gcloud logging read "resource.labels.service_name=troubleshoot-service \ AND textPayload:random.txt" \ --format=json
Cerca una voce di log simile a:
"textPayload": "Detected change in Cloud Storage bucket: ..."
Tieni presente che inizialmente non viene restituita alcuna voce di log. Ciò indica che si è verificato un problema nella configurazione che devi esaminare.
Esaminare il problema
Segui la procedura per capire perché il servizio non riceve eventi.
Tempo di inizializzazione
Sebbene l'attivatore venga creato immediatamente, la propagazione e il filtraggio degli eventi possono richiedere fino a due minuti. Esegui questo comando per verificare che un trigger sia attivo:
gcloud eventarc triggers list
L'output indica lo stato del trigger. Nel seguente esempio,
troubleshoot-trigger
sarà attivo entro le ore 14:16:56:
NAME TYPE DESTINATION_RUN_SERVICE ACTIVE
troubleshoot-trigger google.cloud.audit.log.v1.written troubleshoot-service By 14:16:56
Una volta attivato il trigger, carica di nuovo un file nel bucket di archiviazione. Gli eventi vengono scritti nei log del servizio Cloud Run. Se il servizio non riceve eventi, il problema potrebbe essere correlato alle dimensioni degli eventi.
Audit log
In questo tutorial, gli eventi Cloud Storage vengono instradati utilizzando Cloud Audit Logs e inviati a Cloud Run. Verifica che gli audit log siano abilitati per Cloud Storage.
Nella console Google Cloud , vai alla pagina Audit log.
- Seleziona la casella di controllo Google Cloud Storage.
- Assicurati che siano selezionati i tipi di log Lettura amministratore, Lettura dati e Scrittura dati.
Dopo aver abilitato Cloud Audit Logs, carica di nuovo il file nel bucket di archiviazione e controlla i log. Se il servizio continua a non ricevere eventi, il problema potrebbe essere correlato alla località del trigger.
Posizione del trigger
Potrebbero esserci più risorse in località diverse e devi filtrare gli eventi provenienti da origini che si trovano nella stessa regione della destinazione Cloud Run. Per ulteriori informazioni, consulta le località supportate da Eventarc e Informazioni sulle località Eventarc.
In questo tutorial hai eseguito il deployment del servizio Cloud Run su
us-central1
. Poiché hai impostato eventarc/location
su us-central1
, hai anche
creato un trigger nella stessa posizione.
Tuttavia, hai creato due bucket Cloud Storage nelle località us-east1
e
us-west1
. Per ricevere eventi da queste località, devi creare
trigger Eventarc in queste località.
Crea un trigger Eventarc che si trova in us-east1
:
Conferma la posizione del trigger esistente:
gcloud eventarc triggers describe troubleshoot-trigger
Imposta la località e la regione su
us-east1
:gcloud config set eventarc/location us-east1 gcloud config set run/region us-east1
Esegui nuovamente il deployment del ricevitore di eventi creando ed eseguendo il deployment dell'immagine container in Cloud Run.
Crea un nuovo trigger che si trova in
us-east1
:gcloud eventarc triggers create troubleshoot-trigger-new \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
Verifica che il trigger sia stato creato:
gcloud eventarc triggers list
L'inizializzazione di un trigger può richiedere fino a due minuti prima che inizi a instradare gli eventi.
Per verificare che il trigger sia ora implementato correttamente, genera e visualizza un evento.
Altri problemi che potresti riscontrare
Potresti riscontrare altri problemi durante l'utilizzo di Eventarc.
Dimensione dell'evento
Gli eventi che invii non devono superare i limiti di dimensione dell'evento.
Un trigger che in precedenza forniva eventi ha smesso di funzionare
Verifica che l'origine stia generando eventi. Controlla Cloud Audit Logs e assicurati che il servizio monitorato emetta log. Se i log vengono registrati, ma gli eventi non vengono distribuiti, contatta l'assistenza.
Verifica che esista un argomento Pub/Sub con lo stesso nome del trigger. Eventarc utilizza Pub/Sub come livello di trasporto e utilizzerà un argomento Pub/Sub esistente o creerà e gestirà automaticamente un argomento per te.
- Per elencare i trigger, vedi
gcloud eventarc triggers list
. Per elencare gli argomenti Pub/Sub, esegui:
gcloud pubsub topics list
Verifica che il nome dell'argomento Pub/Sub includa il nome del trigger creato. Ad esempio:
name: projects/PROJECT_ID/topics/eventarc-us-east1-troubleshoot-trigger-new-123
Se l'argomento Pub/Sub non è presente, crea di nuovo il trigger per un fornitore, un tipo di evento e una destinazione Cloud Run specifici.
- Per elencare i trigger, vedi
Verifica che il trigger sia stato configurato per il servizio.
Nella console Google Cloud , vai alla pagina Servizi.
Fai clic sul nome del servizio per aprire la pagina Dettagli servizio.
Fai clic sulla scheda Attivatori.
Il trigger Eventarc associato al servizio dovrebbe essere elencato.
Verifica l'integrità dell'argomento e della sottoscrizione Pub/Sub utilizzando i tipi di metriche Pub/Sub.
Puoi monitorare i messaggi inoltrati non recapitabili utilizzando la metrica
subscription/dead_letter_message_count
. Questa metrica mostra il numero di messaggi non recapitabili che Pub/Sub inoltra da una sottoscrizione.Se i messaggi non vengono pubblicati nell'argomento, controlla Cloud Audit Logs e assicurati che il servizio monitorato emetta log. Se i log vengono registrati, ma gli eventi non vengono recapitati, contatta l'assistenza.
Puoi monitorare le iscrizioni push utilizzando la metrica
subscription/push_request_count
e raggruppandola perresponse_code
esubcription_id
.Se vengono segnalati errori push, controlla i log del servizio Cloud Run. Se l'endpoint di ricezione restituisce un codice di stato diverso da OK, significa che il codice Cloud Run non funziona come previsto e devi contattare l'assistenza.
Per saperne di più, consulta Creare criteri di avviso basati su soglie delle metriche.
Esegui la pulizia
Se hai creato un nuovo progetto per questo tutorial, elimina il progetto. Se hai utilizzato un progetto esistente e vuoi conservarlo senza le modifiche aggiunte in questo tutorial, elimina le risorse create per il tutorial.
Elimina il progetto
Il modo più semplice per eliminare la fatturazione è quello di eliminare il progetto creato per il tutorial.
Per eliminare il progetto:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Eliminare le risorse del tutorial
Elimina il servizio Cloud Run di cui hai eseguito il deployment in questo tutorial:
gcloud run services delete SERVICE_NAME
Dove
SERVICE_NAME
è il nome del servizio che hai scelto.Puoi anche eliminare i servizi Cloud Run dalla Google Cloud console.
Rimuovi tutte le configurazioni predefinite gcloud CLI che hai aggiunto durante la configurazione del tutorial.
Ad esempio:
gcloud config unset run/region
o
gcloud config unset project
Elimina le altre risorse Google Cloud create in questo tutorial:
- Elimina il trigger Eventarc:
Sostituiscigcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
con il nome del tuo trigger.
- Elimina il trigger Eventarc: