Autentica i carichi di lavoro per le API Google Cloud utilizzando gli account di servizio


Questa pagina descrive come utilizzare i service account per consentire alle app in esecuzione sulle istanze di macchine virtuali (VM) di autenticarsi alle API di Google Cloud e autorizzare l'accesso alle risorse.

Per utilizzare i service account per l'autenticazione, devi prima assicurarti che la VM sia configurata per utilizzare unaccount di serviziot. Per farlo, completa una delle seguenti procedure:

Prima di iniziare

  • Consulta la panoramica degli account di servizio.
  • Se non l'hai ancora fatto, configura l'autenticazione. L'autenticazione è il processo mediante il quale la tua identità viene verificata per l'accesso ai Google Cloud servizi e alle API. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti su Compute Engine selezionando una delle seguenti opzioni:

    Per utilizzare gli esempi di Python questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura le Credenziali predefinite dell'applicazione con le tue credenziali utente.

    1. Install the Google Cloud CLI.

    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. To initialize the gcloud CLI, run the following command:

      gcloud init
    4. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Per ulteriori informazioni, vedi Set up authentication for a local development environment.

Panoramica

Dopo aver configurato un'istanza VM da eseguire utilizzando un account di servizio, un'applicazione in esecuzione sull'istanza VM può utilizzare uno dei seguenti metodi per l'autenticazione:

Autenticazione delle applicazioni utilizzando le credenziali del account di servizio

Dopo aver configurato un'istanza da eseguire come account di servizio, puoi utilizzare le credenziali account di servizio per autenticare le applicazioni in esecuzione sull'istanza.

Autenticare le applicazioni con una libreria client

Le librerie client possono utilizzare le credenziali predefinite dell'applicazione per autenticarsi con le API di Google e inviare richieste a queste API. Credenziali predefinite dell'applicazione consentono alle applicazioni di ottenere automaticamente le credenziali da più origini, in modo da poter testare l'applicazione localmente e poi eseguirne il deployment in un'istanza Compute Engine senza modificare il codice dell'applicazione.

Per informazioni sulla configurazione Credenziali predefinite dell'applicazione, vedi Fornire le credenziali alle credenziali predefinite dell'applicazione.

Questo esempio utilizza la libreria client Python per autenticare ed effettuare una richiesta all'API Cloud Storage per elencare i bucket in un progetto. L'esempio utilizza la seguente procedura:

  1. Ottieni le credenziali di autenticazione necessarie per l'API Cloud Storage e inizializza il servizio Cloud Storage con il metodo build() e le credenziali.
  2. Elenca i bucket in Cloud Storage.

Puoi eseguire questo esempio su un'istanza che ha accesso alla gestione dei bucket in Cloud Storage.

import argparse
from typing import List

from google.cloud import storage


def create_client() -> storage.Client:
    """
    Construct a client object for the Storage API using the
    application default credentials.

    Returns:
        Storage API client object.
    """
    # Construct the service object for interacting with the Cloud Storage API -
    # the 'storage' service, at version 'v1'.
    # Authentication is provided by application default credentials.
    # When running locally, these are available after running
    # `gcloud auth application-default login`. When running on Compute
    # Engine, these are available from the environment.
    return storage.Client()


def list_buckets(client: storage.Client, project_id: str) -> List[storage.Bucket]:
    """
    Retrieve bucket list of a project using provided client object.


    Args:
        client: Storage API client object.
        project_id: name of the project to list buckets from.

    Returns:
        List of Buckets found in the project.
    """
    buckets = client.list_buckets()
    return list(buckets)


def main(project_id: str) -> None:
    client = create_client()
    buckets = list_buckets(client, project_id)
    print(buckets)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud Project ID.")

    args = parser.parse_args()

    main(args.project_id)

Autenticazione delle applicazioni direttamente con i token di accesso

Per la maggior parte delle applicazioni, puoi autenticarti utilizzando le credenziali predefinite dell'applicazione, che trova le credenziali e gestisce i token per te. Tuttavia, se la tua applicazione richiede di fornire un token di accesso OAuth2, Compute Engine ti consente di ottenere un token di accesso dal suo server di metadati da utilizzare nella tua applicazione.

Esistono diverse opzioni per ottenere e utilizzare questi token di accesso per autenticare le tue applicazioni. Ad esempio, puoi utilizzare curl per creare una richiesta semplice oppure un linguaggio di programmazione come Python per una maggiore flessibilità.

cURL

