Como migrar do Amazon S3 para o Cloud Storage

Nesta página, você aprenderá como fazer a migração do Amazon Simple Storage Service (Amazon S3) para o Cloud Storage, se você for um usuário que envia solicitações usando uma API.

Se você for iniciante no Cloud Storage e não usar a API diretamente, considere usar o Console do Google Cloud para definir e gerenciar transferências. O Console do Google Cloud fornece uma interface gráfica para o Cloud Storage que permite realizar muitas tarefas de armazenamento usando apenas um navegador, incluindo a migração de dados do Amazon S3 para o Cloud Storage.

Visão geral da migração

Se você é um usuário do Amazon S3, conseguirá migrar facilmente seus aplicativos para o Cloud Storage. Há duas opções de migração:

  • Migração simples: é a maneira mais fácil de dar os primeiros passos no Cloud Storage se você já é usuário do Amazon S3 porque requer apenas algumas mudanças simples nas ferramentas e bibliotecas que você utiliza atualmente.

  • MigraçãoCompleta: uma migração completa do Amazon S3 para o Cloud Storage requer algumas etapas adicionais em comparação com uma migração simples, mas o benefício é que você pode usar todos os recursos do Cloud Storage, incluindo vários projetos e OAuth 2.0 para autenticação.

Migração simples

Na migração simples do Amazon S3 para o Cloud Storage, você usará suas ferramentas e bibliotecas atuais para gerar solicitações REST autenticadas para o Amazon S3 e também enviar solicitações autenticadas para o Cloud Storage. As únicas etapas necessárias para fazer solicitações ao Cloud Storage são estas:

  • Defina um projeto padrão do Google.
  • Conseguir uma chave HMAC.
  • Nas ferramentas ou bibliotecas atuais, faça as alterações a seguir:

    • Alterar endpoint de solicitações para usar o endpoint de solicitações da API XML do Cloud Storage.
    • Substitua o acesso e a chave secreta do Amazon Web Services pelo código de acesso e secret do Cloud Storage correspondente (coletivamente chamado de chave HMAC do Cloud Storage).
    • Verifique se seus cabeçalhos x-amz- usam valores do Cloud Storage compatíveis. Por exemplo, x-amz-storage-class deve usar uma das classes de armazenamento do Cloud Storage disponíveis.

      Ao usar a API XML do Cloud Storage na migração simples, especifique o identificador de assinatura AWS no cabeçalho Authorization para que o Cloud Storage espere receber cabeçalhos x-amz-* e a sintaxe XML de lista de controle de acesso (ACL, na sigla em inglês) do Amazon S3 na solicitação. O Cloud Storage processa cabeçalhos x-amz-* que tenham um equivalente de x-goog-*, como os listados na tabela de cabeçalhos.

Com essas alterações, é possível começar a usar suas ferramentas e bibliotecas atuais para enviar solicitações de código de autenticação de mensagens de hash com chave (HMAC, na sigla em inglês) para o Cloud Storage.

Por exemplo: nas amostras a seguir, demonstramos como listar buckets do Cloud Storage usando o SDK do Amazon S3:

Go

Para mais informações, consulte a documentação de referência da API Cloud Storage para Go.

Ver no GitHub (em inglês) Feedback
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: %v", err)
	}

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

	return nil
}

Java

Para mais informações, consulte a documentação de referência da API do Cloud Storage para Java (em inglês).

Ver no GitHub (em inglês) Feedback
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

Para mais informações, consulte a documentação de referência da API do Cloud Storage para Python.

Ver no GitHub (em inglês) Feedback
import boto3

def list_gcs_buckets(google_access_key_id, google_access_key_secret):
    """Lists all GCS buckets using boto3 SDK"""
    # 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.
    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()

    # Print bucket names
    print("Buckets:")
    for bucket in response["Buckets"]:
        print(bucket["Name"])

A maioria das ações está disponível usando o SDK do Amazon S3 V2. No entanto, para listar objetos é necessário usar o método de listagem de objetos do Amazon S3 V1. Os exemplos a seguir demonstram como isso é feito:

Go

Para mais informações, consulte a documentação de referência da API Cloud Storage para Go.

