Richiamare un endpoint privato utilizzando il registro dei servizi di Service Directory

Puoi scegliere come target un endpoint privato per le chiamate HTTP dall'esecuzione del workflow utilizzando il registro dei servizi di Service Directory con Workflows. In questo modo, puoi fornire al workflow un nome di servizio Service Directory. L'esecuzione del workflow utilizza le informazioni recuperate dal registro dei servizi per inviare la richiesta HTTP appropriata, senza uscire su una rete pubblica.

Questo documento mostra come registrare una macchina virtuale (VM) in una rete Virtual Private Cloud (VPC) come endpoint Service Directory:

  • Una rete VPC fornisce connettività per le tue istanze VM e ti consente di creare endpoint privati all'interno della rete VPC utilizzando indirizzi IP interni. Le chiamate HTTP a una risorsa di rete VPC vengono inviate su una rete privata applicando Identity and Access Management (IAM) e i Controlli di servizio VPC.

  • Service Directory è un registro dei servizi che archivia informazioni sui servizi di rete registrati, inclusi nomi, località e attributi. Indipendentemente dalla loro infrastruttura, puoi registrare automaticamente i servizi e acquisirne i dettagli. In questo modo, puoi scoprire, pubblicare e connettere i servizi su larga scala per tutti gli endpoint di servizio.

Questo diagramma fornisce una panoramica:

Invio di una richiesta HTTP a un numero di porta su un'istanza VM utilizzando le informazioni di Service Directory

A livello generale, devi:

  1. Concedere le autorizzazioni al service agent Cloud Workflows in modo che possa visualizzare le risorse Service Directory e accedere alle reti VPC utilizzando Service Directory.
  2. Creare una rete VPC per fornire funzionalità di rete.
  3. Creare una regola firewall VPC in modo da poter consentire o negare il traffico da o verso le istanze VM nella rete VPC.
  4. Creare un'istanza VM nella rete VPC. Un'istanza VM di Compute Engine è una macchina virtuale ospitata sull'infrastruttura di Google. I termini istanza Compute Engine, istanza VM e VM sono sinonimi e vengono utilizzati in modo intercambiabile.
  5. Eseguire il deployment di un'applicazione sulla VM. Puoi eseguire un'app sull'istanza VM e verificare che il traffico venga gestito come previsto.
  6. Configurare Service Directory in modo che l'esecuzione del workflow possa richiamare un endpoint Service Directory.

  7. Creare ed eseguire il deployment del workflow. Il valore private_service_name nel workflow specifica l'endpoint Service Directory che hai registrato nel passaggio precedente.

Concedere le autorizzazioni al service agent Cloud Workflows

Alcuni Google Cloud servizi hanno service agent che consentono ai servizi di accedere alle tue risorse. Se un'API richiede un service agent, Google lo crea dopo che hai attivato e utilizzato l'API.

  1. Quando esegui il deployment di un workflow per la prima volta, il service agent Cloud Workflows viene creato automaticamente con il seguente formato:

    service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com

    Puoi creare manualmente il account di servizio in un progetto senza workflow con questo comando:

    gcloud beta services identity create \
        --service=workflows.googleapis.com \
        --project=PROJECT_ID

    Sostituisci PROJECT_ID con l'ID progetto Google Cloud.

  2. Per visualizzare le risorse Service Directory, concedi il ruolo Visualizzatore Service Directory (servicedirectory.viewer) al service agent Workflows nel progetto:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \
        --role=roles/servicedirectory.viewer

    Sostituisci PROJECT_NUMBER con il tuo Google Cloud numero di progetto. Puoi trovare il numero di progetto nella pagina di benvenuto della Google Cloud console o eseguendo il seguente comando:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'
  3. Per accedere alle reti VPC utilizzando Service Directory, concedi il ruolo Servizio autorizzato Private Service Connect (roles/servicedirectory.pscAuthorizedService) al service agent Workflows nel progetto:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \
        --role=roles/servicedirectory.pscAuthorizedService

