Arbeitslasten mit Dienstkonten bei Google Cloud APIs authentifizieren


Auf dieser Seite wird beschrieben, wie Sie mit Dienstkonten Anwendungen, die auf VM-Instanzen ausgeführt werden, die Authentifizierung bei Google Cloud APIs ermöglichen und den Zugriff auf Ressourcen autorisieren können.

Damit Sie Dienstkonten für die Authentifizierung verwenden können, müssen Sie zuerst dafür sorgen, dass Ihre VM für die Verwendung eines Dienstkontos konfiguriert ist. Dazu müssen Sie eines der folgenden Verfahren ausführen:

Hinweise

  • Lesen Sie den Leitfaden zu Dienstkonten.
  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud-Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich bei Compute Engine authentifizieren. Wählen Sie dazu eine der folgenden Optionen aus:

    Wenn Sie die Python Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. 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.

    Weitere Informationen unter Set up authentication for a local development environment.

Übersicht

Nachdem Sie eine VM-Instanz für die Ausführung mit einem Dienstkonto eingerichtet haben, kann eine auf der VM-Instanz ausgeführte Anwendung eine der folgenden Authentifizierungsmethoden verwenden:

Anwendungen mithilfe der Anmeldedaten des Dienstkontos authentifizieren

Nachdem Sie festgelegt haben, dass eine Instanz als Dienstkonto ausgeführt werden soll, können Sie die Anmeldedaten des Dienstkontos zum Authentifizieren von Anwendungen verwenden, die in dieser Instanz ausgeführt werden.

Anwendungen mit einer Clientbibliothek authentifizieren

Clientbibliotheken können Standardanmeldedaten für Anwendungen zum Authentifizieren bei Google APIs verwenden und Anforderungen an diese APIs senden. Mit Standardanmeldedaten für Anwendungen können Anwendungen Anmeldedaten aus mehreren Quellen erhalten, sodass Sie Ihre Anwendung lokal testen und danach einer Compute Engine-Instanz bereitstellen können, ohne den Anwendungscode ändern zu müssen.

Informationen zum Einrichten von Standardanmeldedaten für Anwendungen finden Sie unter Anmeldedaten für Standardanmeldedaten für Anwendungen bereitstellen.

In diesem Beispiel wird die Python-Clientbibliothek verwendet, um eine Anfrage zum Auflisten der Buckets in einem Projekt zu authentifizieren und an die Cloud Storage API zu senden. In diesem Beispiel wird das folgende Verfahren angewendet:

  1. Rufen Sie die erforderlichen Anmeldedaten zur Authentifizierung für die Cloud Storage API ab und initialisieren Sie den Cloud Storage-Dienst mit der Methode build() und den Anmeldedaten.
  2. Listen Sie Buckets in Cloud Storage auf.

Sie können dieses Beispiel auf einer Instanz ausführen, die die Berechtigung zum Verwalten von Buckets in Cloud Storage hat.

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)

Anwendungen direkt mit Zugriffstoken authentifizieren

Bei den meisten Anwendungen können Sie sich mit den Standardanmeldedaten für Anwendungen authentifizieren. Dabei werden Anmeldedaten gesucht und Tokens für Sie verwaltet. Wenn Sie für Ihre Anwendung jedoch ein OAuth2-Zugriffstoken angeben müssen, können Sie in Compute Engine ein Zugriffstoken von seinem Metadatenserver zur Verwendung in Ihrer Anwendung abrufen.

Es gibt verschiedene Möglichkeiten, wie Sie Zugriffstokens zur Authentifizierung Ihrer Anwendungen erhalten und verwenden können. Zum Beispiel können Sie curl verwenden, um eine einfache Anfrage zu erstellen, oder für mehr Flexibilität eine Programmiersprache wie Python nutzen.

cURL