Ver no GitHub (em inglês) Feedback
import (
	"context"
	"fmt"
	"io"

	"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 listGCSObjects(w io.Writer, bucketName string, googleAccessKeyID string, googleAccessKeySecret string) error {
	// bucketName := "your-gcs-bucket-name"
	// 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()

	result, err := client.ListObjectsWithContext(ctx, &s3.ListObjectsInput{
		Bucket: aws.String(bucketName),
	})
	if err != nil {
		return fmt.Errorf("ListObjectsWithContext: %v", err)
	}

	fmt.Fprintf(w, "Objects:")
	for _, o := range result.Contents {
		fmt.Fprintf(w, "%s\n", aws.StringValue(o.Key))
	}

	return nil
}

Java

Para mais informações, consulte a documentação de referência da API do Cloud Storage para Java.

Ver no GitHub (em inglês) Feedback
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.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;

public class ListGcsObjects {
  public static void listGcsObjects(
      String googleAccessKeyId, String googleAccessKeySecret, String bucketName) {

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

    // 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 objects
    ObjectListing objects = interopClient.listObjects(bucketName);

    // Print objects names
    System.out.println("Objects:");
    for (S3ObjectSummary object : objects.getObjectSummaries()) {
      System.out.println(object.getKey());
    }

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

Python

Para mais informações, consulte a documentação de referência da API do Cloud Storage para Python.

Ver no GitHub (em inglês) Feedback
import boto3

def list_gcs_objects(google_access_key_id, google_access_key_secret, bucket_name):
    """Lists GCS objects using boto3 SDK"""
    # 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.

    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 objects in bucket_name
    response = client.list_objects(Bucket=bucket_name)

    # Print object names
    print("Objects:")
    for blob in response["Contents"]:
        print(blob["Key"])

Como definir um projeto padrão

Para usar o Cloud Storage em um cenário de migração simples, recomendamos a definição de um projeto padrão. Ao fazer isso, você informa ao Cloud Storage o projeto a ser utilizado em operações, como o serviço GET ou o bucket PUT. Se um projeto padrão não for definido, você deverá especificar um cabeçalho de projeto em determinadas solicitações.

Siga as etapas abaixo para definir o projeto padrão:

  1. Abra a página Configurações do Cloud Storage no Console do Google Cloud.
  2. Selecione a guia Interoperabilidade.
  3. Clique em Definir PROJECT-ID como projeto padrão, localizado na seção Projeto padrão para acesso interoperável.

    Se o projeto já for o padrão, você verá PROJECT-ID como o projeto padrão para acesso interoperável.

Agora, esse é seu projeto padrão. É possível alterar o projeto padrão a qualquer momento, basta escolher um projeto diferente e seguir as mesmas etapas.

Alternativa: como especificar um cabeçalho de projeto

Em vez de, ou além de, definir um projeto padrão, é possível usar o cabeçalho x-amz-project-id em solicitações individuais que exigem que um projeto seja especificado.

  • Uma solicitação que usa x-amz-project-id utiliza o projeto especificado no cabeçalho, mesmo que você tenha definido um projeto padrão.

Usar o cabeçalho x-amz-project-id é útil se:

  • estiver trabalhando com vários projetos;
  • suas solicitações são feitas por uma conta de serviço associada a um projeto diferente, já que as contas de serviço usam o projeto pai como padrão.

Observe que o Amazon S3 não tem projetos. Portanto, dependendo das ferramentas ou bibliotecas de cliente usadas, especificar um cabeçalho x-amz-project-id pode não ser uma opção. Nesse caso, defina um projeto padrão.

Como usar chaves HMAC na migração simples

Para usar a API XML do Cloud Storage na migração simples, use as chaves de código de autenticação de mensagem com base em hash (HMAC) do Cloud Storage para as credenciais. Normalmente, é preciso criar uma chave HMAC que esteja associada a uma conta de serviço. No entanto, você pode usar uma conta associada a uma conta de usuário.

Como fazer a autenticação na migração simples

Cabeçalho de autorização

Na migração simples, para as operações que exigem autenticação, inclua um cabeçalho de solicitação Authorization do mesmo modo como é feito para solicitações ao Amazon S3. A sintaxe do cabeçalho Authorization na solicitação do Amazon S3 é:

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

Na migração simples, você só precisa alterar o cabeçalho para usar o código de acesso HMAC do Google e verificar se o Signature que você anexou foi calculado com sua chave secreta HMAC do Google:

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

As partes do cabeçalho Authorization são:

  • ALGORITHM: o algoritmo de assinatura e a versão usada. Usar AWS4-HMAC-SHA256 indica que você está utilizando uma assinatura HMAC V4 e pretende enviar cabeçalhos x-amz-*. Também é possível usar GOOG4-HMAC-SHA256, que indica que você está usando uma assinatura HMAC V4 e pretende enviar cabeçalhos x-goog-*.

  • GOOG-ACCESS-ID: o ID de acesso identifica a entidade que faz e assina a solicitação. Na migração simples, substitua o código da chave de acesso da Amazon Web Service (AWS) que você usa para acessar o Amazon S3 pelo código de acesso HMAC do Google. Seu código de acesso do Google HMAC começa com GOOG.

  • CREDENTIAL_SCOPE: o escopo da credencial, conforme definido na assinatura. Em uma migração simples, não é necessário alterar o escopo da credencial se você estiver usando AWS4-HMAC-SHA256 como valor ALGORITHM.

  • SIGNED_HEADERS: uma lista separada por ponto-e-vírgula de nomes de cabeçalhos que precisam ser incluídos para assinar essa solicitação. Todos os cabeçalhos precisam ser em letra minúscula e classificados por código de caractere.

    Veja abaixo um exemplo de string de cabeçalho assinada no estilo do Amazon S3:

    content-type;host;x-amz-date

    Na migração simples, não é necessário fazer qualquer alteração na string de cabeçalho assinada.

  • SIGNATURE: a assinatura que permite que a solicitação seja autenticada. Na migração simples, substitua as informações da chave de acesso da AWS pelas informações equivalentes da chave HMAC do Google.

Exemplo de solicitação de autenticação

Os exemplos a seguir fazem upload de um objeto chamado /europe/france/paris.jpg para um bucket chamado my-travel-maps, aplicam a ACL public-read predefinida e definem um cabeçalho de metadados personalizados para avaliadores. Veja abaixo uma solicitação para um bucket no 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

Esta é uma solicitação para um bucket no 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

Esta é uma solicitação canônica correspondente que foi criada para a solicitação acima:

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

Esta é a string a ser assinada correspondente, criada para a solicitação:

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

A solicitação não forneceu um cabeçalho Content-MD5, portanto, uma string vazia é mostrada na segunda linha da mensagem.

Controle de acesso na migração simples

Para possibilitar as migrações simples, o Cloud Storage aceita ACLs produzidas pelo Amazon S3. Na migração simples, use AWS como o identificador de assinatura, para que o Cloud Storage saiba que receberá a sintaxe XML de ACL do Amazon S3. É necessário garantir que as ACLs do Amazon S3 usadas sejam mapeadas para o modelo de ACLs do Cloud Storage. Por exemplo, se suas ferramentas e bibliotecas usarem a sintaxe de ACL do Amazon S3 para conceder permissão WRITE ao bucket, elas também precisarão conceder permissão READ ao bucket, já que as permissões do Cloud Storage são concêntricas. Não é necessário especificar as duas permissões WRITE e READ ao conceder permissão WRITE usando a sintaxe do Cloud Storage.

O Cloud Storage aceita a sintaxe de ACL do Amazon S3 nos cenários a seguir:

  • Na solicitação ao Cloud Storage para recuperar ACLs (por exemplo, uma solicitação de objeto GET ou bucket GET), o Cloud Storage retorna a sintaxe de ACL do Amazon S3.
  • Na solicitação ao Cloud Storage para aplicar ACLs (por exemplo, uma solicitação de objeto PUT ou bucket PUT), o Cloud Storage espera receber a sintaxe de ACL do Amazon S3.

O cabeçalho Authorization na migração simples usa AWS para o identificador de assinatura, mas com seu código de acesso do Google.

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

O exemplo a seguir mostra uma solicitação GET ao Cloud Storage para retornar as ACLs de um objeto.

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

A resposta à solicitação inclui a ACL usando a sintaxe de ACL do 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>

O exemplo a seguir mostra uma solicitação PUT ao Cloud Storage para definir as ACLs de um objeto. O exemplo mostra um corpo de solicitação com a sintaxe de ACL do 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>

Por fim, na migração simples, também é possível usar o identificador de assinatura GOOG1 no cabeçalho Authorization. Nesse caso, é necessário usar a sintaxe de ACL do Cloud Storage e garantir que todos os cabeçalhos sejam do Google (x-goog-*). Tudo isso é possível, mas recomendamos realizar uma migração completa, conforme descrita abaixo, para aproveitar todos os benefícios do Cloud Storage.

Migração completa

Uma migração completa do Amazon S3 para o Cloud Storage permite que você aproveite todos os recursos do Cloud Storage, incluindo a autenticação do OAuth 2.0. O OAuth 2.0 depende do SSL para segurança, em vez de exigir que seu aplicativo faça assinaturas criptográficas diretamente, além de ser mais fácil de implementar. Com ele, o aplicativo pode solicitar acesso a dados associados à conta do Google de um usuário, e o acesso pode ser definido em vários níveis, incluindo somente leitura, leitura e gravação, e controle total. Para mais informações, consulte Autenticação do OAuth 2.0.

Para migrar totalmente do Amazon S3 para o Cloud Storage, faça as alterações a seguir:

  • Altere os cabeçalhos x-amz-* atuais para os cabeçalhos x-goog-* correspondentes.
  • Mude o XML de ACL do AWS para o XML de ACL do Cloud Storage correspondente. Consulte Como criar e gerenciar listas de controle de acesso.
  • Defina o cabeçalho x-goog-project-id em suas solicitações.
  • Prepare-se para usar a autenticação do OAuth 2.0, conforme descrito em Autenticação do OAuth 2.0. O primeiro passo é registrar o aplicativo que emitirá as solicitações no Google. Usar OAuth 2.0 significa que o cabeçalho Authorization será semelhante ao abaixo:

    Authorization: Bearer <oauth2_token>

Controle de acesso na migração completa

Nesta seção, você verá alguns exemplos de controle de acesso que serão úteis na migração do Amazon S3 para o Cloud Storage. Para uma visão geral do controle de acesso no Cloud Storage, consulte Controle de acesso.

No Cloud Storage, há várias maneiras de aplicar ACLs a buckets e objetos. Consulte Como criar e gerenciar listas de controle de acesso. Duas das formas de especificar ACLs são semelhantes ao que é feito no Amazon S3:

  • O parâmetro de string de consulta acl para aplicar ACLs a escopos específicos.
  • O cabeçalho de solicitação x-goog-acl permite aplicar ACLs predefinidas, que às vezes são conhecidas como ACLs automáticas.

Como usar o parâmetro de string de consulta "acl"

É possível usar o parâmetro de string de consulta acl na solicitação do Cloud Storage exatamente da mesma forma que ele é utilizado na solicitação do Amazon S3. O parâmetro acl é usado junto com o método PUT para aplicar ACLs aos seguintes elementos: um objeto atual, um bucket atual ou um bucket que está sendo criado. Ao usar o parâmetro de string de consulta acl em uma solicitação PUT, é necessário anexar um documento XML (usando a sintaxe de ACL do Cloud Storage) ao corpo da solicitação. O documento XML contém as entradas de ACL individuais que você quer aplicar ao bucket ou objeto.

Veja no exemplo abaixo uma solicitação PUT para o Amazon S3 que usa o parâmetro de string de consulta acl. As ACLs são definidas em um documento XML enviado no corpo da solicitação. A solicitação PUT altera as ACLs em um objeto chamado europe/france/paris.jpg, que está em um bucket chamado my-travel-maps. A ACL concede a permissão FULL_CONTROL a jane@gmail.com.

PUT europe/france/paris.jpg?acl HTTP/1.1
Host: my-travel-maps.s3.amazonaws.com
Date: Wed, 06 Nov 2013 19:28:18 GMT
Content-Length: 598
Content-Type: application/xml
Authorization: AWS4-HMAC-SHA256 Credential=AWS-ACCESS-KEY/20131106/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-type;date;host, Signature=4c45f25bb679fdab0de5a287625d6a143414728d93c9aeb9f4cc91c33a1c45fg

<?xml version='1.0' encoding='utf-8'?>
<AccessControlPolicy>
  <Owner>
    <ID>5a6557ba40f7c86496ffceae789fcd888abc1b62a7149873a0fe12c0f60a7d95</ID>
    <DisplayName>ownerEmail@example.com</DisplayName>
  </Owner>
  <AccessControlList>
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID>fd447671d60b979f78ee6fcec7b22afc80e6b26a4db16eed01afb8064047949b</ID>
        <DisplayName>jane@gmail.com</DisplayName>
      </Grantee>
      <Permission>FULL_CONTROL</Permission>
    </Grant>
  </AccessControlList>
</AccessControlPolicy>

Veja abaixo a mesma solicitação para o Cloud Storage:

PUT europe/france/paris.jpg?acl HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Wed, 06 Nov 2013 19:37:33 GMT
Content-Length: 268
Content-Type: application/xml
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

<?xml version='1.0' encoding='utf-8'?>
<AccessControlList>
  <Entries>
  <Entry>
    <Permission>FULL_CONTROL</Permission>
    <Scope type="UserByEmail">
      <EmailAddress>jane@gmail.com</EmailAddress>
    </Scope>
  </Entry>
  </Entries>
</AccessControlList>

O Cloud Storage não exige um elemento <Owner/> no documento XML da ACL. Para mais informações, consulte Propriedade do bucket e do objeto.

Também é possível recuperar as ACLs de intervalos e objetos usando o parâmetro de string de consulta acl com o método GET. As ACLs são descritas em um documento XML, que está anexado ao corpo da resposta. É necessário ter a permissão FULL_CONTROL para aplicar ou recuperar ACLs em um objeto ou bucket.

Como aplicar ACLs com um cabeçalho de solicitação de extensão

É possível usar o cabeçalho x-goog-acl na solicitação do Cloud Storage para aplicar ACLs predefinidas a buckets e objetos exatamente da mesma forma que o cabeçalho x-amz-acl é usado na solicitação do Amazon S3. Normalmente, usa-se o cabeçalho x-goog-acl (x-amz-acl) para aplicar uma ACL predefinida a um bucket ou objeto ao criá-lo ou fazer upload dele. As ACLs predefinidas do Cloud Storage são semelhantes às ACLs pré-configuradas do Amazon S3, incluindo privada, de leitura pública, de leitura e gravação públicas e outras. Para ver a lista de ACLs predefinidas do Cloud Storage, consulte ACLs predefinidas.

O exemplo a seguir mostra uma solicitação de objeto PUT que aplica a ACL public-read a um objeto chamado europe/france/paris.jpg, que está sendo enviado para um bucket chamado my-travel-maps no Amazon S3.

PUT europe/france/paris.jpg HTTP/1.1
Host: my-travel-maps.s3.amazonaws.com
Date: Wed, 06 Nov 2013 20:48:42 GMT
Content-Length: 888814
Content-Type: image/jpg
x-amz-acl: public-read
Authorization: AWS4-HMAC-SHA256 Credential=AWS-ACCESS-KEY/20131106/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-type;date;host, Signature=808150c37dbd1b425b2398421d6fc3dd6d4942dfaae9e519fd5835aa62fd62ab

<888814 bytes in entity body>

Veja abaixo a mesma solicitação para o Cloud Storage:

PUT europe/france/paris.jpg HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Wed, 06 Nov 2013 20:49:57 GMT
Content-Length: 888814
Content-Type: image/jpg
x-goog-acl: public-read
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

<888814 bytes in entity body>

Também é possível usar o cabeçalho x-goog-acl para aplicar uma ACL predefinida a um bucket ou objeto atual. Para fazer isso, inclua o parâmetro de string de consulta acl na sua solicitação, mas não inclua um documento XML nela. Aplicar uma ACL predefinida a um objeto ou bucket atual é útil se você quiser mudar de uma ACL predefinida para outra ou atualizar ACLs personalizadas para uma predefinida. Por exemplo, a solicitação de objeto PUT a seguir aplica a ACL predefinida private a um objeto chamado europe/france/paris.jpg, que está em um bucket chamado my-travel-maps.

PUT europe/france/paris.jpg?acl HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Wed, 06 Nov 2013 00:26:36 GMT
Content-Length: 0
x-goog-acl: private
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

<empty entity body>

Para mais informações sobre o gerenciamento de ACLs, consulte Como criar e gerenciar listas de controle de acesso.

Como migrar dos métodos de solicitação do Amazon S3 para os do Cloud Storage

O Cloud Storage aceita os mesmos métodos de solicitação HTTP padrão para ler e gravar dados em buckets que são utilizados no Amazon S3. Portanto, a maioria das ferramentas e bibliotecas que você usa atualmente com o Amazon S3 funciona no Cloud Storage, sem a necessidade de alterações. O Cloud Storage aceita os métodos de solicitação a seguir:

  • Solicitação de serviço para GET
  • Solicitações de bucket, incluindo PUT, GET e DELETE
  • Solicitações de objetos, incluindo GET, POST, PUT, HEAD e DELETE.

Para mais informações, consulte os Métodos de referência da API XML. Lembre-se de que ao enviar solicitações para o Cloud Storage, é necessário alterar o corpo da solicitação, quando aplicável, para usar a sintaxe apropriada do Cloud Storage. Por exemplo, ao criar uma configuração de ciclo de vida para um bucket, use o XML do ciclo de vida do Cloud Storage, que é diferente daquele do Amazon S3.

Há algumas diferenças entre a API XML do Cloud Storage e o Amazon S3 que estão resumidas abaixo, com alternativas sugeridas para o Cloud Storage:

Funcionalidade do Amazon S3 Funcionalidade da API XML do Cloud Storage
Upload de várias partes.
POST /<object-name>, PUT /<object-name>

Na API XML do Cloud Storage, você pode fazer upload de uma série de objetos de componente, realizando um upload separado para cada um deles. Dessa forma, é possível compor os objetos em um único objeto composto.

Observação: a API JSON oferece um recurso de upload de várias partes, mas ele é usado para enviar metadados junto com dados de objeto. Não é equivalente ao recurso de upload de várias partes do S3.

Parâmetros da string de consulta de bucket GET/POST:
  • "policy" - como trabalhar com políticas de bucket do Amazon S3.
  • "website" - como configurar os sites dos intervalos.
  • "tagging" - como pôr tags em buckets para fins de alocação de custos.
  • "notification" - como notificar eventos de bucket.
  • "requestPayment" - como configurar quem paga pela solicitação e o download de dados de um bucket.
Alternativas:
  • "policy" - as ACLs do Cloud Storage, a participação na equipe do projeto e a capacidade de usar vários projetos atendem a muitos dos cenários em que as políticas de bucket são usadas.
  • "website" - use o comando web da gsutil para gerenciar sites ou teste a API JSON. Consulte os recursos de buckets.
  • "tagging" - use vários projetos para monitorar centros de custo diferentes. Para mais informações sobre projetos, consulte Como gerenciar projetos.
  • "notification" - use gsutil ou as notificações do Pub/Sub da API JSON.
  • "requestPayment" - use vários projetos com diferentes perfis de faturamento para gerenciar quem paga por solicitações e downloads de dados de um bucket. Para mais informações sobre como configurar o faturamento, consulte Faturamento na documentação da Ajuda do Console de APIs do Google.
Exclusão de vários objetos.
POST /?delete

Use o comando rm da gsutil para remover vários objetos com facilidade. O comando rm aceita a opção "-m" para executar exclusões paralelas (várias linhas de execução/multiprocessamento).

Como alternativa, a API JSON aceita o envio de solicitações em lote (em inglês) para reduzir o número de conexões HTTP feitas por seu cliente.

Como migrar cabeçalhos do Amazon S3 para o Cloud Storage

O Cloud Storage usa vários cabeçalhos HTTP padrão, além de diversos cabeçalhos HTTP personalizados (extensão). Na migração do Amazon S3 para o Cloud Storage, é possível converter cabeçalhos personalizados do Amazon S3 em cabeçalhos personalizados equivalentes do Cloud Storage ou em uma funcionalidade semelhante, conforme mostrado nas tabelas abaixo.

Para muitos cabeçalhos do Amazon S3, basta substituir o prefixo x-amz por x-goog:

Cabeçalho do Amazon S3 Cabeçalho do Cloud Storage
x-amz-storage-class x-goog-storage-class
x-amz-acl x-goog-acl
x-amz-date x-goog-date
x-amz-meta-* x-goog-meta-*
x-amz-copy-source x-goog-copy-source
x-amz-metadata-directive x-goog-metadata-directive
x-amz-copy-source-if-match x-goog-copy-source-if-match
x-amz-copy-source-if-none-match x-goog-copy-source-if-none-match
x-amz-copy-source-if-unmodified-since x-goog-copy-source-if-unmodified-since
x-amz-copy-source-if-modified-since x-goog-copy-source-if-modified-since

Há vários cabeçalhos que são diferentes ou não se aplicam ao Cloud Storage:

Cabeçalho do Amazon S3 Cabeçalho do Cloud Storage
x-amz-server-side-encryption Não é obrigatório. Todos os dados do Cloud Storage são criptografados automaticamente antes de serem gravados no disco. Para mais informações, consulte Criptografia.
x-amz-grant-* x-goog-acl com um valor de ACL predefinido.
x-amz-mfa Use a autenticação do OAuth 2.0.
x-amz-website-redirect-location, x-amz-copy-source-range n/a

Consulte os cabeçalhos HTTP e parâmetros de string de consulta da API XML para uma referência aos cabeçalhos do Cloud Storage.

Compatibilidade da API XML com o Amazon S3

Para discussões sobre a interoperabilidade da API XML, consulte o Stack Overflow usando a tag google-cloud-storage. Consulte a página Como receber suporte para mais informações sobre fóruns de discussão e como se inscrever para recebimento de anúncios.