Migrazione semplice da Amazon S3 a Cloud Storage

Questa pagina descrive come completare una semplice migrazione da Amazon Simple Storage Service (Amazon S3) a Cloud Storage. In una migrazione semplice, utilizzi gli strumenti e le librerie esistenti per generare richieste REST autenticate ad Amazon S3 per inviare richieste autenticate a Cloud Storage.

Se non hai dimestichezza con Cloud Storage e non utilizzerai direttamente l'API, valuta la possibilità di utilizzare la console Google Cloud per configurare e gestire i trasferimenti. La console Google Cloud fornisce un'interfaccia grafica per Cloud Storage che ti consente di svolgere molte attività di archiviazione utilizzando solo un browser, inclusa la migrazione dei dati da Amazon S3 a Cloud Storage.

Se vuoi che Cloud Storage archivi un backup dei tuoi dati di Amazon S3, valuta la possibilità di utilizzare i trasferimenti basati sugli eventi, che utilizzano le notifiche degli eventi Amazon S3 per mantenere automaticamente sincronizzato un bucket Cloud Storage con la tua origine Amazon S3.

Esegui la migrazione da Amazon S3 a Cloud Storage in uno scenario di migrazione semplice

Per effettuare richieste a Cloud Storage, devi completare i seguenti passaggi:

  • Imposta un progetto Google Cloud predefinito.
  • Ottieni una chiave HMAC (Hash-based Message Authentication Code).
  • Negli strumenti o nelle librerie esistenti, apporta le seguenti modifiche:

    • Modifica l'endpoint della richiesta in modo da utilizzare l'endpoint della richiesta dell'API XML di Cloud Storage.
    • Sostituisci la chiave di accesso e la chiave segreta di Amazon Web Services (AWS) con l'ID di accesso e il segreto di Cloud Storage corrispondente (chiamati collettivamente chiave HMAC di Cloud Storage).
    • Assicurati che gli intestazioni x-amz- utilizzino valori Cloud Storage supportati. Ad esempio, x-amz-storage-class deve utilizzare una delle classi di archiviazione Cloud Storage disponibili.

      Quando utilizzi l'API XML di Cloud Storage in uno scenario di migrazione semplice, specificando l'identificatore della firma AWS nell'intestazione Authorization, Cloud Storage sa che deve aspettarsi intestazioni x-amz-* e sintassi XML ACL di Amazon S3 nella richiesta. Cloud Storage elabora le intestazioni x-amz-* che hanno un corrispondente x-goog-*, ad esempio quelle elencate nella tabella delle intestazioni, nonché l'intestazione x-amz-decoded-content-length.

Dopo aver apportato queste modifiche, puoi iniziare a utilizzare le librerie e gli strumenti esistenti per inviare richieste HMAC a Cloud Storage.

Ad esempio, gli esempi riportati di seguito mostrano come elencare i bucket Cloud Storage utilizzando l'SDK Amazon S3:

Go

Per saperne di più, consulta la documentazione di riferimento dell'API Cloud Storage Go.

Per autenticarti a Cloud Storage, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

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

Per saperne di più, consulta la documentazione di riferimento dell'API Cloud Storage Java.

Per autenticarti a Cloud Storage, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

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

Per saperne di più, consulta la documentazione di riferimento dell'API Cloud Storage Python.

Per autenticarti a Cloud Storage, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

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

Impostare un progetto predefinito

Per utilizzare Cloud Storage in uno scenario di migrazione semplice, ti consigliamo di impostare un progetto predefinito, che Cloud Storage utilizza per eseguire determinate operazioni, come il servizio GET o il bucket PUT. Se non imposti un progetto predefinito, devi specificare un'intestazione del progetto. in determinate richieste.

Per impostare un progetto predefinito:

  1. Apri la pagina Impostazioni di Cloud Storage nella console Google Cloud.
  2. Seleziona la scheda Interoperabilità.
  3. Fai clic su Imposta PROJECT-ID come progetto predefinito, nella sezione Progetto predefinito per l'accesso interoperabile.

    Se il progetto è già quello predefinito, viene visualizzato PROJECT-ID è il tuo progetto predefinito per l'accesso interoperabile.

Questo progetto è ora il progetto predefinito. Puoi modificare il progetto predefinito in qualsiasi momento scegliendone un altro e seguendo questi passaggi.

In alternativa, specifica un'intestazione del progetto

Invece di, o in aggiunta a, impostare un progetto predefinito, puoi utilizzare l'intestazione x-amz-project-id nelle singole richieste che richiedono di specificare un progetto.

  • Una richiesta che utilizza x-amz-project-id utilizza il progetto specificato nell'header, anche se esiste un progetto predefinito.

L'intestazione x-amz-project-id è utile quando:

  • Stai lavorando con più progetti.
  • Le richieste vengono effettuate da un account di servizio associato a un progetto diverso, perché gli account di servizio utilizzano il progetto principale come progetto predefinito.

Tieni presente che Amazon S3 non ha progetti, pertanto, a seconda degli strumenti o delle librerie client che utilizzi, la specifica di un'intestazione x-amz-project-id potrebbe non essere un'opzione. In questo caso, devi impostare un progetto predefinito.

Utilizzare le chiavi HMAC

Per utilizzare l'API XML di Cloud Storage in uno scenario di migrazione semplice, utilizza le chiavi HMAC (Hash-based Message Authentication Code) di Cloud Storage per le credenziali. In genere, devi creare una chiave HMAC associata a un account di servizio. In alternativa, puoi utilizzare una chiave associata a un account utente.

Eseguire l'autenticazione in uno scenario di migrazione semplice

Utilizza l'intestazione Authorization