Creare una rete VPC

Una rete VPC è una versione virtuale di una rete fisica implementata all'interno della rete di produzione di Google. Fornisce connettività per le tue istanze VM di Compute Engine.

Puoi creare una rete VPC in modalità automatica o personalizzata. Ogni nuova rete che crei deve avere un nome univoco all'interno dello stesso progetto.

Ad esempio, il seguente comando crea una rete VPC in modalità automatica:

gcloud compute networks create NETWORK_NAME \
    --subnet-mode=auto

Sostituisci NETWORK_NAME con un nome per la rete VPC.

Per saperne di più, consulta Creare e gestire le reti VPC.

Creare una regola firewall VPC

Le regole firewall VPC consentono o negano il traffico da o verso le istanze VM in una rete VPC in base al numero di porta, al tag o al protocollo.

Le regole firewall VPC sono definite a livello di rete e si applicano solo alla rete in cui vengono create; tuttavia, il nome scelto per una regola deve essere univoco per il progetto.

Ad esempio, il seguente comando crea una regola firewall per la rete VPC creata in precedenza.

gcloud compute firewall-rules create RULE_NAME \
    --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \
    --direction=INGRESS \
    --action=ALLOW \
    --source-ranges=IP_ADDRESS_RANGE \
    --rules=all

Sostituisci quanto segue:

  • RULE_NAME: un nome per la regola firewall.

  • IP_ADDRESS_RANGE: uno o più intervalli di indirizzi IPv4 o IPv6. Come best practice, specifica gli intervalli di indirizzi IP specifici necessari per consentire l'accesso. Tieni presente quanto segue:

    • L'accesso alla rete privata per Service Directory utilizza 35.199.192.0/19 come intervallo solo interno con hop successivi che si trovano interamente all'interno della rete di Google. Per saperne di più, consulta Percorsi per Cloud DNS e Service Directory.

    • L'inclusione di 35.235.240.0/20 negli intervalli di origine consente le connessioni SSH che utilizzano l'inoltro TCP di Identity-Aware Proxy (IAP) se vengono soddisfatti tutti gli altri prerequisiti. Per saperne di più, consulta Utilizzare IAP per l'inoltro TCP.

    • Se utilizzi lo strumento SSH nel browser per connetterti alla tua VM Compute Engine dalla Google Cloud console, esistono requisiti specifici.

  • Il valore del flag --rules di all rende la regola firewall applicabile a tutti i protocolli e a tutte le porte di destinazione. Puoi restringere l'ambito specificando protocolli e porte.

  • Facoltativamente, puoi utilizzare i flag --target-tags e --target-service-accounts per definire le destinazioni; in caso contrario, la regola si applica a tutte le destinazioni nella rete.

Per saperne di più, consulta Utilizzare le regole firewall VPC.

Creare un'istanza VM nella rete VPC

Le istanze VM includono cluster Google Kubernetes Engine (GKE), istanze dell'ambiente flessibile di App Engine e altri Google Cloud prodotti basati su VM di Compute Engine. Per supportare l'accesso alla rete privata, una risorsa di rete VPC può essere un'istanza VM o un'altra destinazione supportata. Per saperne di più, consulta Panoramica dell'accesso alla rete privata.

Le istanze Compute Engine possono eseguire immagini pubbliche per Linux e Windows Server fornite da Google, nonché immagini private e personalizzate che puoi creare o importare dai tuoi sistemi esistenti. Puoi anche eseguire il deployment di container Docker.

Puoi scegliere le proprietà delle macchine delle tue istanze, come il numero di CPU virtuali e la quantità di memoria, utilizzando un insieme di tipi di macchine predefinite o creando i tuoi tipi di macchine personalizzate.

