Proteggi il traffico verso un servizio con gcloud CLI

Questa pagina mostra come eseguire il deployment di un'API su API Gateway per proteggere il traffico verso un servizio di backend.

Segui questi passaggi per eseguire il deployment di una nuova API per accedere a un servizio di backend su Cloud Functions utilizzando Google Cloud CLI. Questa guida rapida descrive inoltre come utilizzare una chiave API per proteggere il backend da accessi non autorizzati.

Prima di iniziare

  1. Nella console Google Cloud, vai alla pagina Dashboard e seleziona o crea un progetto Google Cloud.

    Vai alla pagina Dashboard

  2. Verifica che la fatturazione sia abilitata per il tuo progetto.

    Scopri come attivare la fatturazione

  3. Assicurati che Google Cloud CLI sia scaricato e installato sulla tua macchina.

    Scarica gcloud CLI

  4. Aggiorna i gcloudcomponenti:

    gcloud components update
  5. Imposta il progetto predefinito. Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloud.

    gcloud config set project PROJECT_ID

Attivazione dei servizi richiesti

API Gateway richiede l'abilitazione dei seguenti servizi Google:

Nome Titolo
apigateway.googleapis.com API API Gateway
servicemanagement.googleapis.com API Service Management
servicecontrol.googleapis.com API Service Control

Per confermare che i servizi richiesti sono abilitati:

gcloud services list

Se i servizi richiesti non sono elencati, abilitali:

gcloud services enable apigateway.googleapis.com
gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com

Per maggiori informazioni sui servizi gcloud, vedi Servizi gcloud.

Deployment del backend di un'API

API Gateway si trova davanti a un servizio di backend di cui è stato eseguito il deployment e gestisce tutte le richieste in entrata. In questa guida rapida, API Gateway instrada le chiamate in arrivo al backend di una funzione Cloud Function denominato helloGET che contiene la funzione mostrata di seguito:

/**
 * HTTP Cloud Function.
 * This function is exported by index.js, and is executed when
 * you make an HTTP request to the deployed function's endpoint.
 *
 * @param {Object} req Cloud Function request context.
 *                     More info: https://expressjs.com/en/api.html#req
 * @param {Object} res Cloud Function response context.
 *                     More info: https://expressjs.com/en/api.html#res
 */

exports.helloGET = (req, res) => {
  res.send('Hello World!');
};

Segui i passaggi descritti nella Guida rapida all'utilizzo di Google Cloud CLI per scaricare il codice di esempio di Cloud Functions ed eseguire il deployment del servizio di backend Cloud Function.

Creazione di un'API

Ora tutto è pronto per la creazione dell'API su API Gateway.

  1. Inserisci il seguente comando, dove:

    • API_ID specifica il nome dell'API. Consulta i requisiti per gli ID API per consultare le linee guida relative alla denominazione delle API.
    • PROJECT_ID specifica il nome del tuo progetto Google Cloud.
    gcloud api-gateway apis create API_ID --project=PROJECT_ID

    Ad esempio:

    gcloud api-gateway apis create my-api --project=my-project
  2. Una volta completato, puoi usare il comando seguente per visualizzare i dettagli della nuova API:

    gcloud api-gateway apis describe API_ID --project=PROJECT_ID

    Ad esempio:

    gcloud api-gateway apis describe my-api --project=my-project

    Questo comando restituisce quanto segue:

      createTime: '2020-02-29T21:52:20.297426875Z'
      displayName: my-api
      managedService: my-api-123abc456def1.apigateway.my-project.cloud.goog
      name: projects/my-project/locations/global/apis/my-api
      state: ACTIVE
      updateTime: '2020-02-29T21:52:20.647923711Z'

Prendi nota del valore della proprietà managedService. Questo valore viene utilizzato per abilitare l'API in un passaggio successivo.

Creazione di una configurazione API

Prima di poter essere utilizzato per gestire il traffico verso il backend API di cui hai eseguito il deployment, API Gateway deve essere configurato.

Puoi creare una configurazione API utilizzando una specifica OpenAPI contenente annotazioni specializzate per definire il comportamento desiderato di API Gateway. La specifica OpenAPI utilizzata per questa guida rapida contiene le istruzioni di routing al backend della funzione Cloud Function:

# openapi2-functions.yaml
swagger: '2.0'
info:
  title: API_ID optional-string
  description: Sample API on API Gateway with a Google Cloud Functions backend
  version: 1.0.0
schemes:
  - https
produces:
  - application/json
paths:
  /hello:
    get:
      summary: Greet a user
      operationId: hello
      x-google-backend:
        address: https://GCP_REGION-PROJECT_ID.cloudfunctions.net/helloGET
      responses:
        '200':
          description: A successful response
          schema:
            type: string