Per utilizzare curl per richiedere un token di accesso e inviare una richiesta a un'API:

  1. Nell'istanza in cui viene eseguita l'applicazione, invia una query al server di metadati per un token di accesso eseguendo questo comando:

    $ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google"

    La richiesta restituisce una risposta simile a:

    {
          "access_token":"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_QtAS08i85nHq39HE3C2LTrCARA",
          "expires_in":3599,
          "token_type":"Bearer"
     }

    Per le richieste API devi includere il valore access_token, non l'intera risposta. Se hai installato il processore JSON a riga di comando jq, puoi utilizzare il seguente comando per estrarre il valore del token di accesso dalla risposta:

    $ ACCESS_TOKEN=`curl \
    "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google" | jq -r '.access_token'`
    
  2. Copia il valore della proprietà access_token dalla risposta e utilizzalo per inviare richieste all'API. Ad esempio, la seguente richiesta stampa un elenco di istanze nel tuo progetto da una determinata zona:

    $ curl https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances \
    -H "Authorization":"Bearer ACCESS_TOKEN"
    

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID progetto per questa richiesta.
    • ZONE: la zona da cui elencare le VM.
    • ACCESS_TOKEN: il valore del token di accesso che hai ottenuto nel passaggio precedente.

    Per informazioni sui parametri che puoi impostare nella richiesta, consulta la documentazione relativa ai parametri di sistema.

Python

Questo esempio mostra come richiedere un token per accedere all'API Cloud Storage in un'applicazione Python. L'esempio utilizza la seguente procedura:

  1. Richiedi un token di accesso al server di metadati.
  2. Estrai il token di accesso dalla risposta del server.
  3. Utilizza il token di accesso per effettuare una richiesta a Cloud Storage.
  4. Se la richiesta ha esito positivo, lo script stampa la risposta.

import argparse

import requests


METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/"
METADATA_HEADERS = {"Metadata-Flavor": "Google"}
SERVICE_ACCOUNT = "default"


def get_access_token() -> str:
    """
    Retrieves access token from the metadata server.

    Returns:
        The access token.
    """
    url = f"{METADATA_URL}instance/service-accounts/{SERVICE_ACCOUNT}/token"

    # Request an access token from the metadata server.
    r = requests.get(url, headers=METADATA_HEADERS)
    r.raise_for_status()

    # Extract the access token from the response.
    access_token = r.json()["access_token"]

    return access_token


def list_buckets(project_id: str, access_token: str) -> dict:
    """
    Calls Storage API to retrieve a list of buckets.

    Args:
        project_id: name of the project to list buckets from.
        access_token: access token to authenticate with.

    Returns:
        Response from the API.
    """
    url = "https://www.googleapis.com/storage/v1/b"
    params = {"project": project_id}
    headers = {"Authorization": f"Bearer {access_token}"}

    r = requests.get(url, params=params, headers=headers)
    r.raise_for_status()

    return r.json()


def main(project_id: str) -> None:
    """
    Retrieves access token from metadata server and uses it to list
    buckets in a project.

    Args:
        project_id: name of the project to list buckets from.
    """
    access_token = get_access_token()
    buckets = list_buckets(project_id, access_token)
    print(buckets)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud project ID.")

    args = parser.parse_args()

    main(args.project_id)

I token di accesso scadono dopo un breve periodo di tempo. Il server dei metadati memorizza nella cache i token di accesso fino a quando non rimangono 5 minuti prima della scadenza. Se i token non possono essere memorizzati nella cache, le richieste che superano le 50 query al secondo potrebbero essere soggette a limitazioni di frequenza. Perché le chiamate API vadano a buon fine, le tue applicazioni devono avere un token di accesso valido.

Autenticazione degli strumenti su un'istanza utilizzando un account di servizio

Alcune applicazioni potrebbero utilizzare comandi di gcloud CLI, che è inclusa per impostazione predefinita nella maggior parte delle immagini Compute Engine. gcloud CLI riconosce automaticamente il service account di un'istanza e le autorizzazioni pertinenti concesse al account di servizio. In particolare, se concedi i ruoli corretti al account di servizio, puoi utilizzare la gcloud CLI dalle tue istanze senza dover utilizzare gcloud auth login.

Il riconoscimento di questo account di servizio avviene automaticamente e si applica solo alla gcloud CLI inclusa nell'istanza. Se crei nuovi strumenti o aggiungi strumenti personalizzati, devi autorizzare la tua applicazione utilizzando una libreria client o utilizzando token di accesso direttamente nella tua applicazione.

Per sfruttare il riconoscimento automatico del account di servizio, concedi i ruoli IAM appropriati al account di servizio e collega il account di servizio all'istanza. Ad esempio, se concedi a un account di servizio il ruolo roles/storage.objectAdmin, l'gcloud CLI può gestire e accedere automaticamente agli oggetti Cloud Storage.

Allo stesso modo, se abiliti roles/compute.instanceAdmin.v1 per il account di servizio, lo strumento gcloud compute può gestire automaticamente le istanze.

Passaggi successivi

Provalo

Se non conosci Google Cloud, crea un account per valutare le prestazioni di Compute Engine in scenari reali. I nuovi clienti ricevono anche 300 $ di crediti senza addebiti per l'esecuzione, il test e il deployment dei workload.

Fai una prova senza costi di Compute Engine