boto-Clientbibliothek-Plug-in

Diese Anleitung beschreibt, wie Sie ein einfaches Python-Programm schreiben, das grundlegende Cloud Storage-Vorgänge mithilfe der XML API ausführt. In diesem Dokument wird davon ausgegangen, dass Sie mit Python und den in der Kurzanleitung zur GCP Console erläuterten Cloud Storage-Konzepten und -Vorgängen vertraut sind.

Sollten Sie stattdessen Cloud Storage-Clientbibliotheken verwenden?

Generell empfiehlt sich bei der Arbeit mit Cloud Storage-Buckets und -Objekten die Verwendung der Cloud Storage-Clientbibliothek für Python. Cloud Storage-Clientbibliotheken sind flexibler und auch in den Codebeispielen in den Cloud Storage-Anleitungen werden Cloud Storage-Clientbibliotheken verwendet. Nutzen Sie die vorliegende Anleitung, wenn Sie explizit über die XML API und boto-Bibliothek mit Cloud Storage interagieren möchten.

Umgebung einrichten

Führen Sie vor Verwendung dieser Anleitung die folgenden Schritte aus:

  1. Installieren Sie eine eigenständige Version von gsutil auf Ihrem Computer.

  2. Installieren Sie die boto-Bibliothek und gcs-oauth2-boto-plugin.

    boto ist eine Open-Source-Python-Bibliothek, die als Schnittstelle zu Cloud Storage verwendet wird. gcs-oauth2-boto-plugin ist ein Authentifizierungs-Plug-in für das Framework des boto-Authentifizierungs-Plug-ins. Es enthält OAuth 2.0-Anmeldedaten für die Verwendung mit Cloud Storage.

    Die Einrichtung der boto-Bibliothek und des oauth2-Plug-ins hängt vom verwendeten System ab. Die nachfolgenden Einrichtungsbeispiele dienen als Leitfaden. Mit diesen Befehlen wird das pip-Tool installiert und anschließend für die Installation weiterer Pakete verwendet. Die letzten drei Befehle dienen zum Testen des Imports der beiden Module, um die Installation zu prüfen.

    Debian und Ubuntu

    wget https://bootstrap.pypa.io/get-pip.py
    sudo python get-pip.py
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install gcc python-dev python-setuptools libffi-dev libssl-dev
    sudo pip install virtualenv
    virtualenv venv
    source ./venv/bin/activate
    (venv)pip install gcs-oauth2-boto-plugin
    (venv)python
    >>>import boto
    >>>import gcs_oauth2_boto_plugin

    CentOS, RHEL und Fedora

    wget https://bootstrap.pypa.io/get-pip.py
    sudo python get-pip.py
    sudo yum install gcc openssl-devel python-devel python-setuptools libffi-devel
    sudo pip install virtualenv
    virtualenv venv
    source ./venv/bin/activate
    (venv)pip install gcs-oauth2-boto-plugin
    (venv)python
    >>>import boto
    >>>import gcs_oauth2_boto_plugin
  3. Richten Sie Ihre boto-Konfigurationsdatei für die Verwendung von OAuth2.0 ein.

    Sie können für die boto-Konfigurationsdatei wahlweise Dienstkonto- oder Nutzerkonto-Anmeldedaten verwenden. Dienstkonto-Anmeldedaten werden für die Authentifizierung im Namen eines Dienstes oder einer Anwendung bevorzugt. Nutzerkonto-Anmeldedaten sind die bevorzugte Wahl für Authentifizierungsanfragen im Namen eines bestimmten Nutzers, also einer Person. Weitere Informationen zu den beiden Arten von Anmeldedaten finden Sie unter Unterstützte Anmeldedaten.

    Dienstkonten

    So verwenden Sie Anmeldeinformationen für Dienstkonten:

    1. Nutzen Sie ein vorhandenes Dienstkonto oder erstellen Sie ein neues Konto. Laden Sie anschließend den zugehörigen privaten Schlüssel herunter. Das Herunterladen des Schlüssels als .json-Datei ist die Standardeinstellung und wird bevorzugt. Das Format .p12 wird jedoch auch unterstützt.

    2. Konfigurieren Sie die Datei .boto mit dem Dienstkonto. Sie können hierfür gsutil verwenden:

      gsutil config -e

      Der Befehl fordert Sie auf, die E-Mail-Adresse des Dienstkontos und den Speicherort des privaten Schlüssels des Dienstkontos einzugeben (.json oder .p12). Achten Sie darauf, dass sich der private Schlüssel auf dem Computer befindet, auf dem Sie den Befehl gsutil ausführen.

    Nutzerkonten

    So verwenden Sie Anmeldedaten für Benutzerkonten:

    1. Wenn Sie noch keine .boto-Datei haben, erstellen Sie eine. Sie können hierfür gsutil verwenden.

      gsutil config
    2. Verwenden Sie die vorhandene Client-ID einer Anwendung oder erstellen Sie eine neue Client-ID.

    3. Bearbeiten Sie die Datei .boto. Geben Sie im Abschnitt [OAuth2] die Werte client_id und client_secret mit den von Ihnen generierten Werten an.

    4. Führen Sie noch einmal den Befehl gsutil config aus, um basierend auf der von Ihnen eingegebenen Client-ID und dem Secret ein Aktualisierungstoken zu generieren.

      Wenn Sie eine Fehlermeldung erhalten, dass die .boto-Datei nicht gesichert werden kann, entfernen Sie die Backup-Konfigurationsdatei .boto.bak oder benennen Sie sie um.

    5. Konfigurieren Sie die Fallback-Logik für das Aktualisierungstoken.

      gcs-oauth2-boto-plugin erfordert eine Fallback-Logik zum Generieren von Authentifizierungstokens, wenn Sie Anwendungsanmeldedaten verwenden. Bei Verwendung eines Dienstkontos ist keine Fallback-Logik erforderlich.

      Sie können die Fallback-Logik auf folgende Weise aktivieren:

      • Legen Sie client_id und client_secret in der .boto-Konfigurationsdatei fest. Diese Option wird empfohlen und ist bei Verwendung von gsutil mit der neuen .boto-Konfigurationsdatei erforderlich.

      • Legen Sie die Umgebungsvariablen OAUTH2_CLIENT_ID und OAUTH2_CLIENT_SECRET fest.

      • Verwenden Sie die Funktion SetFallbackClientIdAndSecret wie in den folgenden Beispielen gezeigt.

