Einfache Migration von Amazon S3 zu Cloud Storage

Auf dieser Seite wird beschrieben, wie eine einfache Migration von Amazon Simple Storage Service (Amazon S3) zu Cloud Storage funktioniert. Bei einer einfachen Migration verwenden Sie vorhandene Tools und Bibliotheken, um authentifizierte REST-Anfragen an Amazon S3 zu generieren und um authentifizierte Anfragen an Cloud Storage zu senden.

Wenn Sie mit Cloud Storage noch wenig Erfahrung haben und die API nicht direkt nutzen, kann es sinnvoll sein, Übertragungen über die Google Cloud Console einzurichten und zu verwalten. Die Google Cloud Console bietet eine grafische Benutzeroberfläche für Cloud Storage, die es Ihnen ermöglicht, viele Ihrer Speicheraufgaben komplett im Browser auszuführen. Dazu zählt auch die Migration Ihrer Daten von Amazon S3 zu Cloud Storage.

Wenn Sie möchten, dass Cloud Storage eine Sicherung Ihrer Amazon S3-Daten speichert, sollten Sie ereignisgesteuerte Übertragungen verwenden, die mit Amazon S3-Ereignisbenachrichtigungen automatisch einen Cloud Storage-Bucket mit Ihrer Amazon S3-Quelle synchronisieren.

Migration von Amazon S3 zu Cloud Storage: Einfaches Migrationsszenario

Führen Sie folgende Schritte aus, um Anfragen an Cloud Storage zu senden:

  • Legen Sie ein Google Cloud-Standardprojekt fest.
  • Rufen Sie einen HMAC-Schlüssel (Hash-based Message Authentication Code) ab.
  • Nehmen Sie in Ihren vorhandenen Tools oder Bibliotheken folgende Änderungen vor:

    • Ändern Sie den Anfrageendpunkt so, dass der Cloud Storage XML API-Anfrageendpunkt verwendet wird.
    • Ersetzen Sie den Zugriffsschlüssel und den geheimen Schlüssel von Amazon Web Services (AWS) durch die entsprechende Zugriffs-ID und den geheimen Schlüssel von Cloud Storage (zusammen: Ihr Cloud Storage-HMAC-Schlüssel).
    • Achten Sie darauf, dass Ihre x-amz--Header unterstützte Cloud Storage-Werte verwenden. Beispielsweise sollte x-amz-storage-class eine der verfügbaren Cloud Storage-Speicherklassen verwenden.

      Wenn Sie bei einem einfachen Migrationsszenario mit der Cloud Storage XML API arbeiten, führt die Angabe des Signaturbezeichners AWS im Header Authorization dazu, dass Cloud Storage in Ihrer Anfrage Header des Typs x-amz-* und die ACL-XML-Syntax von Amazon S3 erwartet. Cloud Storage verarbeitet x-amz-*-Header, zu denen es eine x-goog-*-Entsprechung gibt, wie sie in der Header-Tabelle aufgeführt sind, und den x-amz-decoded-content-length-Header.

Nachdem Sie diese Änderungen vorgenommen haben, können Sie vorhandenen Tools und Bibliotheken verwenden, um HMAC-Anfragen an Cloud Storage zu senden.

Die folgenden Beispiele zeigen, wie Cloud Storage-Buckets mit dem Amazon S3 SDK aufzulisten sind:

Go

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Go API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

