Obiettivi
- Crea una zona gestita di Cloud DNS per ospitare i record del pool di worker.
- Crea un'applicazione Node.js per gestire il traffico in entrata sulla rete VPC.
- Esegui il deployment di un pool di worker con l'ingresso VPC diretto per assegnare un indirizzo IP privato dalla subnet all'istanza worker.
- Testa l'applicazione per accedere all'indirizzo IP privato da un'istanza di macchina virtuale (VM) sulla stessa rete VPC.
Costi
In questo documento vengono utilizzati 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
- Accedi al tuo Google Cloud account. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Abilita le API Cloud DNS, Cloud Run, Compute Engine, Artifact Registry e Cloud Build.
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre del ruolo IAM Amministratore Service Usage (
roles/serviceusage.serviceUsageAdmin), che contiene l'autorizzazioneserviceusage.services.enable. Scopri come concedere i ruoli.- Installa e inizializza gcloud CLI.
- Aggiorna i componenti:
gcloud components update
- Imposta l'ID progetto eseguendo questo comando:
Sostituisci PROJECT_ID con l'ID del tuo Google Cloud progetto.gcloud config set project PROJECT_ID
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per completare il tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM nel tuo progetto:
-
Amministratore repository Artifact Registry (
roles/artifactregistry.repoAdmin) -
Editor Cloud Build (
roles/cloudbuild.builds.editor) -
Amministratore Cloud Run (
roles/run.admin) -
Create Service Accounts (
roles/iam.serviceAccountCreator) -
Amministratore Cloud DNS (
roles/dns.admin) -
Utente Service Account (
roles/iam.serviceAccountUser) -
Consumer Service Usage (
roles/serviceusage.serviceUsageConsumer)
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.
Crea un account di servizio personalizzato
Crea un account di servizio personalizzato con le autorizzazioni minime richieste per registrare i record DNS. Per configurare il account di servizio, procedi nel seguente modo:
Crea un account di servizio eseguendo questo comando:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --display-name="DNS Worker Pool Service Account"
Sostituisci SERVICE_ACCOUNT_NAME con un nome per il tuo account di servizio personalizzato, ad esempio
dns-worker-sa.Concedi il ruolo Amministratore Cloud DNS all'account di servizio:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/dns.admin"
Crea una zona Cloud DNS
Crea una zona gestita di Cloud DNS privata denominata test-wp per registrare l'IP dell'istanza del pool di worker.
gcloud dns managed-zones create test-wp --description="new DNS zone for worker pools" --dns-name="workerpools.example.com." --visibility="private" --networks=default
Crea un'applicazione Node.js
Crea un'applicazione Node.js che recupera l'indirizzo IP dell'istanza del pool di worker utilizzando il server di metadati e poi lo registra con Cloud DNS.
Crea una cartella denominata
workere cambia la directory in questa cartella:mkdir worker cd workerCrea un file denominato
setup_dns.she aggiungi il seguente script che viene eseguito all'avvio dell'istanza del pool di worker. Questo script utilizza il nome host dell'istanza per generare il nome del record DNS. Se sono presenti più istanze, più istanze possono utilizzare lo stesso nome host, il che comporta la creazione di record DNS sovrapposti.#!/bin/bash # --- Variables --- # The name of your Cloud DNS managed zone. ZONE_NAME="test-wp" # The base domain suffix for the DNS entry. Use the part *after* the hostname. # For example, for "testinstance.workerpools.example.com.", the suffix is ".workerpools.example.com." DNS_SUFFIX=".workerpools.example.com." # The Time-To-Live (TTL) in seconds. TTL="300" # The record type (A for IPv4). RECORD_TYPE="A" # ----------------- # 1. Dynamically generate DNS_NAME # Get the simple hostname (e.g., "testinstance") and append the defined suffix. # We use 'hostname -s' to get the short hostname. SHORT_HOSTNAME=$(hostname -s) DNS_NAME="${SHORT_HOSTNAME}${DNS_SUFFIX}" # 2. Dynamically assign NEW_IP # Get the IP address from metadata server using predefined key. NEW_IP=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip" -H "Metadata-Flavor: Google") # --- Input Validation --- if [ -z "$NEW_IP" ]; then echo "❌ ERROR: Could not obtain a valid IP address from metadata server. Aborting." exit 1 fi echo "Starting DNS record update for ${DNS_NAME} in zone ${ZONE_NAME}..." echo "New IP detected on this instance: ${NEW_IP}" # 3. Get the current existing IP address (if any) # This is required to know what to put in the --rrdatas for the delete command. EXISTING_IP=$(gcloud dns record-sets list \ --zone="${ZONE_NAME}" \ --name="${DNS_NAME}" \ --type="${RECORD_TYPE}" \ --format="value(rrdatas[0])" 2>/dev/null) # --- Conditional Deletion/Skip Check --- if [ -n "$EXISTING_IP" ] && [ "$EXISTING_IP" != "$NEW_IP" ]; then echo "Found existing IP: ${EXISTING_IP}. It is different from the new IP." # Delete the existing record echo "Deleting old record..." gcloud dns record-sets delete "${DNS_NAME}" \ --zone="${ZONE_NAME}" \ --type="${RECORD_TYPE}" \ --quiet if [ $? -ne 0 ]; then echo "❌ ERROR: Failed to delete existing record. Aborting." exit 1 fi elif [ -n "$EXISTING_IP" ] && [ "$EXISTING_IP" == "$NEW_IP" ]; then echo "Existing IP (${EXISTING_IP}) matches the new IP. Skipping update." exit 0 else echo "No existing record found for ${DNS_NAME}. Proceeding with creation." fi # ---------------------------------------- # 4. Add the new record echo "Creating new record with IP: ${NEW_IP}..." gcloud dns record-sets create "${DNS_NAME}" \ --zone="${ZONE_NAME}" \ --type="${RECORD_TYPE}" \ --ttl="${TTL}" \ --rrdatas="${NEW_IP}" # Final status check if [ $? -eq 0 ]; then echo "✅ Successfully created/updated DNS record for ${DNS_NAME} to ${NEW_IP}." else echo "❌ ERROR: Failed to create the new DNS record." exit 1 fiCrea un file
server.jscon il seguente codice per gestire l'ingresso dell'indirizzo IP privato:// server.js // 1. Import the built-in 'http' module console.log("hello from worker pool") const http = require('http'); // Define the port the server will listen on const PORT = 3000; // 2. Create the server instance const server = http.createServer((req, res) => { // Set the response HTTP header with status and type of content res.writeHead(200, {'Content-Type': 'text/plain'}); // Write the response body res.end('Hello World!\n'); }); // 3. Start the server and listen on the specified port server.listen(PORT, () => { console.log(`Server running at http://localhost:${PORT}/`); });Crea uno script
start.shcon il seguente codice per eseguire prima la configurazione DNS, prima di eseguire l'applicazione Node.js:#!/bin/bash set -e # 1. Execute the setup script echo "Running setup_dns.sh..." /app/setup_dns.sh # 2. Run the main application echo "Starting server.js..." exec node /app/server.jsCrea il seguente Dockerfile per creare il pacchetto dell'applicazione in un'immagine:
# Choose a base image. This image includes gcloud, kubectl, etc. FROM google/cloud-sdk:latest # Install Node.js on top of the Cloud SDK image. RUN apt-get update && \ apt-get install -y curl && \ curl -sL https://deb.nodesource.com/setup_lts.x | bash - && \ apt-get install -y nodejs && \ # Clean up to reduce image size apt-get clean && \ rm -rf /var/lib/apt/lists/* # Set the working directory inside the container. WORKDIR /app # Copy the application and scripts into the container. COPY setup_dns.sh . COPY server.js . COPY start.sh . # Make both scripts executable. RUN chmod +x setup_dns.sh start.sh # Define the entrypoint and default command. ENTRYPOINT ["/app/start.sh"] CMD []
Esegui il deployment di un pool di worker con l'ingresso VPC diretto
Esegui il deployment di un pool di worker denominato test-cli-dns e collegalo a una rete VPC.
gcloud beta run worker-pools deploy test-cli-dns \ --network default \ --subnet default \ --region us-central1 \ --source . \ --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --project PROJECT_ID
Sostituisci PROJECT_ID con l'ID del tuo Google Cloud progetto e SERVICE_ACCOUNT_NAME con il nome del account di servizio che hai creato.
Testa l'applicazione
I pool di worker Cloud Run con l'ingresso VPC diretto sono progettati per il traffico solo interno. Non hanno un IP pubblico. Per verificare la funzionalità di ingresso, segui questi passaggi per eseguire una richiesta utilizzando curl da una VM Compute Engine ospitata sulla stessa rete VPC e subnet:
Crea una VM di test nella stessa rete e regione del pool di worker:
gcloud compute instances create wp-test-vm \ --zone=us-central1-a \ --network=default \ --subnet=defaultConnettiti alla VM di test tramite SSH eseguendo il seguente comando:
gcloud compute ssh wp-test-vm --zone=us-central1-aDal terminale della VM, richiama il servizio all'indirizzo IP privato dell'istanza del pool di worker registrata con Cloud DNS:
curl http://localhost.workerpools.example.com:3000Dovresti visualizzare l'output:
Hello World!
Operazione riuscita. Hai configurato correttamente il pool di worker Cloud Run con l'ingresso VPC diretto utilizzando un indirizzo IP privato e Cloud DNS.
Libera spazio
Per evitare addebiti aggiuntivi al tuo Google Cloud account, elimina tutte le risorse di cui hai eseguito il deployment con questo tutorial.
Elimina il progetto
Se hai creato un nuovo progetto per questo tutorial, eliminalo. Se hai utilizzato un progetto esistente e devi conservarlo senza le modifiche aggiunte in questo tutorial, elimina le risorse create per il tutorial.
Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.
Per eliminare il progetto:
- Nella Google Cloud console, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID progetto e fai clic su Chiudi per eliminare il progetto.
Elimina le risorse del tutorial
Elimina il servizio Cloud Run di cui hai eseguito il deployment in questo tutorial. I servizi Cloud Run non comportano costi finché non ricevono richieste.
Per eliminare il servizio Cloud Run, esegui questo comando:
gcloud run services delete SERVICE-NAME
Sostituisci SERVICE-NAME con il nome del tuo servizio.
Puoi eliminare i servizi Cloud Run anche dalla Google Cloud console.
Rimuovi la configurazione della regione predefinita di
gcloudche hai aggiunto durante la configurazione del tutorial:gcloud config unset run/regionRimuovi la configurazione del progetto:
gcloud config unset projectElimina le altre Google Cloud risorse create in questo tutorial:
Passaggi successivi
- Scopri di più sulla configurazione di un VPC diretto con una rete VPC.
- Scopri di più sui pool di worker Cloud Run.
- Esplora altre demo, tutorial ed esempi di Cloud Run.