Python-Clientbibliothek verwenden

In diesem Dokument wird erläutert, wie die Google Python-Clientbibliothek für Google Compute Engine verwendet wird. Dabei erfahren Sie, wie Anfragen autorisiert sowie Instanzen erstellt, aufgelistet und beendet werden. Im Rahmen dieser Übung wird gezeigt, wie die google-api-python-client-Bibliothek für den Zugriff auf Google Compute Engine-Ressourcen verwendet wird. Sie können dieses Beispiel auf Ihrem lokalen Computer oder in einer VM-Instanz ausführen, wenn Sie das Beispiel richtig autorisiert haben.

Eine vollständige Liste der verfügbaren Clientbibliotheken, einschließlich weiterer Google-Clientbibliotheken und Open Source-Bibliotheken von Drittanbietern, finden Sie auf der Seite "Clientbibliotheken".

Wenn Sie diese Übung überspringen und sich das vollständige Codebeispiel ansehen möchten, besuchen Sie die GitHub-Seite GoogleCloudPlatform/python-docs-samples.

Ziele

  • OAuth 2.0-Autorisierung mit der oauth2client-Bibliothek ausführen
  • Instanz mit der google-python-client-Bibliothek erstellen
  • Instanzen mit der google-python-client-Bibliothek auflisten
  • Instanz mit der google-python-client-Bibliothek löschen

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten der Cloud Platform verwendet, einschließlich Google Compute Engine.

Neuen Nutzern der Cloud Platform steht möglicherweise eine kostenlose Testversion zur Verfügung.

Vorbereitung

  1. Melden Sie sich in Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, registrieren Sie sich hier für ein neues Konto.

  2. Wählen Sie ein Google Cloud Platform-Projekt aus oder erstellen Sie eines.

    Zur Seite "Ressourcen verwalten"

  3. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Platform-Projekt aktiviert ist.

    Informationen zum Aktivieren der Abrechnung

  4. Installieren Sie das Cloud SDK.
  5. Nach der Installation führen Sie gcloud auth application-default login aus.
  6. Installieren Sie die google-api-python-client-Bibliothek. In der Regel können Sie dazu folgenden Befehl ausführen:
    $ pip install --upgrade google-api-python-client

    Weitere Informationen zur Installation dieser Bibliothek finden Sie in der Installationsanleitung. Zur Ausführung der Google Python-Clientbibliothek benötigen Sie außerdem Python 2.7 oder 3.3+.

  7. Aktivieren Sie die Google Cloud Storage API.
  8. Erstellen Sie einen Storage-Bucket und notieren Sie sich den Bucket-Namen.

Anfragen autorisieren

In diesem Beispiel wird die OAuth 2.0-Autorisierung verwendet. Es gibt verschiedene Möglichkeiten, um Anfragen mit OAuth 2.0 zu autorisieren. In diesem Beispiel werden jedoch die Standardanmeldedaten für Anwendungen verwendet. Dadurch können Sie die Anmeldedaten über das gcloud-Tool wiederverwenden, wenn Sie das Beispiel auf einer lokalen Workstation ausführen, oder Sie können die Anmeldedaten über ein Dienstkonto wiederverwenden, wenn Sie das Beispiel in Compute Engine oder App Engine ausführen. Sie sollten das gcloud-Tool im Abschnitt Vorbereitung installiert und autorisiert haben.

Standardanmeldedaten für Anwendungen werden in Google API-Clientbibliotheken automatisch bereitgestellt. Sie müssen die API lediglich erstellen und initialisieren:

compute = googleapiclient.discovery.build('compute', 'v1')

Das folgende Snippet ist z. B. die Hauptmethode dieses Beispiels, in dem die API erstellt und initialisiert wird. Anschließend werden Aufrufe vorgenommen, um eine Instanz zu erstellen, aufzulisten und zu löschen:

def main(project, bucket, zone, instance_name, wait=True):
    compute = googleapiclient.discovery.build('compute', 'v1')

    print('Creating instance.')

    operation = create_instance(compute, project, zone, instance_name, bucket)
    wait_for_operation(compute, project, zone, operation['name'])

    instances = list_instances(compute, project, zone)

    print('Instances in project %s and zone %s:' % (project, zone))
    for instance in instances:
        print(' - ' + instance['name'])

    print("""
Instance created.
It will take a minute or two for the instance to complete work.
Check this URL: http://storage.googleapis.com/{}/output.png
Once the image is uploaded press enter to delete the instance.
""".format(bucket))

    if wait:
        input()

    print('Deleting instance.')

    operation = delete_instance(compute, project, zone, instance_name)
    wait_for_operation(compute, project, zone, operation['name'])

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('project_id', help='Your Google Cloud project ID.')
    parser.add_argument(
        'bucket_name', help='Your Google Cloud Storage bucket name.')
    parser.add_argument(
        '--zone',
        default='us-central1-f',
        help='Compute Engine zone to deploy to.')
    parser.add_argument(
        '--name', default='demo-instance', help='New instance name.')

    args = parser.parse_args()

    main(args.project_id, args.bucket_name, args.zone, args.name)

