Migra de Amazon S3 a Google 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 la migración simple, pero el beneficio es que puedes usar todas las funciones de Cloud Storage, que incluyen asistencia para cuentas de servicio, varios proyectos y autenticación OAuth 2.0.

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 la clave de acceso y la clave secreta de Cloud Storage correspondientes (en conjunto, se denomina 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 equivalente x-goog-*, 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 ejemplos siguientes, se muestra cómo enumerar los depósitos de Cloud Storage con el SDK de Amazon S3:

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:

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;

import java.util.List;

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, debes elegir un proyecto predeterminado. Cuando eliges un proyecto predeterminado, le indicas a Cloud Storage qué proyecto debe usar para operaciones como el servicio GET o el depósito PUT.

Sigue estos pasos para configurar un proyecto predeterminado:

  1. Abre la página Configuración de Cloud Storage en Google Cloud Platform Console.
  2. Selecciona Interoperabilidad.
  3. Haz clic en Establecer PROJECT-ID como proyecto predeterminado.

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

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

Administra claves HMAC en una migración simple

Para usar la API de XML de Cloud Storage en una situación de migración simple, debes usar claves de código de autenticación de mensajes basado en hash (HMAC) de Cloud Storage en tus credenciales. Las claves HMAC consisten en una clave de acceso y un secreto. Una clave de acceso es una string alfanumérica de 24 caracteres, que está vinculada a tu Cuenta de Google. Todas las solicitudes de Cloud Storage autenticadas, excepto aquellas que usan autenticación basada en cookies, deben usar una clave de acceso en la solicitud para que el sistema de Cloud Storage sepa quién la realiza. El siguiente es un ejemplo de una clave de acceso:

GOOGTS7C7FUP3AIRVJTE2BCD

Un secreto es una string codificada en Base64 de 40 caracteres que está vinculada a una clave de acceso específica. Un secreto es una clave compartida previamente que solo tú y el sistema de Cloud Storage conocen. Utiliza el secreto para firmar todas las solicitudes como parte del proceso de autenticación. El siguiente es un ejemplo de un secreto:

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

Para generar una clave HMAC, realiza los siguientes pasos:

  1. Abre la página Configuración de Cloud Storage en Google Cloud Platform Console.
  2. Selecciona Interoperabilidad.
  3. Si no has configurado la interoperabilidad anteriormente, haz clic en Habilita acceso de interoperabilidad.
  4. Haz clic en Crear clave nueva.

Sugerencias de seguridad para trabajar con claves HMAC

  • Puedes crear varias claves HMAC. Esto es útil si trabajas en varios proyectos diferentes y quieres usar una clave HMAC distinta para cada proyecto.

  • Nunca permitas que otra persona use tus claves HMAC. Tus claves HMAC están vinculadas a tu Cuenta de Google, y debes tratarlas como a cualquier otro conjunto de credenciales de acceso.

  • Como práctica recomendada de seguridad, debes cambiar tus claves con regularidad, como parte de una rotación de claves.

  • Si crees que alguien más usa tus claves HMAC, debes borrar las claves afectadas de inmediato y crear nuevas.

  • Cuando cambies las claves HMAC, debes actualizar el código con las claves nuevas antes de borrar las antiguas. Cuando borras las claves HMAC, se vuelven no válidas de inmediato y no son recuperables.

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

Encabezado de autorización

Para las operaciones que requieren autenticación en una situación de migración simple, incluye un encabezado de solicitud Authorization, tal 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 debes cambiar el encabezado para usar tu clave de acceso HMAC de Google y asegurarte de que el Signature que adjuntas se calcula con tu clave secreta HMAC de Google:

Authorization: ALGORITHM Credential=GOOG-ACCESS-KEY/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, lo que indica que usas una firma HMAC V4 y pretendes enviar encabezados x-goog-*.

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

  • CREDENTIAL_SCOPE: el alcance de la credencial es una string que tiene la siguiente estructura:

    DATE/LOCATION/SERVICE/REQUEST_TYPE
    • DATE: la fecha, con formato AAAAMMDD
    • LOCATION: la región donde reside o donde se creará el recurso
    • SERVICE: el nombre del servicio
    • REQUEST_TYPE: el tipo de solicitud

    Un ejemplo de un alcance de credenciales de tipo Amazon S3 se ve como se muestra a continuación:

    20150830/us-east-1/iam/aws4_request

    En una migración simple, no es necesario cambiar el alcance de las credenciales si utilizas AWS4-HMAC-SHA256 en el valor de ALGORITHM. Si deseas usar GOOG4-HMAC-SHA256, reemplaza aws4_request por goog4_request.

  • SIGNED_HEADERS: una lista de nombres de encabezados separados por punto y coma, que se deben 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 firmada.

  • SIGNATURE: el hash criptográfico de la string para firmar que permitió autenticar la solicitud. La firma se crea con HMAC-SHA256 como la función hash y una clave derivada del alcance del secreto y de la credencial como la clave criptográfica. El resumen resultante se codifica en Base64. Cuando Cloud Storage recibe tu solicitud firmada, usa la clave de acceso para buscar el secreto y verificar que tú creaste la firma. Para obtener más información sobre cómo obtener un acceso y una clave secreta, consulta Administra claves HMAC en una migración simple.

    En una migración simple, reemplaza la clave de acceso secreta de AWS con el secreto de clave de HMAC de Google para obtener la clave criptográfica.

Cálculo de autenticación

En esta sección, se describe el proceso de autenticación de una solicitud de API de XML en una situación de migración simple. Si bien esta sección te puede servir para desarrollar tu propio código y firmar solicitudes, tiene como objeto principal servir de revisión si ya tienes herramientas o bibliotecas que firman tus solicitudes a Amazon S3. En este caso, seguirás usando esas herramientas para acceder a Cloud Storage a través de la API de XML, con los cambios que se muestran aquí.

Las firmas proporcionan identidad y autenticación fuerte sin revelar tu secreto. Proporcionar identidad y autenticación en cada solicitud garantiza que cada solicitud se procese con una cuenta de usuario específica y con la autoridad de esa cuenta de usuario. Esto es posible porque solo tú y el sistema de Cloud Storage conocen tu secreto. Cuando realizas una solicitud, el sistema de Cloud Storage usa el secreto para calcular la misma firma de la solicitud que calculaste cuando realizaste la solicitud. Si las firmas coinciden, el sistema de Cloud Storage sabe que solo tú pudiste haber realizado la solicitud.

En el siguiente pseudocódigo, se muestra cómo crear la firma para el encabezado de autorización:

Signature = HexEncode(HMAC-SHA256(SiginingKey, StringToSign))

Para crear la firma, usa una función hash criptográfica conocida como HMAC-SHA256. HMAC-SHA256 es un código de autenticación de mensaje (MAC) basado en hash y se describe en RFC 4868. Requiere dos parámetros de entrada, ambos codificados en UTF-8: una clave de firma y una string para firmar.

La clave de firma se deriva de tu secreto de Cloud Storage y es específica de la fecha, la ubicación, el servicio y el tipo de solicitud asociado a tu solicitud. Además, estos valores deben coincidir con los valores especificados en el alcance de la credencial. En el siguiente pseudocódigo, se muestra cómo crear la clave de firma:

key_date = HMAC-SHA256("AWS4" + GOOG-ACCESS-KEY, "YYYYMMDD")
key_region = HMAC-SHA256(key_date, "us-east-1")
key_service = HMAC-SHA256(key_region, "s3")
signing_key = HMAC-SHA256(key_service, "aws4_request")

donde GOOG-ACCESS-KEY identifica la entidad que realiza y firma la solicitud.

La string para firmar incluye metainformación sobre la solicitud y sobre la solicitud canónica que deseas firmar. En el siguiente seudocódigo, se muestra cómo construir la string para firmar, incluido el uso de líneas nuevas entre cada elemento:

SigningAlgorithm
RequestDateTime
CredentialScope
HashedCanonicalRequest

La string para firmar tiene los siguientes componentes:

  • SigningAlgorithm: debería ser AWS4-HMAC-SHA256 en una migración simple.
  • RequestDateTime: representa la fecha y hora actuales, en formato ISO 8601: YYYYMMDD'T'HHMMSS'Z'.
  • CredentialScope: es el alcance de la credencial de la solicitud de firma de la string para firmar, como se describe en la sección sobre el encabezado de autorización.
  • HasanCanonicalRequest: el hash SHA-256 con codificación hexadecimal de la solicitud canónica. Usa una función de hash SHA-256 para crear un valor de hash de la solicitud canónica. El lenguaje de programación debe tener una biblioteca para crear hash SHA-256. A continuación, se muestra un ejemplo de cómo se ve un valor de hash:

    436b7ce722d03b17d3f790255dd57904f7ed61c02ac5127a0ca8063877e4e42c

A continuación, se muestra un ejemplo de cómo se ve una string para firmar:

AWS4-HMAC-SHA256
20190301T190859Z
20190301/us-east-1/s3/aws4_request
54f3076005db23fbecdb409d25c0ccb9fb8b5e24c59f12634654c0be13459af0

Ejemplo de una solicitud de autenticación

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-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 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 ), 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 ), Cloud Storage espera recibir la sintaxis LCA de Amazon S3.

