Migra de Amazon S3 a Cloud Storage

En esta página, se describe cómo migrar de Amazon Simple Storage Service (Amazon S3) a Cloud Storage para los usuarios que envían solicitudes mediante una API.

Si eres nuevo en Cloud Storage y no vas a usar la API directamente, considera usar Google Cloud Platform Console para configurar y administrar las transferencias. Google Cloud Console proporciona una interfaz gráfica para Cloud Storage que te permite realizar muchas de tus tareas de almacenamiento con solo un navegador, incluida la migración de tus datos de Amazon S3 a Cloud Storage.

Descripción general de la migración

Si eres usuario de Amazon S3, puedes migrar fácilmente las aplicaciones que usan Amazon S3 a Cloud Storage. Tienes dos opciones de migración:

  • Migración simple: esta es la forma más fácil de comenzar con Cloud Storage si vienes de Amazon S3 porque solo requiere unos pocos cambios sencillos en las herramientas y bibliotecas que usas actualmente con Amazon S3.

  • Migración completa: Una migración completa de Amazon S3 a Cloud Storage requiere algunos pasos adicionales en comparación con una migración simple, pero el beneficio es que puedes usar todas las funciones de Cloud Storage, además de proyectos múltiples y OAuth 2.0 para la autenticación.

Migración simple

En una migración simple de Amazon S3 a Cloud Storage, puedes usar tus herramientas y bibliotecas existentes para generar solicitudes REST autenticadas a Amazon S3, y así enviar también solicitudes autenticadas a Cloud Storage. Los únicos pasos que debes seguir para realizar solicitudes a Cloud Storage son los siguientes:

  • Configura un proyecto predeterminado de Google.
  • Obtén una clave HMAC.
  • En las herramientas o bibliotecas existentes, realiza los siguientes cambios:

    • Cambia el extremo de la solicitud para que use el extremo de solicitud a la API de XML de Cloud Storage.
    • Reemplaza el acceso y la clave secreta de Amazon Web Services (AWS) por el ID de acceso y la clave secreta de Cloud Storage correspondientes (en conjunto, se denominan clave HMAC de Cloud Storage).
    • Asegúrate de que tus encabezados x-amz- usen valores admitidos por Cloud Storage. Por ejemplo, x-amz-storage-class debería usar una de las clases de almacenamiento de Cloud Storage disponibles.

      Cuando usas la API de XML de Cloud Storage en una situación de migración simple, especificar el identificador de firma AWS en el encabezado Authorization le permite a Cloud Storage esperar encabezados x-amz-* y LCA con sintaxis XML de Amazon S3 en tu solicitud. Cloud Storage procesa los encabezados x-amz-* que tienen un x-goog-* equivalente, como los que se enumeran en la tabla de encabezados.

Con estos cambios, puedes comenzar a usar las herramientas y bibliotecas existentes para enviar solicitudes de código de autenticación de mensajes en clave hash (HMAC) a Cloud Storage.

En los siguientes ejemplos, se muestra cómo mostrar una lista de los depósitos de Cloud Storage mediante el SDK de Amazon S3:

Go

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Go.

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

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Java.

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

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Python.

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"])

Ten en cuenta que, aunque la mayoría de las acciones están disponibles cuando usas el SDK de Amazon S3 V2, solo podrás enumerar objetos con el método de enumeración de objetos de Amazon S3 V1. En los siguientes ejemplos, se muestra esta enumeración de objetos:

Go

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Go.

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

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Java.

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

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage para Python.

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"])

Configura un proyecto predeterminado

Para usar Cloud Storage en una situación de migración simple, te recomendamos configurar un proyecto predeterminado. Cuando configuras un proyecto predeterminado, le indicas a Cloud Storage qué proyecto debe usar para operaciones como GET servicio o PUT depósito. Si no configuraste un proyecto predeterminado, deberás especificar un encabezado de proyecto en ciertas solicitudes.

Sigue estos pasos para configurar un proyecto predeterminado:

  1. Abre la página Configuración de Cloud Storage en Google Cloud Console.
  2. Selecciona la pestaña Interoperabilidad.
  3. Haz clic en Configurar PROJECT-ID como el proyecto predeterminado, ubicado en la sección Proyecto predeterminado para el acceso interoperable.

    Si ya está configurado como predeterminado, verás que PROJECT-ID es tu proyecto predeterminado para el acceso de interoperabilidad.