So verwenden Sie curl, um ein Zugriffstoken anzufordern und eine Anfrage an eine API zu senden:

  1. Rufen Sie in der Instanz, in der Ihre Anwendung ausgeführt wird, ein Zugriffstoken vom Metadatenserver ab. Führen Sie dazu folgenden Befehl aus:

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

    Die Anfrage liefert eine Antwort ähnlich wie hier:

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

    Bei API-Anfragen müssen Sie den Wert access_token und nicht die gesamte Antwort angeben. Wenn Sie den jq-Befehlszeilen-JSON-Prozessor installiert haben, können Sie mit dem folgenden Befehl den Zugriffstokenwert aus der Antwort extrahieren:

    $ ACCESS_TOKEN=`curl \
    "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google" | jq -r '.access_token'`
    
  2. Kopieren Sie den Wert des Attributs access_token aus der Antwort und verwenden Sie ihn, um Anfragen an die API zu senden. Die folgende Anfrage gibt beispielsweise eine Liste der Instanzen aus einer bestimmten Zone in Ihrem Projekt zurück:

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

    Ersetzen Sie Folgendes:

    • PROJECT_ID: die Projekt-ID für diese Anfrage.
    • ZONE : die Zone, aus der VMs aufgelistet werden sollen.
    • ACCESS_TOKEN: der Zugriffstokenwert, den Sie im vorherigen Schritt erhalten haben.

    Weitere Informationen zu den Parametern, die Sie in Ihrer Anfrage festlegen können, finden Sie in der Dokumentation Systemparameter.

Python

Dieses Beispiel zeigt, wie Sie ein Token anfordern, um in einer Python-Anwendung Zugriff auf die Cloud Storage API zu erhalten. In diesem Beispiel wird das folgende Verfahren angewendet:

  1. Fordern Sie ein Zugriffstoken aus dem Metadatenserver an.
  2. Extrahieren Sie das Zugriffstoken aus der Antwort des Servers.
  3. Verwenden Sie das Zugriffstoken, um eine Anfrage an Cloud Storage zu senden.
  4. Wenn die Anfrage erfolgreich war, druckt das Skript die Antwort.

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)

Zugriffstoken verfallen schon nach kurzer Zeit. Der Metadatenserver behält die Zugriffstoken so lange im Cache, bis sie 5 Minuten Restzeit haben, bevor sie ablaufen. Wenn Tokens nicht im Cache gespeichert werden können, werden Anfragen, die mehr als 50 Abfragen pro Sekunde umfassen, möglicherweise auf eine bestimmte Rate beschränkt. Ihre Anwendungen müssen ein gültiges Zugriffstoken haben, damit ihre API-Aufrufe erfolgreich sind.

Tools in einer Instanz mithilfe eines Dienstkontos authentifizieren

Einige Anwendungen könnten Befehle der gcloud CLI verwenden, die standardmäßig in den meisten Compute Engine-Images enthalten ist. Die gcloud CLI erkennt automatisch das Dienstkonto einer Instanz und entsprechende Berechtigungen, die dem Dienstkonto zugewiesen wurden. Insbesondere dann, wenn Sie dem Dienstkonto die richtigen Rollen zugewiesen haben, können Sie die gcloud CLI Ihrer Instanz verwenden, ohne gcloud auth login verwenden zu müssen.

Diese Erkennung des Dienstkontos erfolgt automatisch und gilt nur für die gcloud CLI, die in der Instanz enthalten ist. Wenn Sie neue Tools erstellen oder benutzerdefinierte Tools hinzufügen, müssen Sie die Anwendung mithilfe einer Clientbibliothek oder mithilfe von Zugriffstokens direkt in der Anwendung authentifizieren.

Wenn Sie die Vorteile einer automatischen Erkennung des Dienstkontos nutzen möchten, können Sie dem Dienstkonto die entsprechenden IAM-Rollen zuweisen und das Dienstkonto an die Instanz anhängen. Wenn Sie zum Beispiel einem Dienstkonto die Rolle roles/storage.objectAdmin zuweisen, kann die gcloud CLI automatisch Cloud Storage-Objekte verwalten und abrufen.

Analog kann das gcloud compute-Tool Instanzen automatisch verwalten, wenn Sie roles/compute.instanceAdmin.v1 für das Dienstkonto aktivieren.

Nächste Schritte

Überzeugen Sie sich selbst

Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie einfach ein Konto, um die Leistungsfähigkeit von Compute Engine in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.

Compute Engine kostenlos testen