1. Introduzione
Benvenuto nel backend di Petverse, un gioco online multiplayer in cui i giocatori creano avatar di animali, esplorano il mondo e scambiano valuta in-game.
Di recente, l'economia del gioco è stata minacciata. Ingenti somme di denaro vengono sottratte dai conti dei giocatori di cani ricchi, convertite interamente in scorte di tonno premium. Sospettiamo un gruppo di "gatti Robin Hood" che rubano ai cani ricchi per nutrire le masse feline.
In questo codelab, creerai uno scudo di difesa dalle frodi in tempo reale per catturare il capo e la sua rete di bot automatizzati. Scoprirai come i dati operativi in Spanner convergono con l'analisi in BigQuery per rilevare e analizzare pattern di frode complessi con query relazionali e di grafici (GQL).
In questo lab proverai a:
- Rilevare un'anomalia nel flusso in tempo reale utilizzando le query continue di BigQuery e inviarla a Spanner.
- Analizzare la rete di frodi utilizzando Spanner Graph per tracciare le relazioni finanziarie.
- Identificare gli account bot utilizzando la ricerca vettoriale di Spanner per trovare descrizioni di profili simili.
- Scoprire la trama di coordinamento utilizzando BigQuery Graph per analizzare enormi log di comunicazione.
Che cosa ti serve
- Un progetto Google Cloud con la fatturazione abilitata.
- Conoscenza di base di SQL, comandi del terminale e Python.
- Potresti aver bisogno di un account GitHub (il codice è ospitato su GitHub).
Pubblico: sviluppatori, data engineer e architetti di livello intermedio.
Durata totale stimata: da 45 a 60 minuti.
Stima dei costi: le risorse create in questo codelab dovrebbero costare meno di 5 $.
2. Prima di iniziare / Configurazione
Creare o selezionare un progetto Google Cloud
Per utilizzare i servizi richiesti per questo lab, è necessario un progetto Google Cloud con la fatturazione abilitata.
- Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud.
- Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata.
- Trova l'ID progetto nella home page della console Cloud

Avvia Cloud Shell
Utilizzerai Google Cloud Shell come ambiente di esecuzione. Cloud Shell è preinstallato con gcloud, git e altri strumenti di cui avrai bisogno.
- Vai a Google Cloud Shell.
- Se richiesto, fai clic su Autorizza.
- Assicurati di lavorare nel tuo progetto impostando la variabile di ambiente nel terminale Cloud Shell:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID

Abilitare le API necessarie
Esegui il seguente comando per abilitare le API per Spanner, BigQuery e Vertex AI:
gcloud services enable spanner.googleapis.com \
bigquery.googleapis.com \
aiplatform.googleapis.com \
run.googleapis.com \
bigqueryreservation.googleapis.com
Creare la prenotazione e l'assegnazione di BigQuery
Per eseguire query GQL, devi avere una prenotazione che utilizzi la versione Enterprise o Enterprise Plus. Crea una prenotazione Enterprise Edition con scalabilità automatica in Cloud Shell:
# 1. Create a BigQuery Enterprise reservation with 0 baseline slots and 100 max autoscaling slots
bq mk --reservation \
--project_id=${GCP_PROJECT} \
--location=US \
--edition=ENTERPRISE \
--slots=0 \
--autoscale_max_slots=100 \
--ignore_idle_slots=true \
spanner-bigquery-reservation
# 2. Assign your Cloud project to the newly created reservation for query execution
bq mk --reservation_assignment \
--project_id=${GCP_PROJECT} \
--location=US \
--reservation_id=spanner-bigquery-reservation \
--job_type=QUERY \
--assignee_type=PROJECT \
--assignee_id=${GCP_PROJECT}
Clonare il repository
Clona il repository contenente il codice dell'applicazione e gli schemi di esempio:
git clone https://github.com/GoogleCloudPlatform/cloud-spanner-samples.git
cd cloud-spanner-samples/spanner-bq-fraud-defense
3. Esegui il provisioning dell'infrastruttura
Ora configurerai il data warehouse in BigQuery e il database operativo in Spanner.
Configurare il set di dati e la connessione BigQuery
BigQuery analizzerà il flusso di telemetria del gioco.
Sempre nella console in Google Cloud Shell, esegui i seguenti comandi per assicurarti che l'ID progetto sia ancora impostato:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
- Crea un set di dati BigQuery
game_analytics:
bq mk -d --location=US game_analytics
- Crea una connessione per connetterti ai bucket Storage e (facoltativamente) a Spanner:
bq mk --connection --location=US --project_id=$PROJECT_ID \
--connection_type=CLOUD_RESOURCE unicorn-connection
- Crea gli schemi per le tabelle
GameplayTelemetry,AccountSignals,PlayerseChatLogsutilizzando il file di schema:
bq query --use_legacy_sql=false < bq_schema.sql
Configurare Spanner
Google Cloud Spanner gestirà le transazioni operative in tempo reale. Per questo lab, utilizzeremo un'istanza da 100 unità di elaborazione (PU) conveniente.
- Crea un'istanza Spanner:
gcloud spanner instances create game-instance \
--config=regional-us-central1 \
--description="Game Instance" \
--processing-units=100 \
--edition=ENTERPRISE
- Crea il database Spanner
game-db:
gcloud spanner databases create game-db --instance=game-instance
- Aggiorna lo schema Spanner con le tabelle dell'applicazione (
Players,Transactions,AccountSignals) e il grafico delle proprietà (PlayerNetwork):
gcloud spanner databases ddl update game-db --instance=game-instance --ddl-file=spanner_schema.sql
- Crea
AvatarSearchIndexper la ricerca vettoriale multimodale:
gcloud spanner databases ddl update game-db --instance=game-instance \
--ddl="CREATE SEARCH INDEX AvatarSearchIndex ON Players(AvatarDescriptionTokens)"
Importare i dati in BigQuery
- Importa i dati demo in BigQuery:
bq load --source_format=AVRO game_analytics.GameplayTelemetry gs://sample-data-and-media/spanner-bq-fraud-heist/GameplayTelemetry
bq load --source_format=AVRO game_analytics.AccountSignals gs://sample-data-and-media/spanner-bq-fraud-heist/AccountSignals
bq load --source_format=AVRO game_analytics.Players gs://sample-data-and-media/spanner-bq-fraud-heist/Players
bq load --source_format=AVRO game_analytics.ChatLogs gs://sample-data-and-media/spanner-bq-fraud-heist/ChatLogs
- Vai alla console BigQuery ed esplora i dati nel set di dati
game_analytics.