Per le operazioni in uno scenario di migrazione semplice che richiedono l'autenticazione, devi includere un'intestazione della richiesta Authorization, come faresti per le richieste ad Amazon S3. La sintassi dell'intestazione Authorization per una richiesta Amazon S3 è:

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

In uno scenario di migrazione semplice, modifica solo l'intestazione per utilizzare il tuo ID accesso HMAC di Cloud Storage e assicurati che il Signature che alleghi sia calcolato con la chiave segreta HMAC di Cloud Storage:

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

Le parti dell'intestazione Authorization sono:

  • ALGORITHM: l'algoritmo e la versione della firma che stai utilizzando. L'utilizzo di AWS4-HMAC-SHA256 indica che stai utilizzando una firma HMAC V4 e che intendi inviare intestazioni x-amz-*. Puoi anche utilizzare GOOG4-HMAC-SHA256, che indica che stai utilizzando una firma HMAC V4 e intendi inviare intestazioni x-goog-*, oppure GOOG4-RSA-SHA256, che indica che stai utilizzando una firma RSA V4 e intendi inviare intestazioni x-goog-*.

  • GOOG-ACCESS-ID: l'ID accesso identifica l'entità che sta elaborando e firmando la richiesta. In una migrazione semplice, sostituisci l'ID chiave di accesso di Amazon Web Service (AWS) che utilizzi per accedere ad Amazon S3 con il tuo ID accesso HMAC di Cloud Storage. L'ID accesso HMAC di Cloud Storage inizia con GOOG.

  • CREDENTIAL_SCOPE: l'ambito delle credenziali, come definito nella firma. In una migrazione semplice, non è necessario cambiare l'ambito delle credenziali se utilizzi AWS4-HMAC-SHA256 per il valore ALGORITHM.

  • SIGNED_HEADERS: un elenco separato da punti e virgole dei nomi delle intestazioni che devono essere incluse per firmare questa richiesta. Tutte le intestazioni devono essere in minuscolo e ordinate in base al codice carattere.

    Un esempio di stringa di intestazione firmata in stile Amazon S3 è il seguente:

    content-type;host;x-amz-date

    In una migrazione semplice, non è necessario apportare modifiche alla stringa di intestazione firmata.

  • SIGNATURE: la firma che consente di autenticare la richiesta. In una migrazione semplice, sostituisci le informazioni sulla chiave di accesso AWS con le informazioni sulla chiave HMAC di Cloud Storage equivalenti.

Richiesta di autenticazione di esempio

Gli esempi seguenti caricano un oggetto denominato /europe/france/paris.jpg in un bucket denominato my-travel-maps, applicano l'ACL predefinito public-read e definisci un'intestazione di metadati personalizzata per i revisori. Ecco la richiesta a un bucket in Amazon S3:

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

Ecco la richiesta di un bucket in Cloud Storage:

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

Ecco la richiesta canonica corrispondente creata per questa richiesta:

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

Ecco la stringa da firmare creata per questa richiesta:

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

Questa richiesta non ha fornito un'intestazione Content-MD5, pertanto viene visualizzata una stringa vuota nella seconda riga del messaggio.

Controllo dell'accesso in uno scenario di migrazione semplice

Per supportare migrazioni semplici, Cloud Storage accetta ACL prodotte da Amazon S3. In uno scenario di migrazione semplice, utilizzi AWS come identificatore della firma, che indica a Cloud Storage di prevedere la sintassi ACL utilizzando la sintassi XML ACL di Amazon S3. Devi assicurarti che le ACL di Amazon S3 che utilizzi siano mappate al modello ACL di Cloud Storage. Ad esempio, se i tuoi strumenti e le tue librerie utilizzano la sintassi ACL di Amazon S3 per concedere l'autorizzazione al bucket WRITE, devono anche concedere l'autorizzazione al bucket READ perché le autorizzazioni Cloud Storage sono concentriche. Non è necessario specificare sia l'autorizzazione WRITE che READ quando concedi l'autorizzazione WRITE utilizzando la sintassi di Cloud Storage.

Cloud Storage supporta la sintassi ACL di Amazon S3 nei seguenti scenari:

  • In una richiesta a Cloud Storage per recuperare gli ACL (ad esempio una richiesta di GET oggetto o GET bucket), Cloud Storage restituisce la sintassi dell'ACL di Amazon S3.
  • In una richiesta a Cloud Storage per applicare ACL (ad esempio una richiesta di PUT oggetto o PUT bucket), Cloud Storage si aspetta di ricevere la sintassi ACL di Amazon S3.

L'intestazione Authorization in uno scenario di migrazione semplice utilizza AWS per l'identificatore della firma, ma con il tuo ID di accesso Google.

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

L'esempio seguente mostra una richiesta GET a Cloud Storage per restituire le ACL di un oggetto.

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

La risposta alla richiesta include l'ACL che utilizza la sintassi ACL di 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>

L'esempio seguente mostra una richiesta PUT a Cloud Storage per impostare le ACL per un oggetto. L'esempio mostra un corpo della richiesta con la sintassi dell'ACL di 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>

Infine, in uno scenario di migrazione semplice, puoi anche utilizzare l'identificatore della firma GOOG1 nell'intestazione Authorization. In questo caso, devi utilizzare la sintassi ACL di Cloud Storage e assicurarti che tutti gli intestazioni x-amz-* siano impostati su x-goog-*. Anche se è possibile, ti consigliamo di scegliere una migrazione completa per usufruire di tutti i vantaggi dello spazio di Cloud Storage.

Supporto della compatibilità dell'API XML con Amazon S3

Per discussioni sull'interoperabilità delle API XML, visita Stack Overflow utilizzando il tag google-cloud-storage.

Passaggi successivi