Mit Cloud Storage arbeiten

Python-Quelldatei einrichten

Erstellen Sie als Einstieg in diese Anleitung in Ihrem bevorzugten Texteditor eine neue Python-Datei. Fügen Sie anschließend die folgenden Anweisungen, Importanweisungen, Konfigurationen und Konstantenzuweisungen wie gezeigt hinzu.

Beachten Sie, dass der folgende Code die Funktion SetFallbackClientIdAndSecret als Fallback zum Generieren von Aktualisierungstokens verwendet. Unter Umgebung einrichten finden Sie weitere Möglichkeiten zur Angabe eines Fallbacks. Wenn Sie für die Authentifizierung ein Dienstkonto verwenden, ist keine Fallback-Logik erforderlich.

#!/usr/bin/python

import boto
import gcs_oauth2_boto_plugin
import os
import shutil
import StringIO
import tempfile
import time

# URI scheme for Cloud Storage.
GOOGLE_STORAGE = 'gs'
# URI scheme for accessing local files.
LOCAL_FILE = 'file'

# Fallback logic. In https://console.cloud.google.com/
# under Credentials, create a new client ID for an installed application.
# Required only if you have not configured client ID/secret in
# the .boto file or as environment variables.
CLIENT_ID = 'your client id'
CLIENT_SECRET = 'your client secret'
gcs_oauth2_boto_plugin.SetFallbackClientIdAndSecret(CLIENT_ID, CLIENT_SECRET)

Buckets erstellen

Mit dem folgenden Code werden zwei Buckets erstellt. Da Bucket-Namen global einmalig sein müssen (siehe Hinweise zur Namensgebung), wird jedem Bucket-Namen ein Zeitstempel angehängt, um die Eindeutigkeit zu gewährleisten.

Wenn die Bucket-Namen bereits verwendet werden, ändern Sie den Code, um eindeutige Bucket-Namen zu generieren.