Este proyecto es ahora el predeterminado. Puedes cambiar el proyecto predeterminado en cualquier momento si eliges otro proyecto y sigues estos pasos.

Alternativa: Especifica un encabezado de proyecto

En lugar de configurar un proyecto predeterminado (o además de hacerlo), puedes usar el encabezado x-amz-project-id en solicitudes individuales que requieran que especifiques un proyecto.

  • Una solicitud que use x-amz-project-id utilizará el proyecto especificado en el encabezado, aunque hayas configurado un proyecto predeterminado.

El encabezado x-amz-project-id es útil en los siguientes casos:

  • Si estás trabajando con varios proyectos.
  • Si tus solicitudes se realizan mediante una cuenta de servicio asociada con un proyecto diferente, ya que las cuentas de servicio usan su proyecto superior como proyecto predeterminado.

Ten en cuenta que Amazon S3 no tiene proyectos, por lo que, según las herramientas o las bibliotecas cliente que uses, es posible que no se pueda especificar un encabezado x-amz-project-id. En este caso, debes configurar un proyecto predeterminado.

Usa claves HMAC para una migración simple

A fin de usar la API de XML de Cloud Storage en una situación de migración simple, usa las claves de código de autenticación de mensajes basado en hash (HMAC) de Cloud Storage para las credenciales. Por lo general, debes crear una clave HMAC asociada con una cuenta de servicio. Sin embargo, puedes usar una asociada con una cuenta de usuario.

Autenticación en una situación de migración simple

Encabezado de autorización

Para las operaciones en una situación de migración simple que requieren autenticación, incluye un encabezado de solicitud Authorization, como haces con las solicitudes a Amazon S3. La sintaxis del encabezado Authorization para una solicitud de Amazon S3 es la siguiente:

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

En una situación de migración simple, solo cambia el encabezado para usar el ID de acceso HMAC de Google y asegúrate de que la Signature que adjuntas se calcule con la clave secreta HMAC de Google:

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

Las partes del encabezado Authorization son:

  • ALGORITHM: El algoritmo de firma y la versión que usas. El uso de AWS4-HMAC-SHA256 indica que usas una firma HMAC V4 y tienes la intención de enviar encabezados x-amz-*. También puedes usar GOOG4-HMAC-SHA256, que indica que usas una firma HMAC V4 y deseas enviar encabezados x-goog-*.

  • GOOG-ACCESS-ID: El ID de acceso identifica la entidad que realiza y firma la solicitud. En una migración simple, reemplaza el ID de la clave de acceso de Amazon Web Service (AWS) que usas para acceder a Amazon S3 por el ID de acceso HMAC de Google. El ID de acceso HMAC de Google comienza con GOOG.

  • CREDENTIAL_SCOPE: El permiso de la credencial, como se define en la firma. En una migración simple, no necesitas cambiar el permiso de la credencial si usas AWS4-HMAC-SHA256 para tu valor ALGORITHM.

  • SIGNED_HEADERS: Una lista de encabezados separados por punto y coma que se debe incluir para firmar esta solicitud. Todos los encabezados deben estar en minúscula y ordenados por código de caracteres.

    Un ejemplo de una string de encabezado firmado de estilo Amazon S3 se ve como se muestra a continuación:

    content-type;host;x-amz-date

    En una migración simple, no es necesario realizar ningún cambio en la string de encabezado firmado.

  • SIGNATURE: La firma que permite autenticar la solicitud. En una migración simple, reemplaza la información de la clave de acceso de AWS por la información de la clave HMAC de Google equivalente.

Solicitud de autenticación de muestra

En los siguientes ejemplos, se sube un objeto llamado /europe/france/paris.jpg a un depósito llamado my-travel-maps, se aplica la LCA predefinida public-read y se define un encabezado de metadatos personalizado para los revisores. A continuación, se muestra la solicitud a un depósito en 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

A continuación, se muestra la solicitud de un depósito en 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

A continuación, se muestra la solicitud canónica que se creó para esta solicitud:

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

A continuación, se muestra la string para firmar que se creó en esta solicitud:

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