El encabezado Authorization, en una situación de migración simple, usa AWS para el identificador de firma, pero con tu clave de acceso de Google.

Authorization: AWS4-HMAC-SHA256 Credential=GOOG-ACCESS-KEY/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, entre las que se incluyen las siguientes:

  • Asistencia para cuentas de servicio: las cuentas de servicio son útiles en las interacciones de servidor a servidor que no requieren la participación del usuario final. Para obtener más información, consulta la documentación sobre las cuentas de servicio.

  • Compatibilidad con varios proyectos: en efecto, tener muchos proyectos te permite tener muchas instancias del servicio de Cloud Storage. Esto te permite separar diferentes funcionalidades o servicios de tu aplicación o negocio según sea necesario. Para obtener más información, consulta la documentación sobre los proyectos.

  • Autenticación OAuth 2.0: OAuth 2.0 se basa en SSL para la seguridad, en vez de requerir que la aplicación realice firmas criptográficas de forma directa, por lo que 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 la documentación sobre la autenticación 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).
  • Configura el encabezado x-goog-project-id en tus solicitudes. Ten en cuenta que en una situación de migración simple, elegiste un proyecto predeterminado para todas las solicitudes. Esto no es necesario en una migración completa.
  • 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. Usar OAuth 2.0 significa que tu encabezado de 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 para especificar las 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 alcances
  • El encabezado de solicitud x-goog-acl te permite aplicar LCA predefinidas, que a veces se conocen como LCA conservadas

Usa el parámetro de string de consulta LCA

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 predeterminadas de Cloud Storage, consulta la documentación sobre las LCA predeterminadas.

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 redactar 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 la string de consulta de los 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 la Consola de 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, simplemente 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 predefinido.
x-amz-mfa Usa la autenticación OAuth 2.0.
x-amz-website-redirect-location, x-amz-copy-source-range No corresponde

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 discusiones 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.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.