now = time.time()
CATS_BUCKET = 'cats-%d' % now
DOGS_BUCKET = 'dogs-%d' % now

# Your project ID can be found at https://console.cloud.google.com/
# If there is no domain for your project, then project_id = 'YOUR_PROJECT'
project_id = 'YOUR_DOMAIN:YOUR_PROJECT'

for name in (CATS_BUCKET, DOGS_BUCKET):
  # Instantiate a BucketStorageUri object.
  uri = boto.storage_uri(name, GOOGLE_STORAGE)
  # Try to create the bucket.
  try:
    # If the default project is defined,
    # you do not need the headers.
    # Just call: uri.create_bucket()
    header_values = {"x-goog-project-id": project_id}
    uri.create_bucket(headers=header_values)

    print 'Successfully created bucket "%s"' % name
  except boto.exception.StorageCreateError, e:
    print 'Failed to create bucket:', e

Buckets auflisten

Instanziieren Sie zum Abrufen einer Liste aller Buckets mit storage_uri() ein BucketStorageUri-Objekt. Geben Sie dabei den leeren String als den URI an. Rufen Sie anschließend die Instanzmethode get_all_buckets() auf.

uri = boto.storage_uri('', GOOGLE_STORAGE)
# If the default project is defined, call get_all_buckets() without arguments.
for bucket in uri.get_all_buckets(headers=header_values):
  print bucket.name

Objekte hochladen

Zum Hochladen von Objekten erstellen Sie ein Dateiobjekt (zum Lesen geöffnet), das auf Ihre lokale Datei verweist, und ein Speicher-URI-Objekt, das auf das Zielobjekt in Cloud Storage verweist. Rufen Sie die Instanzmethode set_contents_from_file() auf und geben Sie dabei das Dateihandle als Argument an.

# Make some temporary files.
temp_dir = tempfile.mkdtemp(prefix='googlestorage')
tempfiles = {
    'labrador.txt': 'Who wants to play fetch? Me!',
    'collie.txt': 'Timmy fell down the well!'}
for filename, contents in tempfiles.iteritems():
  with open(os.path.join(temp_dir, filename), 'w') as fh:
    fh.write(contents)

# Upload these files to DOGS_BUCKET.
for filename in tempfiles:
  with open(os.path.join(temp_dir, filename), 'r') as localfile:

    dst_uri = boto.storage_uri(
        DOGS_BUCKET + '/' + filename, GOOGLE_STORAGE)
    # The key-related functions are a consequence of boto's
    # interoperability with Amazon S3 (which employs the
    # concept of a key mapping to localfile).
    dst_uri.new_key().set_contents_from_file(localfile)
  print 'Successfully created "%s/%s"' % (
      dst_uri.bucket_name, dst_uri.object_name)

shutil.rmtree(temp_dir)  # Don't forget to clean up!

Objekte auflisten

Wenn Sie alle Objekte in einem Bucket auflisten möchten, rufen Sie storage_uri() auf und geben als Argumente den URI des Buckets sowie das Cloud Storage-URI-Schema an. Rufen Sie anschließend mithilfe der Instanzmethode get_bucket() eine Liste der Objekte ab.

uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for obj in uri.get_bucket():
  print '%s://%s/%s' % (uri.scheme, uri.bucket_name, obj.name)
  print '  "%s"' % obj.get_contents_as_string()

Objekte herunterladen und kopieren

Mit dem folgenden Code werden Objekte in DOGS_BUCKET gelesen und sowohl in Ihr Basisverzeichnis als auch in CATS_BUCKET kopiert. Sie sehen daran auch, dass Sie die boto-Bibliothek über dieselbe Schnittstelle für lokale Dateien und Cloud Storage-Objekte verwenden können.