Ad esempio, il seguente comando crea un'istanza VM Linux da un'immagine pubblica con un'interfaccia di rete collegata alla rete VPC creata in precedenza.

  1. Crea e avvia un'istanza VM:

    gcloud compute instances create VM_NAME \
        --image-family=debian-11 \
        --image-project=debian-cloud \
        --machine-type=e2-micro \
        --network-interface network=projects/PROJECT_ID/global/networks/NETWORK_NAME

    Sostituisci VM_NAME con un nome per la VM.

  2. Se ti viene richiesto di confermare la zona per l'istanza, digita y.

    Dopo aver creato l'istanza VM, prendi nota dell'indirizzo INTERNAL_IP restituito.

  3. Nella Google Cloud console, vai alla pagina Istanze VM.

    Vai a Istanze VM

  4. Nella colonna Nome, fai clic sul nome dell'istanza VM appropriata.

  5. Se la VM è in esecuzione, per arrestarla, fai clic su Arresta.

  6. Per modificare la VM, fai clic su Modifica.

  7. Nella sezione Networking > Firewall, per consentire il traffico HTTP o HTTPS alla VM, seleziona Consenti traffico HTTP o Consenti traffico HTTPS.

    Per questo esempio, seleziona la casella di controllo Consenti traffico HTTP.

    Compute Engine aggiunge un tag di rete alla VM che associa la regola firewall alla VM. Crea quindi la regola firewall in entrata corrispondente che consente tutto il traffico in entrata su tcp:80 (HTTP) o tcp:443 (HTTPS).

  8. Per salvare le modifiche, fai clic su Salva.

  9. Per riavviare la VM, fai clic su Avvia/Riprendi.

Per saperne di più, consulta Creare e avviare un'istanza VM.

Eseguire il deployment di un'applicazione sulla VM

Per testare la configurazione di rete e verificare che il traffico venga gestito come previsto, puoi eseguire il deployment di un'app di base sulla VM che rimane in ascolto su una porta.

Ad esempio, i seguenti comandi creano un servizio web Node.js che rimane in ascolto sulla porta 3000.

  1. Stabilisci una connessione SSH all'istanza VM.

  2. Aggiorna i repository dei pacchetti:

    sudo apt update
  3. Installa NVM, Node.js, e npm.

    Per saperne di più, consulta Configurare un ambiente di sviluppo Node.js.

  4. Crea in modo interattivo un file package.json:

    npm init

    Ad esempio:

    {
    "name": "test",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
    "test": "hello"
    },
    "author": "",
    "license": "ISC"
    }
  5. Installa Express, un framework di applicazioni web per Node.js:

    npm install express
  6. Scrivi il codice per l'app di test:

    vim app.js

    L'esempio seguente crea un'app che risponde alle richieste GET al percorso principale (/) con il testo "Hello, world!"

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.status(200).send('Hello, world!').end();
    });
    
    app.listen(3000, () => {
      console.log('Sample app listening on port 3000.');
    });

    Prendi nota della porta su cui l'app rimane in ascolto. Lo stesso numero di porta deve essere utilizzato quando configuri l'endpoint per il servizio Service Directory.

  7. Verifica che l'app rimanga in ascolto sulla porta 3000:

    node app.js

Compute Engine offre una serie di opzioni di deployment. Per saperne di più, consulta Scegliere una strategia di deployment di Compute Engine per il tuo workload.

Configurare Service Directory

Per supportare la chiamata di un endpoint privato dall'esecuzione di un workflow, devi configurare uno spazio dei nomi Service Directory, registrare un servizio nello spazio dei nomi e aggiungere un endpoint al servizio.