Per caricare questa specifica OpenAPI e creare una configurazione API utilizzando gcloud CLI:

  1. Dalla riga di comando, crea un nuovo file denominato openapi2-functions.yaml.

  2. Copia e incolla i contenuti delle specifiche OpenAPI mostrate sopra nel file appena creato.

  3. Modifica il file come segue:

    1. Nel campo title, sostituisci API_ID con il nome dell'API e optional-string con una breve descrizione a tua scelta. Il valore di questo campo viene utilizzato durante la creazione di chiavi API che concedono l'accesso a questa API.
    2. Nel campo address, sostituisci GCP_REGION con la regione della piattaforma Google Cloud della funzione di cui hai eseguito il deployment e PROJECT_ID con il nome del tuo progetto Google Cloud.
  4. Inserisci il seguente comando, dove:

    • CONFIG_ID specifica il nome della configurazione API.
    • API_ID specifica il nome dell'API.
    • API_DEFINITION specifica il nome file della specifica OpenAPI.
    • PROJECT_ID specifica il nome del tuo progetto Google Cloud.
    • SERVICE_ACCOUNT_EMAIL specifica l'account di servizio utilizzato per firmare i token per i backend in cui è configurata l'autenticazione. Per ulteriori informazioni, vedi Configurare un account di servizio.
    gcloud api-gateway api-configs create CONFIG_ID \
      --api=API_ID --openapi-spec=API_DEFINITION \
      --project=PROJECT_ID --backend-auth-service-account=SERVICE_ACCOUNT_EMAIL

    Ad esempio:

    gcloud api-gateway api-configs create my-config \
      --api=my-api --openapi-spec=openapi2-functions.yaml \
      --project=my-project --backend-auth-service-account=0000000000000-compute@developer.gserviceaccount.com

    Il completamento di questa operazione potrebbe richiedere diversi minuti poiché la configurazione API viene propagata ai sistemi downstream. Il completamento della creazione di una configurazione API complessa potrebbe richiedere fino a dieci minuti.

  5. Dopo aver creato la configurazione API, puoi visualizzarne i dettagli eseguendo questo comando:

    gcloud api-gateway api-configs describe CONFIG_ID \
      --api=API_ID --project=PROJECT_ID

    Ad esempio:

    gcloud api-gateway api-configs describe my-config \
      --api=my-api --project=my-project

    L'output mostra i dettagli della configurazione API, tra cui nome e stato, come mostrato nell'esempio seguente:

    createTime: '2020-02-07T18:17:01.839180746Z'
    displayName: my-config
    gatewayConfig:
    backendConfig:
      googleServiceAccount: 0000000000000-compute@developer.gserviceaccount.com
    name: projects/my-project/locations/global/apis/my-api/configs/my-config
    serviceRollout:
    rolloutId: 2020-02-07r0
    state: ACTIVE
    updateTime: '2020-02-07T18:17:02.173778118Z'

Creazione di un gateway

Ora esegui il deployment della configurazione API su un gateway. Il deployment di una configurazione API su un gateway definisce un URL esterno che i client API possono utilizzare per accedere all'API.

Esegui questo comando per eseguire il deployment della configurazione API appena creata in API Gateway:

gcloud api-gateway gateways create GATEWAY_ID \
  --api=API_ID --api-config=CONFIG_ID \
  --location=GCP_REGION --project=PROJECT_ID

dove:

  • GATEWAY_ID specifica il nome del gateway.
  • API_ID specifica il nome dell'API API Gateway associata al gateway.
  • CONFIG_ID specifica il nome della configurazione API di cui è stato eseguito il deployment nel gateway.
  • GCP_REGION è la regione Google Cloud per il gateway di cui è stato eseguito il deployment.

  • PROJECT_ID specifica il nome del tuo progetto Google Cloud.

Ad esempio:

gcloud api-gateway gateways create my-gateway \
  --api=my-api --api-config=my-config \
  --location=us-central1 --project=my-project

Una volta completato, utilizza il comando seguente per visualizzare i dettagli del gateway:

gcloud api-gateway gateways describe GATEWAY_ID \
  --location=GCP_REGION --project=PROJECT_ID

Ad esempio:

gcloud api-gateway gateways describe my-gateway \
  --location=us-central1 --project=my-project

Questo comando restituisce quanto segue:

apiConfig: projects/my-project/locations/global/apis/my-api/configs/my-config
createTime: '2020-02-05T13:44:12.997862831Z'
defaultHostname: my-gateway-a12bcd345e67f89g0h.uc.gateway.dev
displayName: my-gateway
name: projects/my-project/locations/us-central1/gateways/my-gateway
serviceAccount:
      email: 0000000000000-compute@developer.gserviceaccount.com
state: ACTIVE
updateTime: '2020-02-05T13:45:00.844705087Z'

Prendi nota del valore della proprietà defaultHostname. Questa è la parte del nome host dell'URL del gateway che utilizzi per testare il deployment nel passaggio successivo.

Test del deployment dell'API

Ora puoi inviare richieste alla tua API utilizzando l'URL generato al momento del deployment del gateway.

Inserisci il seguente comando curl, dove:

  • DEFAULT_HOSTNAME specifica la parte del nome host dell'URL del gateway di cui è stato eseguito il deployment.
  • hello è il percorso specificato nella configurazione API.
curl https://DEFAULT_HOSTNAME/hello