Esta solicitud no proporcionó un encabezado Content-MD5, por lo que se muestra una string vacía en la segunda línea del mensaje.

Control de acceso en una situación de migración simple

Para admitir migraciones simples, Cloud Storage acepta las LCA producidas por Amazon S3. En una situación de migración simple, debes usar AWS como identificador de firma, lo que le indica a Cloud Storage que espere la sintaxis de LCA con el uso de la sintaxis XML de Amazon S3 LCA. Debes asegurarte de que las LCA de Amazon S3 que usas se asignen al modelo LCA de Cloud Storage. Por ejemplo, si tus herramientas y bibliotecas usan la sintaxis de la LCA de Amazon S3 para otorgar permiso de WRITE a un depósito, entonces también deben otorgar permiso de READ al depósito, porque los permisos de Cloud Storage son concéntricos. No es necesario que especifiques ambos permisos de WRITE y READ cuando otorgas el permiso de WRITE mediante la sintaxis de Cloud Storage.

Cloud Storage admite la sintaxis de la LCA de Amazon S3 en las siguientes situaciones:

  • En una solicitud a Cloud Storage para recuperar las LCA (por ejemplo, una solicitud de objeto GET o depósito GET), Cloud Storage muestra la sintaxis de LCA de Amazon S3.
  • En una solicitud a Cloud Storage para aplicar LCA (por ejemplo, una solicitud de objeto PUT o depósito PUT), Cloud Storage espera recibir la sintaxis de LCA de Amazon S3.

En una situación de migración simple, el encabezado Authorization usa AWS para el identificador de firma, pero con el ID de acceso de Google.

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

En el siguiente ejemplo, se muestra una solicitud GET a Cloud Storage para devolver las LCA de un 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

La respuesta a la solicitud incluye la LCA con la sintaxis de la LCA de 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>

En el siguiente ejemplo, se muestra una solicitud PUT a Cloud Storage para establecer las LCA de un objeto. En el ejemplo, se muestra un cuerpo de solicitud con la sintaxis de la LCA de 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 último, en una situación de migración simple, también puedes usar el identificador de firma GOOG1 en el encabezado Authorization. En este caso, debes usar la sintaxis de LCA de Cloud Storage y asegurarte de que todos los encabezados sean encabezados x-goog-* de Google. Si bien esto es posible, te recomendamos que cambies a una migración completa como se describe a continuación para obtener todos los beneficios de Cloud Storage.

Migración completa

Una migración completa de Amazon S3 a Cloud Storage te permite aprovechar todas las funciones de Cloud Storage, incluida la autenticación OAuth 2.0. OAuth 2.0 se basa en SSL para la seguridad, en lugar de requerir que tu aplicación realice una firma criptográfica directamente, y es más fácil de implementar. Con OAuth, tu aplicación puede solicitar acceso a los datos asociados con la Cuenta de Google de un usuario, y el acceso puede alcanzar varios niveles, incluidos solo lectura, lectura y escritura y control total. Para obtener más información, consulta Autenticación de OAuth 2.0.

Para realizar una migración completa de Amazon S3 a Cloud Storage, realiza los siguientes cambios:

  • Cambia los encabezados x-amz-* existentes por los encabezados x-goog-* correspondientes.
  • Cambia el XML de la Lista de control de acceso (LCA) de AWS al XML de LCA de Cloud Storage correspondiente (consulta Crea y administra Listas de control de acceso).
  • Consulta el encabezado x-goog-project-id en tus solicitudes.
  • Prepárate para usar la autenticación OAuth 2.0 como se describe en Autenticación OAuth 2.0. El primer paso es registrar tu aplicación (desde la que vas a emitir las solicitudes) con Google. Si usas OAuth 2.0, el encabezado Authorization se verá de la siguiente manera:

    Authorization: Bearer OAUTH2_TOKEN

Control de acceso en una migración completa

En esta sección, se muestran algunos ejemplos de control de acceso para ayudarte a migrar de Amazon S3 a Cloud Storage. Para obtener una descripción general del control de acceso en Cloud Storage, consulta la documentación sobre el control de acceso.

