Migrazione semplice da Amazon S3 a Cloud Storage

Questa pagina descrive come completare una migrazione semplice da Amazon Simple Storage Service (Amazon S3) a di archiviazione ideale in Cloud Storage. In una semplice migrazione, utilizzi gli strumenti e i librerie per la generazione di richieste REST autenticate in Amazon S3 le richieste autenticate a Cloud Storage.

Se non hai mai utilizzato Cloud Storage e non utilizzerai direttamente l'API, Valuta la possibilità di utilizzare la console Google Cloud per configurare e gestire i trasferimenti. La La console Google Cloud fornisce un'interfaccia grafica a Cloud Storage che ti consente di svolgere molte delle tue attività di archiviazione usando 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 Amazon S3, Prendi in considerazione i trasferimenti basati su eventi, che utilizzano gli eventi Amazon S3 Notifiche per mantenere automaticamente sincronizzato un bucket Cloud Storage con la tua sorgente Amazon S3.

Migrazione da Amazon S3 a Cloud Storage in un semplice scenario di migrazione

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

  • Imposta un progetto Google Cloud predefinito.
  • Ottieni una chiave HMAC (codice di autenticazione dei messaggi basato su hash).
  • Apporta le seguenti modifiche negli strumenti o nelle librerie esistenti:

    • Cambia l'endpoint della richiesta per utilizzare Cloud Storage Endpoint richiesta API XML.
    • Sostituisci l'accesso e la chiave segreta ad Amazon Web Services (AWS) con ID e secret di Cloud Storage corrispondenti (collettivamente denominata chiave HMAC Cloud Storage).
    • Assicurati che le intestazioni x-amz- utilizzino il servizio Cloud Storage supportato e i relativi valori. Ad esempio, x-amz-storage-class deve utilizzare uno degli classi di archiviazione di Cloud Storage disponibili.

      Quando usi l'API XML di Cloud Storage in una semplice migrazione dello scenario, specificando l'identificatore di firma AWS nella L'intestazione Authorization indica a Cloud Storage di prevedere x-amz-* e sintassi XML ACL Amazon S3 nella tua richiesta. Cloud Storage elabora x-amz-* intestazioni che hanno un x-goog-* equivalenti, ad esempio quelli elencati nella tabella delle intestazioni.

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

Ad esempio, i seguenti esempi mostrano come elencare Bucket Cloud Storage con l'SDK Amazon S3:

Go

Per ulteriori informazioni, consulta API Cloud Storage Go documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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 ulteriori informazioni, consulta API Cloud Storage Java documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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 ulteriori informazioni, consulta API Cloud Storage Python documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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

Imposta un progetto predefinito

Per utilizzare Cloud Storage in uno scenario di migrazione semplice, è consigliabile di impostare un progetto predefinito, che Cloud Storage utilizza per eseguire determinate operazioni, ad esempio GET servizio o PUT bucket. Se Non impostare un progetto predefinito, devi specificare un'intestazione del progetto. in alcune richieste.

Per impostare un progetto predefinito:

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

    Se il progetto è già il progetto predefinito, vedrai PROJECT-ID è il progetto predefinito per l'accesso interoperabile.

Questo progetto è ora il tuo progetto predefinito. Puoi modificare il progetto predefinito all'indirizzo in qualsiasi momento scegliendo un altro progetto e seguendo questi passaggi.

In alternativa, specifica un'intestazione di progetto

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

  • Una richiesta che usa x-amz-project-id usa il progetto specificato in anche se esiste già un progetto predefinito.

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

  • Stai lavorando con più progetti.
  • Le tue richieste vengono effettuate da un account di servizio associato a un altro perché gli account di servizio usano il progetto padre come predefinito progetto.

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

Utilizza chiavi HMAC

Per usare l'API XML di Cloud Storage in uno scenario di migrazione semplice, utilizza Chiavi HMAC (Hash-based Message Authentication Code) di Cloud Storage per le credenziali. In genere, devi creare una chiave HMAC che sia associate a un account di servizio; ma in alternativa puoi usarne uno associati a un account utente.

Autenticazione in un semplice scenario di migrazione

Utilizzare l'intestazione Autorizzazione

Per le operazioni in uno scenario di migrazione semplice che richiedono l'autenticazione, includi un'intestazione della richiesta Authorization proprio come fai per le richieste a 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, è sufficiente modificare l'intestazione per utilizzare ID accesso HMAC di Cloud Storage e assicurati che il Signature che colleghi viene calcolata con la tua chiave secret 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 di firma e la versione che stai utilizzando. L'utilizzo di AWS4-HMAC-SHA256 indica che viene utilizzata una firma HMAC V4. e 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-*, ovvero GOOG4-RSA-SHA256, indica che stai utilizzando una firma RSA V4 e intendi inviare x-goog-* intestazioni.

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

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

  • SIGNED_HEADERS: un elenco di nomi delle intestazioni separati da punto e virgola che devono essere inclusi per firmare questa richiesta. Tutte le intestazioni devono essere in minuscolo e ordinate per codice carattere.

    Ecco un esempio di stringa di intestazione firmata in stile Amazon S3:

    content-type;host;x-amz-date

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

  • SIGNATURE: la firma che autorizza l'invio della richiesta autenticati. In una semplice migrazione, sostituisci la chiave di accesso AWS con le informazioni chiave HMAC Cloud Storage equivalenti.

Esempio di richiesta di autenticazione

I seguenti esempi caricano un oggetto denominato /europe/france/paris.jpg in un bucket denominato my-travel-maps, applicare l'ACL predefinito public-read e definire 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 per 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-to-sign corrispondente 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, quindi 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 generati Amazon S3. In uno scenario di migrazione semplice, utilizzi AWS come firma che indica a Cloud Storage di aspettarsi la sintassi ACL utilizzando Sintassi XML ACL Amazon S3. Devi assicurarti che gli ACL Amazon S3 usa la mappatura del modello ACL di Cloud Storage. Ad esempio, se i tuoi strumenti e utilizzano la sintassi ACL di Amazon S3 per concedere l'autorizzazione WRITE al bucket, quindi deve anche concedere al bucket l'autorizzazione READ perché Cloud Storage autorizzazioni sono concentriche. Non è necessario specificare sia WRITE che READ quando concedi l'autorizzazione WRITE utilizzando il Sintassi di Cloud Storage.

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

  • In una richiesta a Cloud Storage per recuperare gli ACL (ad esempio, un GET Oggetto o richiesta di bucket GET), Cloud Storage restituisce Amazon S3 Sintassi ACL.
  • In una richiesta a Cloud Storage di applicare ACL (ad esempio, un PUT richiesta di oggetto o bucket PUT), Cloud Storage prevede di ricevere Sintassi ACL di Amazon S3.

L'intestazione Authorization in uno scenario di migrazione semplice utilizza AWS per identificatore di 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 da restituire a Cloud Storage gli 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 da impostare gli ACL di un oggetto. L'esempio mostra il corpo di una richiesta con Amazon S3 Sintassi ACL.

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 la firma GOOG1 nell'intestazione Authorization. In questo caso, devi utilizzare la classe Sintassi ACL di Cloud Storage e assicurati che tutte le intestazioni x-amz-* sono stati modificati in x-goog-*. Sebbene sia possibile, ti consigliamo di scegliere una migrazione completa per poter utilizzare tutti i vantaggi di archiviazione ideale in Cloud Storage.

Supporto per la compatibilità dell'API XML con Amazon S3

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

Passaggi successivi