Ad esempio:

curl https://my-gateway-a12bcd345e67f89g0h.uc.gateway.dev/hello

L'output è:

Hello World!

Hai creato ed eseguito correttamente il deployment di API Gateway.

Protezione dell'accesso con una chiave API

Per proteggere l'accesso al backend dell'API, genera una chiave API associata al progetto e concedi l'accesso alla chiave per chiamare l'API. Per ulteriori informazioni, consulta Limitazione dell'accesso all'API con le chiavi API.

Se non hai ancora una chiave API associata al progetto Google Cloud che stai utilizzando in questa guida rapida, puoi aggiungerne una seguendo i passaggi descritti in Creazione di una chiave API.

Per proteggere l'accesso al gateway utilizzando una chiave API:

  1. Attiva il supporto delle chiavi API per il tuo servizio. Inserisci il seguente comando, dove:
    • MANAGED_SERVICE_NAME specifica il nome del servizio gestito creato quando hai eseguito il deployment dell'API. Può essere visualizzata nella proprietà Managed Service elencata con il comando gcloud apigee-gateway apis describe.
    • PROJECT_ID specifica il nome del tuo progetto Google Cloud.
    gcloud services enable MANAGED_SERVICE_NAME.apigateway.PROJECT_ID.cloud.goog
    Ad esempio:
    gcloud services enable my-api-123abc456def1.apigateway.my-project.cloud.goog
  2. Modifica la specifica OpenAPI utilizzata per creare la configurazione API in modo da includere le istruzioni per applicare un criterio di sicurezza per la convalida delle chiavi API su tutto il traffico. Aggiungi il tipo security e securityDefinitions come mostrato di seguito:
      # openapi2-functions.yaml
      swagger: '2.0'
      info:
        title: API_ID optional-string
        description: Sample API on API Gateway with a Google Cloud Functions backend
        version: 1.0.0
      schemes:
        - https
      produces:
        - application/json
      paths:
        /hello:
          get:
            summary: Greet a user
            operationId: hello
            x-google-backend:
              address: https://GCP_REGION-PROJECT_ID.cloudfunctions.net/helloGET
            security:
            - api_key: []
            responses:
              '200':
                description: A successful response
                schema:
                  type: string
      securityDefinitions:
        # This section configures basic authentication with an API key.
        api_key:
          type: "apiKey"
          name: "key"
          in: "query"
    securityDefinition configura l'API in modo che richieda una chiave API passata come parametro di query denominato key quando richiedi l'accesso a tutti i percorsi definiti nella specifica.
  3. Crea una nuova configurazione API con la specifica OpenAPI modificata utilizzando il seguente comando:
    gcloud api-gateway api-configs create NEW_CONFIG_ID \
    --api=API_ID --openapi-spec=NEW_API_DEFINITION \
    --project=PROJECT_ID --backend-auth-service-account=SERVICE_ACCOUNT_EMAIL
    Ad esempio:
    gcloud api-gateway api-configs create my-config-key \
      --api=my-api --openapi-spec=openapi2-functions.yaml \
      --project=my-project --backend-auth-service-account=0000000000000compute@developer.gserviceaccount.com
  4. Esegui questo comando per aggiornare il gateway esistente con la nuova configurazione API:
    gcloud api-gateway gateways update GATEWAY_ID \
      --api=API_ID --api-config=NEW_CONFIG_ID \
      --location=GCP_REGION --project=PROJECT_ID
    Ad esempio:
    gcloud api-gateway gateways update my-gateway \
      --api=my-api --api-config=my-config-key \
      --location=us-central1 --project=my-project

Test della chiave API

Dopo aver creato l'API modificata e aver eseguito il deployment sulla stessa, prova a inviare una richiesta.

Inserisci il seguente comando curl, dove:

  • DEFAULT_HOSTNAME specifica la parte del nome host dell'URL del gateway di cui è stato eseguito il deployment.
  • hello è il percorso specificato nella configurazione API.
curl https://DEFAULT_HOSTNAME/hello

Ad esempio:

curl https://my-gateway-a12bcd345e67f89g0h.uc.gateway.dev/hello

Dovrebbe verificarsi il seguente errore:

UNAUTHENTICATED:Method doesn't allow unregistered callers (callers without established identity). Please use API Key or other form of API consumer identity to call this API.

Ora, inserisci il seguente comando curl dove:

  • DEFAULT_HOSTNAME specifica la parte del nome host dell'URL del gateway di cui è stato eseguito il deployment.
  • hello è il percorso specificato nella configurazione API.
  • API_KEY specifica la chiave API che hai creato nel passaggio precedente.
curl https://DEFAULT_HOSTNAME/hello?key=API_KEY

Ora dovresti vedere Hello World! nella risposta dell'API.

Complimenti! Hai protetto correttamente il backend dell'API con un API Gateway. Ora puoi iniziare l'onboarding di nuovi client API generando ulteriori chiavi API.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questa guida rapida, puoi:

In alternativa, puoi anche eliminare il progetto Google Cloud utilizzato per questo tutorial.

Passaggi successivi