1. Introduzione
Panoramica
Per proteggere il traffico di rete per i propri servizi e applicazioni, molte organizzazioni utilizzano una rete Virtual Private Cloud (VCP) su Google Cloud con controlli perimetrali per impedire l'esfiltrazione di dati. Una rete VPC è una versione virtuale di una rete fisica implementata all'interno della rete di produzione di Google. Una rete VPC fornisce connettività per le tue istanze di macchine virtuali (VM) Compute Engine, offre bilanciatori del carico di rete passthrough interni nativi e sistemi proxy per bilanciatori del carico delle applicazioni interni, si connette alle reti on-premise utilizzando tunnel Cloud VPN e collegamenti VLAN per Cloud Interconnect e distribuisce il traffico dai bilanciatori del carico esterni di Google Cloud ai backend.
A differenza delle VM, i servizi Cloud Run non sono associati a una particolare rete VPC per impostazione predefinita. Questo codelab mostra come modificare le impostazioni di traffico in entrata (connessioni in entrata) in modo che solo il traffico proveniente da un VPC possa accedere a un servizio Cloud Run (ad es. a un servizio di backend). Inoltre, questo codelab ti mostra come fare in modo che un secondo servizio (ad es. un servizio frontend) acceda al servizio Cloud Run di backend tramite un VPC e come continuare ad avere accesso a internet pubblico.
In questo esempio, il servizio di backend Cloud Run restituisce hello world. Il servizio Cloud Run frontend fornisce un campo di immissione nella UI per raccogliere un URL. Quindi il servizio frontend effettua una richiesta GET a quell'URL (ad es. il servizio di backend), rendendola quindi una richiesta da servizio a servizio (anziché una richiesta da browser a servizio). Quando il servizio di frontend riesce a raggiungere il backend, nel browser viene visualizzato il messaggio Hello World. Quindi, vedremo come effettuare una chiamata a https://curlmyip.org per recuperare l'indirizzo IP del tuo servizio frontend.
Cosa imparerai a fare
- Come consentire solo il traffico da un VPC al servizio Cloud Run
- Come configurare il traffico in uscita su un servizio Cloud Run (ad es. frontend) per comunicare con un servizio Cloud Run solo interno in entrata (ad es. il backend), mantenendo l'accesso a internet pubblico per il servizio frontend.
2. Configurazione e requisiti
Prerequisiti
- Hai eseguito l'accesso alla console Cloud.
- Hai già eseguito il deployment di una funzione di 2a generazione. Ad esempio, per iniziare puoi seguire la guida rapida per la funzione Cloud Functions (2nd gen).
Attiva Cloud Shell
- Dalla console Cloud, fai clic su Attiva Cloud Shell
.
Se è la prima volta che avvii Cloud Shell, ti verrà mostrata una schermata intermedia che descrive di cosa si tratta. Se ti è stata presentata una schermata intermedia, fai clic su Continua.
Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.
Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Gran parte, se non tutto, del lavoro in questo codelab può essere svolto con un browser.
Una volta stabilita la connessione a Cloud Shell, dovresti vedere che hai eseguito l'autenticazione e che il progetto è impostato sul tuo ID progetto.
- Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list
Output comando
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Esegui questo comando in Cloud Shell per confermare che il comando gcloud è a conoscenza del tuo progetto:
gcloud config list project
Output comando
[core] project = <PROJECT_ID>
In caso contrario, puoi impostarlo con questo comando:
gcloud config set project <PROJECT_ID>
Output comando
Updated property [core/project].
3. crea i servizi Cloud Run
Configura le variabili di ambiente
Puoi impostare le variabili di ambiente che verranno utilizzate in questo codelab.
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend-with-internet BACKEND=backend SUBNET_NAME=default
Crea il servizio Cloud Run di backend
Per prima cosa, crea una directory per il codice sorgente e accedi a quella directory.
mkdir -p egress-private-codelab/frontend-w-internet egress-private-codelab/backend && cd egress-private-codelab/backend
Quindi, crea un file "package.json" con i seguenti contenuti:
{ "name": "backend-service", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.18.1" } }
A questo punto, crea un file di origine index.js
con i contenuti seguenti. Questo file contiene il punto di ingresso del servizio e la logica principale dell'app.
const express = require('express'); const app = express(); app.use(express.urlencoded({ extended: true })); app.get('/', function (req, res) { res.send("hello world"); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, () => { console.log(`helloworld: listening on port ${port}`); });
Infine, esegui il deployment del servizio Cloud Run eseguendo questo comando.
gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION
Crea il servizio Cloud Run frontend
Vai alla directory del frontend
cd ../frontend-w-internet
Quindi, crea un file package.json
con i seguenti contenuti:
{ "name": "frontend", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "axios": "^1.6.6", "express": "^4.18.2", "htmx.org": "^1.9.10" } }
A questo punto, crea un file di origine index.js
con i contenuti seguenti. Questo file contiene il punto di ingresso del servizio e la logica principale dell'app.
const express = require("express"); const app = express(); const port = 8080; const path = require('path'); const axios = require('axios'); // serve static content (index.html) using // built-in middleware function in Express app.use(express.static('public')); app.use(express.urlencoded({ extended: true })); // this endpoint receives a URL in the post body // and then makes a get request to that URL // results are sent back to the caller app.post('/callService', async (req, res) => { const url = req.body.url; let message = ""; try { console.log("url: ", url); const response = await axios.get(url); message = response.data; } catch (error) { message = error.message; console.error(error.message); } res.send(` ${message} <p> </p> `); }); app.listen(port, () => { console.log(`Example app listening on port ${port}`); });
Crea una directory pubblica per il file index.html
mkdir public touch public/index.html
Aggiorna index.html
in modo che contenga quanto segue:
<html> <script src="https://unpkg.com/htmx.org@1.9.10" integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC" crossorigin="anonymous" ></script> <body> <div style="margin-top: 100px; margin-left: 100px"> <h1>I'm the Request Tester service on the Internet</h1> <form hx-trigger="submit" hx-post="/callService" hx-target="#zen"> <label for="url"> URL:</label> <input style="width: 308px" type="text" id="url" name="url" placeholder="The backend service URL" required /> <button hx-indicator="#loading" type="submit">Submit</button> <p></p> <span class="htmx-indicator" id="loading"> Loading... </span> <div id="zen" style="white-space: pre-wrap"></div> <p></p> </form> </div> </body> </html>
Infine, esegui il deployment del servizio Cloud Run eseguendo questo comando.
gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION
Chiama il servizio di backend
In questa sezione verificherai di aver eseguito correttamente il deployment di due servizi Cloud Run.
Apri l'URL del servizio frontend nel browser web, ad esempio https://frontend-your-hash-uc.a.run.app/
Nella casella di testo, inserisci l'URL del servizio di backend. Tieni presente che questa richiesta viene instradata dall'istanza Cloud Run di frontend al servizio Cloud Run di backend, non dal tuo browser.
Vedrai "Hello World"
4. Imposta il servizio di backend solo per il traffico in entrata interno
Per incorporare un servizio Cloud Run nella tua rete privata, puoi eseguire il seguente comando gcloud.
gcloud run services update $BACKEND --ingress internal --region $REGION
Se provi a chiamare il servizio di backend dal servizio frontend, verrebbe visualizzato un errore 404. La connessione in uscita (o in uscita) del servizio Cloud Run frontend va prima a internet, quindi Google Cloud non conosce l'origine della richiesta.
5. configura il servizio frontend per accedere al VPC
In questa sezione configurerai il servizio Cloud Run frontend per comunicare con il servizio di backend tramite un VPC.
Per farlo, devi aggiungere il traffico VPC diretto in uscita al servizio Cloud Run frontend per assicurarti che possa raggiungere gli indirizzi IP interni sulla rete VPC. Quindi, configurerai il traffico in uscita in modo tale che al VPC vengano instradate solo le richieste a IP privati. Questa configurazione consentirà al frontend di connettersi comunque alla rete internet pubblica. Puoi trovare ulteriori informazioni nella documentazione sulla ricezione di richieste da altri servizi Cloud Run.
Configura traffico VPC diretto in uscita
Innanzitutto, esegui questo comando per utilizzare il traffico VPC diretto in uscita sul tuo servizio frontend:
gcloud beta run services update $FRONTEND \ --network=$SUBNET_NAME \ --subnet=$SUBNET_NAME \ --vpc-egress=private-ranges-only \ --region=$REGION
Ora puoi verificare che il tuo servizio frontend abbia accesso al VPC:
gcloud beta run services describe $FRONTEND \ --region=$REGION
Dovresti vedere un output simile a
VPC access: Network: default Subnet: default Egress: private-ranges-only
Abilita l'accesso privato Google
Successivamente, abiliterai l'accesso privato Google sulla subnet eseguendo questo comando:
gcloud compute networks subnets update $SUBNET_NAME \ --region=$REGION \ --enable-private-ip-google-access
Puoi verificare che l'accesso privato Google sia stato abilitato eseguendo questo comando:
gcloud compute networks subnets describe $SUBNET_NAME \ --region=$REGION \ --format="get(privateIpGoogleAccess)"
Crea una zona Cloud DNS per gli URL run.app
Infine, crea una zona Cloud DNS per gli URL run.app, in modo che Google Cloud possa considerarli come indirizzi IP interni.
In un passaggio precedente, in cui hai configurato il traffico VPC in uscita diretto a solo intervalli privati. Ciò significa che le connessioni in uscita dal servizio frontend verranno indirizzate alla rete VPC solo se la destinazione è un IP interno. Tuttavia, il servizio di backend utilizza un URL run.app che si risolve in un IP pubblico.
In questo passaggio creerai una zona Cloud DNS per far risolvere gli URL run.app negli intervalli di indirizzi IP private.googleapis.com, che sono riconosciuti come indirizzi IP interni. Ora, tutte le richieste a questi intervalli verranno instradate tramite la tua rete VPC.
Puoi farlo: https://cloud.google.com/run/docs/securing/private-networking#from-other-services
# do not include the https:// in your DNS Name # for example: backend-<hash>-uc.a.run.app DNS_NAME=<your backend service URL without the https://> gcloud dns --project=$PROJECT_ID managed-zones create codelab-backend-service \ --description="" \ --dns-name="a.run.app." \ --visibility="private" \ --networks=$SUBNET_NAME gcloud dns --project=$PROJECT_ID record-sets create $DNS_NAME. \ --zone="codelab-backend-service" \ --type="A" \ --ttl="60" \ --rrdatas="199.36.153.8,199.36.153.9,199.36.153.10,199.36.153.11"
Ora, quando provi a raggiungere il servizio di backend per il tuo sito web, vedrai "Hello World" restituito.
Quando tenti di connetterti a Internet utilizzando https://curlmyip.org/, vedrai il tuo indirizzo IP.
6. Risoluzione dei problemi
Di seguito sono riportati alcuni possibili messaggi di errore che potresti visualizzare se le impostazioni non sono state configurate correttamente.
- Se ricevi un messaggio di errore
getaddrinfo ENOTFOUND backend-your-hash-uc.a.run.app
assicurati di non aver aggiunto "https://" al record A DNS - Se ricevi un errore 404 quando tenti di accedere al backend dopo aver configurato la zona, puoi attendere che la cache del record run.app globale scada (ad es. 6 ore) oppure puoi creare una nuova revisione (svuotando quindi la cache) eseguendo questo comando:
gcloud beta run services update $FRONTEND --network=$SUBNET_NAME --subnet=$SUBNET_NAME --vpc-egress=private-ranges-only --region=$REGION
7. Complimenti!
Complimenti per aver completato il codelab.
Consigliamo di consultare la documentazione sul networking privato su Cloud Run.
Argomenti trattati
- Come consentire solo il traffico da un VPC al servizio Cloud Run
- Come configurare il traffico in uscita su un servizio Cloud Run (ad es. frontend) per comunicare con un servizio Cloud Run solo interno in entrata (ad es. il backend), mantenendo l'accesso a internet pubblico per il servizio frontend.
8. Esegui la pulizia
Per evitare addebiti involontari, ad esempio se questo servizio Cloud Run viene richiamato più volte rispetto all'allocazione mensile del richiamo di Cloud Run nel livello senza costi, puoi eliminare il servizio Cloud Run o eliminare il progetto che hai creato nel passaggio 2.
Per eliminare i servizi Cloud Run, vai alla console Cloud di Cloud Run all'indirizzo https://console.cloud.google.com/functions/ ed elimina i servizi $FRONTEND e $BACKEND che hai creato in questo codelab.
Se scegli di eliminare l'intero progetto, puoi andare all'indirizzo https://console.cloud.google.com/cloud-resource-manager, selezionare il progetto che hai creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai modificarli in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list
.