Instanzen auflisten

Mit der Python-Clientbibliothek können Sie die Methode compute.instances().list verwenden, um Instanzen aufzulisten. Sie müssen die Projekt-ID und die Zone angeben, für die Instanzen aufgelistet werden sollen. Beispiel:

def list_instances(compute, project, zone):
    result = compute.instances().list(project=project, zone=zone).execute()
    return result['items'] if 'items' in result else None

Instanz hinzufügen

Wenn Sie eine Instanz hinzufügen möchten, verwenden Sie die Methode instances().insert und geben Sie die Attribute der neuen Instanz an. Sie werden im Anfragetext angegeben. Details zu jedem Attribut erhalten Sie in der API-Referenz für instances.insert.

Die Anfrage muss mindestens Werte für die folgenden Attribute enthalten, wenn eine neue Instanz erstellt wird:

  • Instanzname
  • Nichtflüchtiger Root-Speicher
  • Maschinentyp
  • Zone
  • Netzwerkschnittstellen

Dieses Beispiel startet eine Instanz mit den folgenden Properties in einer Zone Ihrer Wahl:

  • Maschinentyp: n1-Standard-1
  • Nichtflüchtiger Root-Speicher: ein neuer nichtflüchtiger Speicher, der auf dem neuesten Debian 8-Image basiert
  • Das Compute Engine-Standarddienstkonto mit den folgenden Bereichen:

    • https://www.googleapis.com/auth/devstorage.read_write – damit die Instanz Dateien in Google Cloud Storage lesen und schreiben kann
    • https://www.googleapis.com/auth/logging.write – damit die Instanz-Logs in Google Cloud Logging hochgeladen werden können
  • Metadaten zur Angabe von Befehlen, die die Instanz beim Hochfahren ausführen soll

def create_instance(compute, project, zone, name, bucket):
    # Get the latest Debian Jessie image.
    image_response = compute.images().getFromFamily(
        project='debian-cloud', family='debian-9').execute()
    source_disk_image = image_response['selfLink']

    # Configure the machine
    machine_type = "zones/%s/machineTypes/n1-standard-1" % zone
    startup_script = open(
        os.path.join(
            os.path.dirname(__file__), 'startup-script.sh'), 'r').read()
    image_url = "http://storage.googleapis.com/gce-demo-input/photo.jpg"
    image_caption = "Ready for dessert?"

    config = {
        'name': name,
        'machineType': machine_type,

        # Specify the boot disk and the image to use as a source.
        'disks': [
            {
                'boot': True,
                'autoDelete': True,
                'initializeParams': {
                    'sourceImage': source_disk_image,
                }
            }
        ],

        # Specify a network interface with NAT to access the public
        # internet.
        'networkInterfaces': [{
            'network': 'global/networks/default',
            'accessConfigs': [
                {'type': 'ONE_TO_ONE_NAT', 'name': 'External NAT'}
            ]
        }],

        # Allow the instance to access cloud storage and logging.
        'serviceAccounts': [{
            'email': 'default',
            'scopes': [
                'https://www.googleapis.com/auth/devstorage.read_write',
                'https://www.googleapis.com/auth/logging.write'
            ]
        }],

        # Metadata is readable from the instance and allows you to
        # pass configuration from deployment scripts to instances.
        'metadata': {
            'items': [{
                # Startup script is automatically executed by the
                # instance upon startup.
                'key': 'startup-script',
                'value': startup_script
            }, {
                'key': 'url',
                'value': image_url
            }, {
                'key': 'text',
                'value': image_caption
            }, {
                'key': 'bucket',
                'value': bucket
            }]
        }
    }

    return compute.instances().insert(
        project=project,
        zone=zone,
        body=config).execute()

In den folgenden Abschnitten werden die Parameter für das Erstellen von Instanzen beschrieben.

Nichtflüchtige Root-Speicher

Alle Instanzen müssen von einem nichtflüchtigen Root-Speicher gestartet werden. Der nichtflüchtige Root-Speicher enthält alle erforderlichen Dateien für das Starten einer Instanz. Beim Erstellen eines nichtflüchtigen Root-Speichers müssen Sie das Betriebssystem-Quell-Image angeben, das auf das Laufwerk angewendet werden soll. Im obigen Beispiel haben Sie gleichzeitig einen neuen, auf Debian 8 basierenden nichtflüchtigen Root-Speicher und eine Instanz erstellt. Sie können ein Laufwerk aber auch vorher erstellen und der Instanz zuordnen.

Instanzmetadaten