Importare i dati in Spanner
Vai alla console Spanner ed esplora i dati nel database game-db.
Fai clic su Spanner Studio e apri una Nuova query (+).

Incolla le seguenti istruzioni INSERT nell'editor di query e fai clic su Esegui:
-- Table: Players
INSERT INTO Players (
PlayerId,
Name,
Species,
Clan,
AvatarDescription,
ProfilePictureUrl,
CreatedAt
) VALUES
('dc8cf07a-ac0f-48da-9f64-4f379492b1e7', 'Pixel', 'Cat', 'CatClan', 'A heroic cat wearing a green tunic and a feathered cap', 'gs://sample-data-and-media/pixel_profile_booth.png', '2026-03-02T05:11:28.077335+00:00'),
('e82df4fb-0b6d-44dc-8609-70b41430af38', 'Rocky_1', 'Dog', 'DogClan', 'A robot dog with metal plating', 'gs://sample-data-and-media/wheaten_terrier_102.jpg', '2026-03-02T05:11:28.077374+00:00'),
('ea3afac7-54f0-4f68-8ed5-a5b6bd386c59', 'Whiskers_2', 'Cat', 'CatClan', 'A sneaky black cat hiding in the shadows', 'gs://sample-data-and-media/Bengal_100.jpg', '2026-03-02T05:11:28.077389+00:00'),
('f37d558b-fd0a-404c-a193-bc3a8a2edfba', 'Felix_3', 'Cat', 'CatClan', 'A cyber-punk cat with neon glasses', 'gs://sample-data-and-media/Abyssinian_1.jpg', '2026-03-02T05:11:28.077407+00:00'),
('f3687206-405e-43b6-afb0-8ca73eee5dd1', 'Luna_4', 'Cat', 'CatClan', 'A tabby cat with a red bandana', 'gs://sample-data-and-media/Bengal_100.jpg', '2026-03-02T05:11:28.077419+00:00'),
('82383e2d-d3a2-481d-b0cf-bfe165ed9bfd', 'Luna_5', 'Cat', 'CatClan', 'A fluffy persian cat with a golden collar', 'gs://sample-data-and-media/Abyssinian_114.jpg', '2026-03-02T05:11:28.077429+00:00'),
('755c7aff-e538-4681-9b90-4b870a42ac72', 'Buddy_6', 'Dog', 'DogClan', 'A tough bulldog with a spiked collar', 'gs://sample-data-and-media/yorkshire_terrier_101.jpg', '2026-03-02T05:11:28.077439+00:00'),
('8a034e84-26b3-4198-8ec9-3749b1f60537', 'Charlie_7', 'Dog', 'DogClan', 'A police german shepherd with a badge', 'gs://sample-data-and-media/wheaten_terrier_102.jpg', '2026-03-02T05:11:28.077462+00:00'),
('ca288a07-2bf8-46fa-a121-9bd0d0f44c64', 'Rocky_8', 'Dog', 'DogClan', 'A robot dog with metal plating', 'gs://sample-data-and-media/yorkshire_terrier_101.jpg', '2026-03-02T05:11:28.077474+00:00'),
('7b2881f0-289b-4ea4-9c0e-c1748249b70a', 'Bella_9', 'Dog', 'DogClan', 'A robot dog with metal plating', 'gs://sample-data-and-media/yorkshire_terrier_101.jpg', '2026-03-02T05:11:28.077484+00:00'),
('153f4022-a4ce-404a-8544-25d004fd34ad', 'Simba_10', 'Cat', 'CatClan', 'A tabby cat with a red bandana', 'gs://sample-data-and-media/Bengal_100.jpg', '2026-03-02T05:11:28.077494+00:00'),
('3fb82b8e-75a1-49fd-8691-a9dabb42bc4b', 'Charlie_11', 'Dog', 'DogClan', 'A police german shepherd with a badge', 'gs://sample-data-and-media/staffordshire_bull_terrier_116.jpg', '2026-03-02T05:11:28.077507+00:00'),
('e37b6dcf-7ccb-47d0-8b9d-0da2fa30ad09', 'Felix_12', 'Cat', 'CatClan', 'A cyber-punk cat with neon glasses', 'gs://sample-data-and-media/Bengal_105.jpg', '2026-03-02T05:11:28.077516+00:00'),
('0b395a7b-0673-4348-afd0-7cea9252629f', 'Bella_13', 'Dog', 'DogClan', 'A police german shepherd with a badge', 'gs://sample-data-and-media/yorkshire_terrier_101.jpg', '2026-03-02T05:11:28.077527+00:00'),
('64921a63-bea6-4a5c-9e49-7a817678c94f', 'Charlie_14', 'Dog', 'DogClan', 'A tough bulldog with a spiked collar', 'gs://sample-data-and-media/yorkshire_terrier_101.jpg', '2026-03-02T05:11:28.077537+00:00'),
('0d9040df-34a3-4e54-b660-a85e3c60a6fe', 'Felix_15', 'Cat', 'CatClan', 'A fluffy persian cat with a golden collar', 'gs://sample-data-and-media/Abyssinian_114.jpg', '2026-03-02T05:11:28.077546+00:00'),
('188c23a6-4c3b-4c25-9b40-9ec8ad7712a3', 'Max_16', 'Dog', 'DogClan', 'A fast greyhound wearing a racing vest', 'gs://sample-data-and-media/wheaten_terrier_102.jpg', '2026-03-02T05:11:28.077556+00:00'),
('a2eaefc9-dbff-4704-b908-74518d687e17', 'Rocky_17', 'Dog', 'DogClan', 'A tough bulldog with a spiked collar', 'gs://sample-data-and-media/shiba_inu_105.jpg', '2026-03-02T05:11:28.077565+00:00'),
('b59d9b9a-a169-43c1-832d-7e7d4acfa19c', 'Felix_18', 'Cat', 'CatClan', 'A sneaky black cat hiding in the shadows', 'gs://sample-data-and-media/Abyssinian_1.jpg', '2026-03-02T05:11:28.077581+00:00'),
('7019b91a-d908-4c93-8ed2-d1c60e518630', 'Nala_19', 'Cat', 'CatClan', 'A royal siamese cat wearing a crown', 'gs://sample-data-and-media/Abyssinian_1.jpg', '2026-03-02T05:11:28.077595+00:00'),
('1a972a71-a530-407a-b3f7-1dd9b2532cec', 'Luna_20', 'Cat', 'CatClan', 'A sneaky black cat hiding in the shadows', 'gs://sample-data-and-media/Bengal_105.jpg', '2026-03-02T05:11:28.077604+00:00'),
('3bd0489d-3f43-428d-be2d-0434f0e04ed8', 'Luna_21', 'Cat', 'CatClan', 'A cyber-punk cat with neon glasses', 'gs://sample-data-and-media/Bombay_104.jpg', '2026-03-02T05:11:28.077613+00:00'),
('28d7ab21-7ca7-435b-bdc4-5266a381ef89', 'Whiskers_22', 'Cat', 'CatClan', 'A fluffy persian cat with a golden collar', 'gs://sample-data-and-media/Bombay_104.jpg', '2026-03-02T05:11:28.077623+00:00'),
('87d880d4-c949-40e3-8d76-9307b45d57fe', 'Rocky_23', 'Dog', 'DogClan', 'A robot dog with metal plating', 'gs://sample-data-and-media/wheaten_terrier_102.jpg', '2026-03-02T05:11:28.077632+00:00'),
('b49a4523-83ff-4f59-8fca-54356928a18b', 'Nala_24', 'Cat', 'CatClan', 'A tabby cat with a red bandana', 'gs://sample-data-and-media/Bengal_105.jpg', '2026-03-02T05:11:28.077641+00:00'),
('1e049026-1231-4763-bc50-82cb51950fa2', 'Nala_25', 'Cat', 'CatClan', 'A fluffy persian cat with a golden collar', 'gs://sample-data-and-media/Abyssinian_1.jpg', '2026-03-02T05:11:28.077650+00:00'),
('e83caccd-e81e-454a-bf92-9d9a5a509e25', 'Simba_26', 'Cat', 'CatClan', 'A royal siamese cat wearing a crown', 'gs://sample-data-and-media/Bengal_105.jpg', '2026-03-02T05:11:28.077659+00:00'),
('45650b49-9701-4415-92a9-79073243d198', 'Simba_27', 'Cat', 'CatClan', 'A royal siamese cat wearing a crown', 'gs://sample-data-and-media/Bombay_104.jpg'