En Cloud Storage, hay varias formas de aplicar LCA a depósitos y objetos (consulta Crea y administra listas de control de acceso). Dos de las formas de especificar LCA son similares a la forma en que se hace en Amazon S3:

  • El parámetro de string de consulta acl para aplicar las LCA a determinados permisos
  • El encabezado de solicitud x-goog-acl te permite aplicar LCA predefinidas.

Usa el parámetro de string de consulta acl

Puedes usar el parámetro de string de consulta acl para una solicitud de Cloud Storage exactamente como lo harías con una solicitud de Amazon S3. El parámetro acl se usa junto con el método PUT para aplicar las LCA a los siguientes elementos: un objeto existente, un depósito existente o un depósito que estés creando. Cuando utilizas el parámetro de string de consulta acl en una solicitud PUT, debes adjuntar un documento XML (con la sintaxis de LCA de Cloud Storage) al cuerpo de tu solicitud. El documento XML contiene las entradas individuales de LCA que deseas aplicar al objeto o depósito.

En el siguiente ejemplo, se muestra una solicitud PUT a Amazon S3 que usa el parámetro de string de consulta acl. Las LCA se definen en un documento XML enviado en el cuerpo de la solicitud. La solicitud PUT cambia las LCA de un objeto llamado europe/france/paris.jpg que se encuentra en un depósito llamado my-travel-maps. La LCA otorga permiso de 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>

A continuación, se muestra la misma solicitud en 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>

Ten en cuenta que Cloud Storage no requiere un elemento <Owner/> en el documento XML de la LCA. Para obtener más información, consulta la sección sobre la propiedad de depósitos y objetos.

También puedes recuperar tus depósitos y objetos de LCA a través del parámetro de string de consulta acl con el método GET. Las LCA se describen en un documento XML, que se adjunta al cuerpo de la respuesta. Debes tener el permiso FULL_CONTROL para aplicar o recuperar las LCA en un objeto o depósito.

Aplica las LCA con un encabezado de solicitud de extensión

Puedes usar el encabezado x-goog-acl en una solicitud de Cloud Storage para aplicar las LCA predefinidas a depósitos y objetos exactamente como lo harías en el encabezado x-amz-acl en una solicitud de Amazon S3. Por lo general, debes usar el encabezado x-goog-acl (x-amz-acl) para aplicar una LCA predefinida a un depósito o un objeto cuando creas o subes el depósito o el objeto. Las LCA predeterminadas de Cloud Storage son similares a las LCA conservadas de Amazon S3, incluidas las privadas, las de lectura pública, las de lectura y escritura públicas y otras. Para obtener una lista de las LCA predefinidas de Cloud Storage, consulta la documentación sobre las LCA predefinidas.

En el siguiente ejemplo, se muestra una solicitud de objeto PUT que aplica la LCA public-read a un objeto llamado europe/france/paris.jpg que se sube en un depósito en Amazon S3 llamado my-travel-maps.

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>

A continuación, se muestra la misma solicitud en 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>

También puedes usar el encabezado x-goog-acl para aplicar una LCA predefinida a un objeto o depósito existente. Para ello, incluye el parámetro de string de consulta acl en tu solicitud, pero no incluyas un documento XML. Aplicar una LCA predefinida en un objeto o depósito existente también es útil si deseas cambiar de una LCA predefinida a otra, o si deseas actualizar una LCA personalizada a una predefinida. Por ejemplo, en la siguiente solicitud de objeto PUT se aplica la LCA predefinida private a un objeto llamado europe/france/paris.jpg que se encuentra en un depósito llamado 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 obtener más información sobre cómo administrar las LCA, consulta Crea y administra listas de control de acceso.

Migración de Amazon S3 a los métodos de solicitud de Cloud Storage

Cloud Storage admite los mismos métodos de solicitud HTTP estándar para leer y escribir datos en tus depósitos que Amazon S3. Por lo tanto, la mayoría de las herramientas y bibliotecas que usas actualmente con Amazon S3 funcionarán igual que con Cloud Storage. Cloud Storage admite los siguientes métodos de solicitud:

  • Solicitud de servicio para GET
  • Solicitudes de depósito, incluidas PUT, GET y DELETE
  • Solicitudes de objeto, incluidas GET, POST, PUT, HEAD y DELETE