dest_dir = os.getenv('HOME')
for filename in ('collie.txt', 'labrador.txt'):
  src_uri = boto.storage_uri(
      DOGS_BUCKET + '/' + filename, GOOGLE_STORAGE)

  # Create a file-like object for holding the object contents.
  object_contents = StringIO.StringIO()

  # The unintuitively-named get_file() doesn't return the object
  # contents; instead, it actually writes the contents to
  # object_contents.
  src_uri.get_key().get_file(object_contents)

  local_dst_uri = boto.storage_uri(
      os.path.join(dest_dir, filename), LOCAL_FILE)

  bucket_dst_uri = boto.storage_uri(
      CATS_BUCKET + '/' + filename, GOOGLE_STORAGE)

  for dst_uri in (local_dst_uri, bucket_dst_uri):
    object_contents.seek(0)
    dst_uri.new_key().set_contents_from_file(object_contents)

  object_contents.close()

Streamingübertragungen

Geben Sie den folgenden Code an, um einen Streamingupload durchzuführen:

dst_uri = boto.storage_uri(<bucket> + '/' + <object>, 'gs')
dst_uri.new_key().set_contents_from_stream(<stream object>)

Mit dem folgenden Code findet beispielsweise ein Streamingupload der Datei data_file in ein Objekt mit demselben Namen statt:

filename = 'data_file'
MY_BUCKET = 'my_app_bucket'
my_stream = open(filename, 'rb')
dst_uri = boto.storage_uri(MY_BUCKET + '/' + filename, 'gs')
dst_uri.new_key().set_contents_from_stream(my_stream)

Geben Sie den folgenden Code an, um einen Streamingdownload durchzuführen:

import sys

src_uri = boto.storage_uri(<bucket> + '/' + <object>, 'gs')
src_uri.get_key().get_file(sys.stdout)

Mit dem folgenden Code findet beispielsweise ein Streamingdownload des Objekts data_file statt:

downloaded_file = 'saved_data_file'
MY_BUCKET = 'my_app_bucket'
object_name = 'data_file'
src_uri = boto.storage_uri(MY_BUCKET + '/' + object_name, 'gs')
src_uri.get_key().get_file(sys.stdout)

Objekt-ACLs ändern

Der folgende Code gewährt dem angegebenen Google-Konto Berechtigungen vom Typ FULL_CONTROL für labrador.txt. Wichtig ist, dass Sie die gültige E-Mail-Adresse durch eine gültige E-Mail-Adresse eines Google-Kontos ersetzen.

uri = boto.storage_uri(DOGS_BUCKET + '/labrador.txt', GOOGLE_STORAGE)
print str(uri.get_acl())
uri.add_email_grant('FULL_CONTROL', 'valid-email-address')
print str(uri.get_acl())

Bucket- und Objektmetadaten lesen

Mit diesem Code werden die mit einem Bucket und einem Objekt verknüpften Metadaten abgerufen und gedruckt.

# Print ACL entries for DOGS_BUCKET.
bucket_uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for entry in bucket_uri.get_bucket().get_acl().entries.entry_list:
  entry_id = entry.scope.id
  if not entry_id:
    entry_id = entry.scope.email_address
  print 'SCOPE: %s' % entry_id
  print 'PERMISSION: %s\n' % entry.permission

# Print object metadata and ACL entries.
object_uri = boto.storage_uri(DOGS_BUCKET + '/labrador.txt', GOOGLE_STORAGE)
key = object_uri.get_key()
print ' Object size:\t%s' % key.size
print ' Last mod:\t%s' % key.last_modified
print ' MIME type:\t%s' % key.content_type
print ' MD5:\t%s' % key.etag.strip('"\'') # Remove surrounding quotes
for entry in key.get_acl().entries.entry_list:
  entry_id = entry.scope.id
  if not entry_id:
    entry_id = entry.scope.email_address
  print 'SCOPE: %s' % entry_id
  print 'PERMISSION: %s\n' % entry.permission

Objekte und Buckets löschen

Zum Abschluss dieser Anleitung werden die erstellten Objekte und Buckets mit dem folgenden Code gelöscht. Da ein Bucket zum Löschen leer sein muss, werden zuerst die darin enthaltenen Objekte gelöscht.

for bucket in (CATS_BUCKET, DOGS_BUCKET):
  uri = boto.storage_uri(bucket, GOOGLE_STORAGE)
  for obj in uri.get_bucket():
    print 'Deleting object: %s...' % obj.name
    obj.delete()
  print 'Deleting bucket: %s...' % uri.bucket_name
  uri.delete_bucket()
Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...