Beim Erstellen der Instanz sollten Sie Instanzmetadaten wie ein Startskript, Konfigurationsvariablen und ssh-Schlüssel hinzufügen. Im obigen Beispiel haben Sie das Feld metadata im Anfragetext zur Angabe eines Startskripts für die Instanz sowie einiger Konfigurationsvariablen als Schlüssel/Wert-Paare verwendet. Im unten aufgeführten Startskript wird dargestellt, wie diese Variablen gelesen und verwendet werden, um Text auf ein Image anzuwenden und dieses in Google Cloud Storage hochzuladen.

apt-get update
apt-get -y install imagemagick

# Use the metadata server to get the configuration specified during
# instance creation. Read more about metadata here:
# https://cloud.google.com/compute/docs/metadata#querying
IMAGE_URL=$(curl http://metadata/computeMetadata/v1/instance/attributes/url -H "Metadata-Flavor: Google")
TEXT=$(curl http://metadata/computeMetadata/v1/instance/attributes/text -H "Metadata-Flavor: Google")
CS_BUCKET=$(curl http://metadata/computeMetadata/v1/instance/attributes/bucket -H "Metadata-Flavor: Google")

mkdir image-output
cd image-output
wget $IMAGE_URL
convert * -pointsize 30 -fill white -stroke black -gravity center -annotate +10+40 "$TEXT" output.png

# Create a Google Cloud Storage bucket.
gsutil mb gs://$CS_BUCKET

# Store the image in the Google Cloud Storage bucket and allow all users
# to read it.
gsutil cp -a public-read output.png gs://$CS_BUCKET/output.png

Instanz löschen

Zum Löschen einer Instanz müssen Sie die Methode instances().delete aufrufen und Namen, Zone und Projekt-ID der zu löschenden Instanz angeben. Da Sie den Parameter autoDelete für das Bootlaufwerk festgelegt haben, wird dieses beim Löschen der Instanz ebenfalls gelöscht. Diese Einstellung ist standardmäßig deaktiviert, ist aber nützlich, wenn der Anwendungsfall erfordert, dass Laufwerke und Instanzen gemeinsam gelöscht werden.

def delete_instance(compute, project, zone, name):
    return compute.instances().delete(
        project=project,
        zone=zone,
        instance=name).execute()

Beispiel ausführen

Sie können das vollständige Beispiel ausführen, indem Sie den Code herunterladen und in der Befehlszeile ausführen. Laden Sie dafür die Dateien create_instance.py und startup-script.sh herunter. So führen Sie das Beispiel aus:

python create_instance.py --name [INSTANCE_NAME] --zone [ZONE] [PROJECT_ID] [CLOUD_STORAGE_BUCKET]

Dabei gilt:

  • [INSTANCE_NAME] ist der Name der zu erstellenden Instanz.
  • [ZONE] ist die gewünschte Zone für diese Anfrage.
  • [PROJECT_ID] ist unsere Projekt-ID.
  • [CLOUD_STORAGE_BUCKET] ist der Name des Buckets, den Sie ursprünglich eingerichtet haben, aber ohne das Präfix gs://.

Beispiel:

python python-example.py --name example-instance --zone us-central1-a example-project my-gcs-bucket

Auf Abschluss von Vorgängen warten

Bei Anfragen an die Google Compute Engine API, durch die Ressourcen wie Instanzen geändert werden, wird sofort eine Antwort zur Bestätigung der Anfrage zurückgegeben. Mit der Bestätigung können Sie auch den Status des angeforderten Vorgangs prüfen. Der Abschluss von Vorgängen kann einige Minuten dauern. Deshalb ist es oft einfacher, auf den Abschluss des Vorgangs zu warten, bevor Sie fortfahren. Die folgende Hilfsmethode wartet, bis der Vorgang abgeschlossen ist, bevor Daten zurückgegeben werden:

def wait_for_operation(compute, project, zone, operation):
    print('Waiting for operation to finish...')
    while True:
        result = compute.zoneOperations().get(
            project=project,
            zone=zone,
            operation=operation).execute()

        if result['status'] == 'DONE':
            print("done.")
            if 'error' in result:
                raise Exception(result['error'])
            return result

        time.sleep(1)

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud Platform-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

Cloud Storage-Bucket löschen

So löschen Sie einen Cloud Storage-Bucket:

  1. Rufen Sie in der GCP Console den Cloud Storage-Browser auf.

    Weiter zum Cloud Storage-Browser

  2. Klicken Sie auf das Kästchen neben dem Bucket, den Sie löschen möchten.
  3. Klicken Sie oben auf der Seite auf die Schaltfläche Löschen, um den Bucket zu löschen.

Weitere Informationen

  • Laden Sie das vollständige Codebeispiel herunterladen und sehen Sie es sich an. Es enthält ein kleines Beispiel für die gemeinsame Verwendung dieser Methoden. Sie können es nach Bedarf herunterladen, ändern und ausführen.
  • In der API-Referenz finden Sie weitere Informationen, wie sich andere Aufgaben mit der API ausführen lassen.
  • Eigene Anwendungen erstellen
Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Compute Engine-Dokumentation