Para obtener más información, consulta la documentación sobre los métodos de referencia de la API de XML. Recuerda que cuando envías solicitudes a Cloud Storage, debes cambiar el cuerpo de la solicitud, si corresponde, para que use la sintaxis de Cloud Storage. Por ejemplo, cuando creas una configuración de ciclo de vida para un depósito, usa el XML de ciclo de vida de Cloud Storage, que es diferente al XML de ciclo de vida de Amazon S3.

Existen algunas diferencias entre la API de XML de Cloud Storage y Amazon S3 que se resumen a continuación, con las alternativas de Cloud Storage sugeridas:

Funcionalidad de Amazon S3 Funcionalidad de la API de XML de Cloud Storage
Carga multiparte.
POST /OBJECT_NAME, PUT /OBJECT_NAME

En la API de XML de Cloud Storage, puedes subir una serie de objetos componentes si subes cada componente por separado. Luego, puedes agrupar los objetos en un solo objeto compuesto.

Nota: Si bien la API de JSON ofrece una función de carga multiparte, esta función se usa para enviar metadatos junto con datos de objetos. No es equivalente a la función de carga multiparte de S3.

Parámetros de string de consulta de depósitos GET y POST:
  • “política”: trabaja con las políticas de depósito de Amazon S3
  • "website": Configuración de sitios web de depósito
  • "etiquetado": Etiquetado de depósitos para fines de asignación de costos
  • "notificación": Notificación de eventos de depósito
  • “requestPayment”: Configura quién paga la solicitud y la descarga de datos desde un depósito
Alternativas:
  • “política”: las LCA de Cloud Storage, la membresía del equipo del proyecto y la capacidad de usar múltiples proyectos abordan muchas de las situaciones en las que se usan las políticas de depósito.
  • “website”: Usa el comando web de gsutil para administrar sitios web o prueba la API de JSON (consulta recursos de depósitos).
  • “etiquetado”: Usa varios proyectos para hacer un seguimiento de los diferentes centros de costos. Para obtener más información sobre los proyectos, consulta la página sobre cómo administrar proyectos.
  • "notificación": Usa notificaciones de Pub/Sub de gsutil o la API de JSON.
  • “requestPayment”: Usa varios proyectos con perfiles de facturación diferentes para administrar quién paga las solicitudes y los datos descargados de un depósito. Para obtener más información sobre la configuración de la facturación, consulta Facturación en la documentación de la ayuda de Console de las API de Google
Borra varios objetos.
POST /?delete

Usa el comando rm de gsutil para quitar varios objetos con facilidad. El comando rm admite la opción “-m” para hacer eliminaciones paralelas (multisubproceso o multiprocesamiento).

Como alternativa, la API de JSON admite el envío de solicitudes por lotes para reducir la cantidad de conexiones HTTP que realiza tu cliente.

Migración de Amazon S3 a los encabezados de Cloud Storage

Cloud Storage usa varios encabezados HTTP estándar, así como varios encabezados HTTP personalizados (extensión). Si realizas la transición de Amazon S3 a Cloud Storage, puedes convertir los encabezados personalizados de Amazon S3 en un encabezado equivalente o en una funcionalidad similar, como se muestra en las tablas a continuación.

En muchos encabezados de Amazon S3, solo debes reemplazar el prefijo x-amz por x-goog:

Encabezado de Amazon S3 Encabezado de 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

Varios encabezados son diferentes o no aplican para Cloud Storage:

Encabezado de Amazon S3 Encabezado de Cloud Storage
x-amz-server-side-encryption No requerido. Cloud Storage encripta automáticamente todos los datos antes de que se escriban en el disco. Para obtener más información, consulta Encriptación.
x-amz-grant-* x-goog-acl con un valor de LCA predefinida.
x-amz-mfa Usa la autenticación de OAuth 2.0.
x-amz-website-redirect-location, x-amz-copy-source-range N/A

Consulta los encabezados HTTP y los parámetros de string de consulta de la API de XML para obtener información acerca de los encabezados de Cloud Storage.

Asistencia para la compatibilidad de la API de XML con Amazon S3

Para ver análisis sobre la interoperabilidad de la API de XML, consulta Stack Overflow con la etiqueta google-cloud-storage. Consulta la página Obtén asistencia para obtener más información sobre los foros de discusión y cómo suscribirte a los anuncios.