import (
	"context"
	"fmt"
	"io"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

func listGCSBuckets(w io.Writer, googleAccessKeyID string, googleAccessKeySecret string) error {
	// googleAccessKeyID := "Your Google Access Key ID"
	// googleAccessKeySecret := "Your Google Access Key Secret"

	// Create a new client and do the following:
	// 1. Change the endpoint URL to use the Google Cloud Storage XML API endpoint.
	// 2. Use Cloud Storage HMAC Credentials.
	sess := session.Must(session.NewSession(&aws.Config{
		Region:      aws.String("auto"),
		Endpoint:    aws.String("https://storage.googleapis.com"),
		Credentials: credentials.NewStaticCredentials(googleAccessKeyID, googleAccessKeySecret, ""),
	}))

	client := s3.New(sess)
	ctx := context.Background()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()
	result, err := client.ListBucketsWithContext(ctx, &s3.ListBucketsInput{})
	if err != nil {
		return fmt.Errorf("ListBucketsWithContext: %w", err)
	}

	fmt.Fprintf(w, "Buckets:")
	for _, b := range result.Buckets {
		fmt.Fprintf(w, "%s\n", aws.StringValue(b.Name))
	}

	return nil
}

Java

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Java API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.Bucket;
import java.util.List;

public class ListGcsBuckets {
  public static void listGcsBuckets(String googleAccessKeyId, String googleAccessKeySecret) {

    // String googleAccessKeyId = "your-google-access-key-id";
    // String googleAccessKeySecret = "your-google-access-key-secret";

    // Create a BasicAWSCredentials using Cloud Storage HMAC credentials.
    BasicAWSCredentials googleCreds =
        new BasicAWSCredentials(googleAccessKeyId, googleAccessKeySecret);

    // Create a new client and do the following:
    // 1. Change the endpoint URL to use the Google Cloud Storage XML API endpoint.
    // 2. Use Cloud Storage HMAC Credentials.
    AmazonS3 interopClient =
        AmazonS3ClientBuilder.standard()
            .withEndpointConfiguration(
                new AwsClientBuilder.EndpointConfiguration(
                    "https://storage.googleapis.com", "auto"))
            .withCredentials(new AWSStaticCredentialsProvider(googleCreds))
            .build();

    // Call GCS to list current buckets
    List<Bucket> buckets = interopClient.listBuckets();

    // Print bucket names
    System.out.println("Buckets:");
    for (Bucket bucket : buckets) {
      System.out.println(bucket.getName());
    }

    // Explicitly clean up client resources.
    interopClient.shutdown();
  }

Python

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Python API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

import boto3  # type: ignore


def list_gcs_buckets(
    google_access_key_id: str, google_access_key_secret: str
) -> List[str]:
    """Lists all Cloud Storage buckets using AWS SDK for Python (boto3)
    Positional arguments:
        google_access_key_id: hash-based message authentication code (HMAC) access ID
        google_access_key_secret: HMAC access secret

    Returned value is a list of strings, one for each bucket name.

    To use this sample:
    1. Create a Cloud Storage HMAC key: https://cloud.google.com/storage/docs/authentication/managing-hmackeys#create
    2. Change endpoint_url to a Google Cloud Storage XML API endpoint.

    To learn more about HMAC: https://cloud.google.com/storage/docs/authentication/hmackeys#overview
    """
    client = boto3.client(
        "s3",
        region_name="auto",
        endpoint_url="https://storage.googleapis.com",
        aws_access_key_id=google_access_key_id,
        aws_secret_access_key=google_access_key_secret,
    )

    # Call GCS to list current buckets
    response = client.list_buckets()

    # Return list of bucket names
    results = []
    for bucket in response["Buckets"]:
        results.append(bucket["Name"])
        print(bucket["Name"])  # Can remove if not needed after development
    return results

Standardprojekt festlegen

Zur Verwendung von Cloud Storage in einem einfachen Migrationsszenario wird empfohlen, ein Standardprojekt festzulegen, mit dem Cloud Storage bestimmte Vorgänge ausführt, Beispiele: GET-Dienst/PUT-Bucket. Wenn Sie kein Standardprojekt festlegen, müssen Sie in bestimmten Anfragen einen Projektheader angeben.

So legen Sie ein Standardprojekt fest:

  1. Öffnen Sie die Seite mit den Cloud Storage-Einstellungen in der Google Cloud Console.
  2. Wählen Sie den Tab Interoperabilität aus.
  3. Klicken Sie im Abschnitt Standardprojekt für interoperablen Zugriff auf PROJECT-ID als Standardprojekt festlegen.

    Wenn das Projekt bereits das Standardprojekt ist, wird PROJECT-ID ist das Standardprojekt für interoperablen Zugriff angezeigt.

Dieses Projekt ist jetzt Ihr Standardprojekt. Sie können Ihr Standardprojekt jederzeit ändern. Dazu wählen Sie ein anderes Projekt aus und führen diese Schritte aus.

Alternativ Projektheader angeben

Statt ein Standardprojekt festzulegen oder auch wenn Sie bereits ein Standardprojekt festgelegt haben, können Sie den Header x-amz-project-id in den Anfragen verwenden, bei denen Sie ein Projekt angeben müssen.

  • Eine Anfrage, die x-amz-project-id verwendet, verwendet das im Header angegebene Projekt, selbst wenn ein Standardprojekt vorhanden ist.

Der x-amz-project-id-Header ist in folgenden Fällen nützlich:

  • Sie arbeiten mit mehreren Projekten.
  • Ihre Anfragen werden von einem Dienstkonto gesendet, das mit einem anderen Projekt verknüpft ist, da Dienstkonten das ihnen übergeordnete Projekt als Standardprojekt verwenden.

Beachten Sie, dass Amazon S3 keine Projekte hat. Daher ist es je nach verwendeten Tools oder Clientbibliotheken eventuell nicht möglich, einen x-amz-project-id-Header anzugeben. In diesem Fall sollten Sie ein Standardprojekt festlegen.

HMAC-Schlüssel verwenden

Wenn Sie die Cloud Storage XML API in einem einfachen Migrationsszenario einsetzen, geben Sie als Anmeldedaten HMAC-Schlüssel (Hash-based Message Authentication Code) an. Normalerweise sollten Sie einen HMAC-Schlüssel erstellen, der mit einem Dienstkonto verknüpft ist. Sie können jedoch auch ein Konto verwenden, das mit einem Nutzerkonto verknüpft ist.

Authentifizierung in einem einfachen Migrationsszenario

Autorisierungsheader verwenden

Für Prozesse im Rahmen eines einfachen Migrationsszenarios, die eine Authentifizierung erfordern, fügen Sie genau wie bei Anfragen an Amazon S3 einen Authorization-Anfrageheader ein. Die Syntax des Authorization-Headers sieht bei einer Amazon S3-Anfrage so aus:

Authorization: AWS4-HMAC-SHA256 Credential=AWS-ACCESS-KEY/CREDENTIAL_SCOPE, SignedHeaders=SIGNED_HEADERS, Signature=SIGNATURE

In einem einfachen Migrationsszenario ändern Sie nur den Header, damit Ihre Cloud Storage-HMAC-Zugriffs-ID verwendet wird, und sorgen dafür, dass die angefügte Signature mit Ihrem geheimen Cloud Storage-HMAC-Schlüssel berechnet wird:

Authorization: ALGORITHM Credential=GOOG-ACCESS-ID/CREDENTIAL_SCOPE, SignedHeaders=SIGNED_HEADERS, Signature=SIGNATURE

Der Header Authorization umfasst folgende Bestandteile:

  • ALGORITHM: Der Signaturalgorithmus und die Version, die Sie verwenden. Die Verwendung von AWS4-HMAC-SHA256 zeigt an, dass Sie eine HMAC V4-Signatur verwenden und vorhaben, Header vom Typ x-amz-* zu senden. Sie können auch GOOG4-HMAC-SHA256 verwenden, was bedeutet, dass Sie eine HMAC V4-Signatur verwenden und vorhaben, x-goog-*-Header zu senden. Alternativ können Sie auch GOOG4-RSA-SHA256 verwenden, was bedeutet, dass Sie eine RSA V4-Signatur verwenden und vorhaben, x-goog-*-Header zu senden.

  • GOOG-ACCESS-ID: Die Zugriffs-ID kennzeichnet die Entität, die die Anfrage stellt und signiert. Bei einer einfachen Migration ersetzen Sie die Zugriffs-ID von Amazon Web Service (AWS), die Sie zum Zugriff auf Amazon S3 verwenden, durch die Cloud Storage-HMAC-Zugriffs-ID. Ihre Cloud Storage-HMAC-Zugriffs-ID beginnt mit GOOG.

  • CREDENTIAL_SCOPE: Der Anmeldedatenbereich, wie in der Signatur definiert. Bei einer einfachen Migration müssen Sie den Anmeldedatenbereich nicht ändern, wenn Sie AWS4-HMAC-SHA256 für den ALGORITHM-Wert verwenden.

  • SIGNED_HEADERS: Eine durch Semikolons getrennte Liste mit Namen von Headern, die zum Signieren dieser Anfrage enthalten sein müssen. Alle Header sollten in Kleinbuchstaben angegeben und nach Zeichencode sortiert sein.

    Ein Beispiel für einen signierten Headerstring im Amazon S3-Stil sieht so aus:

    content-type;host;x-amz-date

    Bei einer einfachen Migration müssen Sie keine Änderungen an dem signierten Headerstring vornehmen.

  • SIGNATURE: Die Signatur, mit der die Anfrage authentifiziert werden kann. Bei einer einfachen Migration ersetzen Sie die AWS-Zugriffsschlüsselinformationen durch die entsprechenden Cloud Storage-HMAC-Schlüsselinformationen.

Beispielhafte Authentifizierungsanfrage

In den folgenden Beispielen wird das Objekt /europe/france/paris.jpg in einen Bucket mit dem Namen my-travel-maps hochgeladen. Dabei wird die vordefinierte ACL public-read angewendet und ein benutzerdefinierter Metadatenheader für Prüfer festgelegt. Die Anfrage an einen Bucket in Amazon S3 sieht wie folgt aus:

PUT europe/france/paris.jpg HTTP/1.1
Host: my-travel-maps.s3.amazonaws.com
Date: Mon, 11 Mar 2019 23:46:19 GMT
Content-Length: 888814
Content-Type: image/jpg
x-amz-acl: public-read
x-amz-date:20190311T192918Z
x-amz-meta-reviewer: joe,jane
Authorization: AWS4-HMAC-SHA256 Credential=AWS-ACCESS-KEY/20190311/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-acl;x-amz-date;x-amz-meta-reviewer, Signature=SIGNATURE

Die Anfrage an einen Bucket in Cloud Storage sieht so aus:

PUT europe/france/paris.jpg HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Mon, 11 Mar 2019 23:46:19 GMT
Content-Length: 888814
Content-Type: image/jpg
x-amz-acl: public-read
x-amz-date:20190311T192918Z
x-amz-meta-reviewer: joe,jane
Authorization: AWS4-HMAC-SHA256 Credential=GOOG-ACCESS-ID/20190311/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-acl;x-amz-date;x-amz-meta-reviewer, Signature=SIGNATURE

Dies ist die entsprechende kanonische Anfrage, die für diese Anfrage erstellt wurde:

PUT
/europe/france/paris.jpg

content-length:888814
content-type:image/jpg
host:my-travel-maps.storage.googleapis.com
x-amz-acl:public-read
x-amz-date:20190311T192918Z
x-amz-meta-reviewer:joe,jane

content-length,content-type,host,x-amz-acl,x-amz-date,x-amz-meta-reviewer
82e3da8b3f35989512e8d428add7eca73ab0e5f36586e66fbad8e1051343cbd2

Dies ist der entsprechende zu signierende String, der für diese Anfrage erstellt wurde:

AWS4-HMAC-SHA256
20190311T192918Z
20190311/us-east-1/s3/aws4_request
73918a5ff373d7a03e406fbf9ea35675396b06fca2af76c27a5c451fa783ef65

Diese Anfrage enthielt keinen Content-MD5-Header, also wird in der zweiten Zeile der Nachricht ein leerer String angezeigt.

Zugriffssteuerung bei einem einfachen Migrationsszenario

Zur Unterstützung einfacher Migrationen akzeptiert Cloud Storage ACLs, die von Amazon S3 erzeugt wurden. Bei einem einfachen Migrationsszenario verwenden Sie AWS als Ihren Signaturbezeichner. Dadurch erkennt Cloud Storage, dass eine ACL-Syntax in Form der ACL-XML-Syntax von Amazon S3 zu erwarten ist. Sie sollten dafür sorgen, dass die ACLs von Amazon S3, die Sie verwenden, dem ACL-Modell von Cloud Storage zugeordnet werden können. Wenn Ihre Tools und Bibliotheken beispielsweise die ACL-Syntax von Amazon S3 verwenden, um die Bucket-Berechtigung WRITE zu gewähren, muss auch die Bucket-Berechtigung READ gewährt werden, weil Cloud Storage-Berechtigungen konzentrisch sind. Sie müssen nicht die Berechtigungen WRITE und READ angeben, wenn Sie die Berechtigung WRITE gewähren und hierfür die Syntax von Cloud Storage verwenden.

Cloud Storage unterstützt die ACL-Syntax von Amazon S3 in folgenden Fällen:

  • Bei einer Anfrage an Cloud Storage zum Abrufen von ACLs (z. B. einer Anfrage für ein GET-Objekt oder einen GET-Bucket) gibt Cloud Storage die Antwort in der ACL-Syntax von Amazon S3 zurück.
  • Bei einer Anfrage an Cloud Storage zum Anwenden von ACLs (z. B. einer Anfrage für ein PUT-Objekt oder einen PUT-Bucket) erwartet Cloud Storage, dass die Anfrage in der ACL-Syntax von Amazon S3 gestellt wird.

Der Header Authorization verwendet bei einem einfachen Migrationsszenario AWS als Signaturbezeichner, aber mit Ihrer Google-Zugriffs-ID.

Authorization: AWS4-HMAC-SHA256 Credential=GOOG-ACCESS-ID/CREDENTIAL_SCOPE, SignedHeaders=SIGNED_HEADERS, Signature=SIGNATURE

Das folgende Beispiel zeigt eine GET-Anfrage an Cloud Storage, bei der die ACLs für ein Objekt zurückgegeben werden sollen.

GET europe/france/paris.jpg?acl HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Thu, 21 Feb 2019 23:50:10 GMT
Content-Type: application/xml
X-Amz-Date: 20190221T235010Z
Authorization: AWS4-HMAC-SHA256 Credential=GOOGMC5PDPA5JLZYQMHQHRAX/20190221/region/s3/aws4_request, SignedHeaders=host;x-amz-date, Signature=29088b1d6dfeb2549f6ff67bc3744abb7e45475f0ad60400485805415bbfc534

Die Antwort auf die Anfrage enthält die ACL in der ACL-Syntax von Amazon S3.

<?xml version='1.0' encoding='UTF-8'?>
<AccessControlPolicy>
    <Owner>
        <ID>00b4903a972faa8bcce9382686e9129676f1cd6e5def1f5663affc2ba4652490
        </ID>
        <DisplayName>OwnerName</DisplayName>
    </Owner>
    <AccessControlList>
        <Grant>
            <Grantee xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
                xsi:type='CanonicalUser'>
                <ID>00b4903a972faa8bcce9382686e9129676f1cd6e5def1f5663affc2ba4652490</ID>
                <DisplayName>UserName</DisplayName>
            </Grantee>
            <Permission>FULL_CONTROL</Permission>
        </Grant>
    </AccessControlList>
</AccessControlPolicy>

Das folgende Beispiel zeigt eine PUT-Anfrage an Cloud Storage, mit der die ACLs für ein Objekt festgelegt werden sollen. Das Beispiel zeigt einen Anfragetext mit der ACL-Syntax von Amazon S3.

PUT europe/france/paris.jpg?acl HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Thu, 21 Feb 2019 23:50:10 GMT
Content-Type: application/xml
Content-Length: 337
X-Amz-Date: 20190221T235010Z
Authorization: AWS4-HMAC-SHA256 Credential=GOOGMC5PDPA5JLZYQMHQHRAX/20190221/region/s3/aws4_request, SignedHeaders=host;x-amz-date, Signature=29088b1d6dfeb2549f6ff67bc3744abb7e45475f0ad60400485805415bbfc534

<?xml version='1.0' encoding='utf-8'?>
<AccessControlPolicy>
  <AccessControlList>
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="AmazonCustomerByEmail">
        <EmailAddress>jane@gmail.com</EmailAddress>
      </Grantee>
      <Permission>FULL_CONTROL</Permission>
    </Grant>
  </AccessControlList>
</AccessControlPolicy>

Bei einem einfachen Migrationsszenario können Sie im GOOG1-Header aber auch den Signaturbezeichner Authorization verwenden. In diesem Fall müssen Sie die ACL-Syntax von Cloud Storage einhalten und dafür sorgen, dass alle Ihre x-amz-*-Header in x-goog-* geändert werden. Dies ist zwar möglich, wir empfehlen Ihnen jedoch die Auswahl einer vollständigen Migration, um alle Vorteile von Cloud Storage nutzen zu können.

Support für die Kompatibilität der XML API mit Amazon S3

Diskussionen über die Interoperabilität der XML API finden Sie bei Stack Overflow mithilfe des Tags google-cloud-storage.

Nächste Schritte