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.

Migration von Amazon S3 zu Cloud Storage: Einfaches Migrationsszenario

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

  • Verwenden Sie den x-amz-project-id-Header, wenn Sie Anfragen zum Erstellen und Auflisten von Buckets stellen.
  • 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.

    Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

    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.

    Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

    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.

    Legen Sie vor dem Ausführen von Codebeispielen die Umgebungsvariable GOOGLE_CLOUD_UNIVERSE_DOMAIN auf s3nsapis.fr fest.

    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
    
    

    Projektheader angeben

    Verwenden Sie in Anfragen, bei denen Sie ein Projekt angeben müssen, den Header x-amz-project-id.

    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.

    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. Der Wert GOOG4-HMAC-SHA256 zeigt an, dass Sie eine HMAC V4-Signatur verwenden und vorhaben, Header vom Typ x-goog-* zu senden. Der Wert GOOG4-RSA-SHA256 zeigt an, dass Sie eine RSA V4-Signatur verwenden und vorhaben, Header vom Typ x-goog-* 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.s3nsapis.fr
    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.s3nsapis.fr
    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 Cloud Storage-HMAC-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.s3nsapis.fr
    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.s3nsapis.fr
    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>example-service-account@example-project.s3ns-system.iam.gserviceaccount.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.