Ad esempio, i seguenti comandi creano uno spazio dei nomi, un servizio e un endpoint che specifica la rete VPC e l'indirizzo IP interno dell'istanza VM.

  1. Crea uno spazio dei nomi:

    gcloud service-directory namespaces create NAMESPACE \
        --location=REGION

    Sostituisci quanto segue:

    • NAMESPACE: l'ID dello spazio dei nomi o l'identificatore completo dello spazio dei nomi.
    • REGION: la Google Cloud regione che contiene lo spazio dei nomi, ad esempio us-central1.
  2. Crea un servizio:

    gcloud service-directory services create SERVICE \
        --namespace=NAMESPACE \
        --location=REGION

    Sostituisci SERVICE con il nome del servizio che stai creando.

  3. Configura un endpoint.

    gcloud service-directory endpoints create ENDPOINT \
        --namespace=NAMESPACE \
        --service=SERVICE \
        --network=projects/PROJECT_NUMBER/locations/global/networks/NETWORK_NAME \
        --port=PORT_NUMBER \
        --address=IP_ADDRESS \
        --location=REGION

    Sostituisci quanto segue:

    • ENDPOINT: il nome dell'endpoint che stai creando.
    • PORT_NUMBER: la porta su cui è in esecuzione l'endpoint, ad esempio 3000.
    • IP_ADDRESS: l'indirizzo IPv6 o IPv4 dell'endpoint; questo è l'indirizzo IP interno che hai annotato in precedenza.

Per saperne di più, consulta Configurare Service Directory e Configurare l'accesso alla rete privata.

Creare ed eseguire il deployment del workflow

La chiamata o l'invocazione di un endpoint privato da Workflows viene eseguita tramite una richiesta HTTP. I metodi di richiesta HTTP più comuni hanno un collegamento di chiamata (ad esempio http.get e http.post), ma puoi effettuare qualsiasi tipo di richiesta HTTP impostando il campo call su http.request e specificando il tipo di richiesta utilizzando il campo method. Per saperne di più, consulta Effettuare una richiesta HTTP.

  1. Crea un file di codice sorgente per il workflow:

    touch call-private-endpoint.JSON_OR_YAML

    Sostituisci JSON_OR_YAML con yaml o json a seconda del formato del workflow.

  2. In un editor di testo, copia il seguente workflow (che in questo caso utilizza un protocollo HTTP per il valore url) nel file di codice sorgente:

    YAML

    main:
      steps:
        - checkHttp:
            call: http.get
            args:
              url: http://IP_ADDRESS
              private_service_name: "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE"
            result: res
        - ret:
            return: ${res}

    JSON

    {
      "main": {
        "steps": [
          {
            "checkHttp": {
              "call": "http.get",
              "args": {
                "url": "http://IP_ADDRESS",
                "private_service_name": "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE"
              },
              "result": "res"
            }
          },
          {
            "ret": {
              "return": "${res}"
            }
          }
        ]
      }
    }

    Il valore private_service_name deve essere una stringa che specifica un nome di servizio Service Directory registrato con il seguente formato:

    projects/PROJECT_ID/locations/LOCATION/namespaces/NAMESPACE_NAME/services/SERVICE_NAME

  3. Esegui il deployment del workflow. A scopo di test, puoi collegare il service account predefinito di Compute Engine al workflow per rappresentarne l'identità:

    gcloud workflows deploy call-private-endpoint \
        --source=call-private-endpoint.JSON_OR_YAML \
        --location=REGION \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
  4. Esegui il workflow:

    gcloud workflows run call-private-endpoint \
        --location=REGION

    Dovresti vedere un risultato simile al seguente:

    argument: 'null'
    duration: 0.650784403s
    endTime: '2023-06-09T18:19:52.570690079Z'
    name: projects/968807934019/locations/us-central1/workflows/call-private-endpoint/executions/4aac88d3-0b54-419b-b364-b6eb973cc932
    result: '{"body":"Hello, world!","code":200,"headers":{"Connection":"keep-alive","Content-Length":"21","Content-Type":"text/html;
    charset=utf-8","Date":"Fri, 09 Jun 2023 18:19:52 GMT","Etag":"W/\"15-NFaeBgdti+9S7zm5kAdSuGJQm6Q\"","Keep-Alive":"timeout=5","X-Powered-By":"Express"}}'
    startTime: '2023-06-09T18:19:51.919905676Z'
    state: SUCCEEDED

Passaggi successivi