从 Amazon S3 迁移到 Cloud Storage

本页面向使用 API 发送请求的用户介绍了如何从 Amazon Simple Storage Service (Amazon S3) 迁移到 Cloud Storage。如果您当前没有使用 Amazon S3,并且想要使用 Cloud Storage API 发送请求,请首先参阅以下资料:XML API 概览

如果您是新接触 Cloud Storage 的用户,并不会马上使用该 API,请考虑使用 Google Cloud Platform Console 来设置和管理转移。Google Cloud Platform Console 为 Cloud Storage 提供了一个图形界面。借助该界面,您只需使用浏览器即可完成众多存储任务,包括将数据从 Amazon S3 迁移到 Cloud Storage。

迁移概览

如果您是 Amazon S3 用户,您可以轻松迁移使用 Amazon S3 的应用,让这些应用转为使用 Cloud Storage。您可以选择两种迁移方案:

简单迁移

如果您要从 Amazon S3 进行迁移,此方案是可帮助您开始使用 Cloud Storage 的最简单方法,因为它只需要对您当前在 Amazon S3 上使用的工具和库做出一些简单的更改。有关详情,请参阅简单迁移

虽然简单迁移让您能够快速开始使用 Cloud Storage,但并不能让您使用 Cloud Storage 的所有功能。要充分利用 Cloud Storage,请按照完整迁移的步骤进行操作。

完整迁移

要执行从 Amazon S3 到 Cloud Storage 的完整迁移,除了简单迁移所需的步骤,您还需要执行一些额外的步骤,但这样做的好处是,您可以使用 Cloud Storage 的所有功能,包括服务帐号支持、多个项目以及 OAuth 2.0 身份验证。有关详情,请参阅完整迁移

简单迁移

在从 Amazon S3 到 Cloud Storage 的简单迁移中,您可以使用现有的工具和库,它们用于对 Amazon S3 生成经过身份验证的 REST 请求,现在也可用于向 Cloud Storage 发送经过身份验证的请求。本节将介绍您需要对现有工具和库做出的更改。

要设置以进行简单迁移,请执行以下操作:

  • 设置默认 Google 项目
  • 获取开发者密钥
  • 在现有工具或库中,做出以下更改:

    • 更改请求端点以使用 Cloud Storage 请求端点
    • 使用相应的 Cloud Storage 访问密钥和机密密钥(统称为 Google 开发者密钥)替换 Amazon Web Services (AWS) 访问和机密密钥。

大功告成!此时,您可以开始使用现有工具和库将带有密钥的哈希消息身份验证代码 (HMAC) 请求发送到 Cloud Storage。

例如,以下示例演示了如何使用 Amazon S3 SDK 列出 Cloud Storage 存储分区:

Java

如需了解详情,请参阅 Cloud Storage Java API 参考文档

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

如需了解详情,请参阅 Cloud Storage Python API 参考文档

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

请注意,尽管大多数操作可使用 Amazon S3 V2 SDK 执行,但列出对象的操作只能使用 Amazon S3 V1 列出对象方法执行。以下示例演示了这样一种列出对象的操作:

Java

如需了解详情,请参阅 Cloud Storage Java API 参考文档

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

如需了解详情,请参阅 Cloud Storage Python API 参考文档

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

在简单迁移情景中使用 Cloud Storage XML API 时,通过在 Authorization 标头中指定 AWS 签名标识符,您可让 Cloud Storage 知道,您的请求中会出现 x-amz-* 标头和 Amazon S3 ACL XML 语法。

设置默认项目

要在简单迁移情景中使用 Cloud Storage,您必须选择默认项目。当您选择默认项目后,Cloud Storage 便知道要将哪个项目用于 GET 服务或 PUT 存储分区等操作。

要设置默认项目,请执行以下操作:

  1. Google Cloud Platform Console打开 Cloud Storage 设置页面
  2. 选择互操作
  3. 点击将此 PROJECT-ID 设为我的默认项目

    如果该项目已经是默认项目,您将看到 PROJECT-ID 是您的默认项目

该项目现在是您的默认项目。您可以随时更改默认项目,方法是选择其他项目并为该项目启用互操作访问权限。

管理用于简单迁移的开发者密钥

要在简单迁移情景中使用 Cloud Storage XML API,您必须使用带有密钥的哈希消息身份验证代码 (HMAC) 身份验证功能(与 Cloud Storage 开发者密钥搭配使用)。开发者密钥由访问密钥和密文组成。访问密钥是一个包含 20 个字符的字母数字字符串,该字符串与您的 Google 帐号关联。所有经过身份验证的 Cloud Storage 请求(使用基于 Cookie 的身份验证的请求除外)都必须使用访问密钥,以便让 Cloud Storage 系统知道发出请求的对象是谁。以下是一个访问密钥示例:

GOOGTS7C7FUP3AIRVJTE2BCD

机密密钥是一个包含 40 个字符的 Base-64 编码字符串,该字符串与特定的访问密钥关联。机密密钥是预共享的密钥,只有您和 Cloud Storage 系统才知道该密钥。在身份验证过程中,您必须使用您的机密密钥对所有请求签名。机密密钥的示例如下所示:

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

要生成开发者密钥,请执行以下操作:

  1. Google Cloud Platform Console打开 Cloud Storage 设置页面
  2. 选择互操作
  3. 如果您之前没有设置互操作性,请点击启用互操作性访问权限
  4. 点击创建新密钥

有关使用开发者密钥的安全提示

您最多可以创建五个开发者密钥。如果您正在处理多个不同的项目,并且希望为每个项目使用不同的开发者密钥,则创建多个密钥可以为您带来便利。

您还可以使用密钥管理工具来删除开发者密钥并创建新的开发者密钥。如果您认为其他人正在使用您的开发者密钥,或者您需要在密钥轮替中更改密钥,则建议您执行此操作,这是一种与安全性有关的最佳做法。如果您拥有开发者密钥,并且想要创建新的开发者密钥,建议您在删除旧密钥之前,首先使用新的开发者密钥更新代码。当您删除开发者密钥时,它们会立即失效,并且无法恢复。

在简单迁移情景中进行身份验证

授权标头

对于简单迁移情景中需要进行身份验证的的操作,您将在操作中包含一个 Authorization 请求标头(与处理 Amazon S3 的请求类似)。Amazon S3 请求的 Authorization 标头语法如下:

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

在简单迁移情景中,您只需更改标头即可使用 Google 开发者访问密钥,并可确保您附加的 Signature 是通过 Google 开发者密钥计算得出的:

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

Authorization 标头的各部分如下所示:

  • ALGORITHM:您使用的签名算法和版本。使用 AWS4-HMAC-SHA256 表示您正在使用 HMAC V4 签名,并打算发送 x-amz-* 标头。您也可以使用 GOOG4-HMAC-SHA256,这表示您正在使用 HMAC V4 签名,并打算发送 x-goog-* 标头。

  • GOOG-ACCESS-KEY:访问密钥标识发出请求以及对请求签名的实体。在简单迁移中,请使用您的 Google 开发者访问密钥替换用于访问 Amazon S3 的 Amazon Web Service (AWS) 访问密钥 ID。您的 Google 开发者访问密钥以 GOOG 开头。

  • CREDENTIAL_SCOPE:凭据范围是具有以下结构的字符串:

    DATE/LOCATION/SERVICE/REQUEST_TYPE
    • DATE:采用 YYYYMMDD 格式的日期。
    • LOCATION:资源所在的或要创建资源的区域。
    • SERVICE:服务名称。
    • REQUEST_TYPE:请求类型。

    Amazon S3 样式凭据范围的示例如下所示:

    20150830/us-east-1/iam/aws4_request

    在简单迁移中,如果您将 AWS4-HMAC-SHA256 用于 ALGORITHM 值,则无需更改凭据范围。如果您要使用 GOOG4-HMAC-SHA256,请将 aws4_request 替换为 goog4_request

  • SIGNED_HEADERS:以英文分号分隔的标头名称列表,其中包含对此请求进行签名所必需标头的名称。所有标头应使用小写,并按字符代码排序。

    Amazon S3 样式签名标头字符串的示例如下所示:

    content-type;host;x-amz-date

    在简单迁移中,您无需对签名标头字符串进行任何更改。

  • SIGNATURE:支持对请求进行身份验证的且待签名字符串的加密哈希值。要创建签名,您需要使用 HMAC-SHA256 作为哈希函数并将从您的机密密钥和凭据范围中派生出的密钥用作加密密钥。随后会对生成的 digest 进行 Base64 编码。当 Cloud Storage 收到您的签名请求时,它会使用访问密钥来查询您的机密密钥并验证您是否创建了签名。要详细了解如何获取访问和机密密钥,请参阅在简单迁移情景中管理用于控制访问权限的开发者密钥

    在简单迁移中,请将 AWS 机密访问密钥替换为您的 Google 开发者密钥,进而派生加密密钥。

身份验证计算

本节介绍了在简单迁移情景中对 XML API 请求进行验证的过程。虽然您可以参考本节的内容来开发您自己的代码,以便对请求进行签名,但是,如果您已经拥有对 Amazon S3 的请求进行签名的工具或库,则本节主要的主要目的是帮助您进行回顾。在这种情况下,您将继续使用这些工具,通过 XML API 来访问 Cloud Storage,只需做出此处所示的更改即可。

此身份验证方法同时提供了身份和强身份验证,并且不会泄露您的密钥。由于此方法在每个请求中同时提供了身份和身份验证,它可以确保在特定用户帐号下使用该用户帐号的权限来处理每个 Cloud Storage 请求。之所以能够做到这一点,是因为只有您和 Cloud Storage 系统知道您的密钥。当您发出请求时,Cloud Storage 系统会使用您的密钥来为请求计算签名(与您发出请求时计算的签名相同)。如果签名匹配,则 Cloud Storage 系统知道,只有您可以发出该请求。

以下伪代码显示了如何为“授权”标头创建签名:

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

要创建签名,请使用名为 HMAC-SHA256 的加密哈希函数。HMAC-SHA256 是基于哈希的消息身份验证代码 (MAC),RFC 4868 中对该代码进行了介绍。该代码需要两个输入参数(均采用 UTF-8 编码):签名密钥和要签名的字符串。

签名密钥派生自您的 Cloud Storage 密钥并特定于与您的请求相关联的日期、位置、服务和请求类型。此外,这些值必须与凭据范围中指定的值匹配。以下伪代码展示如何创建签名密钥:

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

其中,GOOG-ACCESS-KEY 标识发出请求和对请求签名的实体。

要签名的字符串包含与您的请求以及您要签名的规范化请求相关的元信息。以下伪代码展示如何构建要签名的字符串,其中包括在各元素之间使用换行符:

SigningAlgorithm
RequestDateTime
CredentialScope
HashedCanonicalRequest

要签名的字符串包含以下组件:

  • SigningAlgorithm:这应该是用于简单迁移的 AWS4-HMAC-SHA256
  • RequestDateTime:采用 ISO 8601 格式的当前日期和时间:YYYYMMDD'T'HHMMSS'Z'
  • CredentialScope:对要签名的字符串进行签名的请求对应的凭据范围,相关说明请参阅授权标头部分。
  • HashedCanonicalRequest:规范化请求的十六进制编码 SHA-256 哈希。可使用 SHA-256 哈希函数创建规范化请求的哈希值。您的编程语言应具有用于创建 SHA-256 哈希的库。示例哈希值如下所示:

    436b7ce722d03b17d3f790255dd57904f7ed61c02ac5127a0ca8063877e4e42c

要签名字符串的示例如下所示:

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

规范化请求

规范化请求是一种标准化格式的 HTTP 请求,其中包含要签名请求的相关信息。这可确保当 Cloud Storage 收到该请求时,它计算的签名与您计算的签名相同。如果您的版本与 Cloud Storage 计算的版本不匹配,请求将失败。

规范化请求应具有以下结构,其中包括在各元素之间使用换行符:

HTTP_VERB
PATH_TO_RESOURCE
CANONICAL_QUERY_STRING
CANONICAL_HEADERS

SIGNED_HEADERS
HexEncode(HMAC-SHA256(REQUEST_PAYLOAD))

规范化请求具有以下组件:

  • HTTP_VERB:要与签名请求搭配使用的 HTTP 动词。如需查看允许值列表,请参阅 HTTP 动词

  • PATH_TO_RESOURCE通向资源的路径,此路径位于主机名的后面。

  • CANONICAL_QUERY_STRING:使用签名请求的请求必须包含的查询字符串参数。请按字母顺序添加查询字符串参数,并以 & 分隔各个参数。

  • CANONICAL_HEADERS:使用签名请求的请求必须包含的请求标头(包括扩展标头)的 name:value 对。请按字母顺序添加标头,并以 \n 分隔各个标头。

  • SIGNED_HEADERS:CANONICAL_HEADERS 的标头名称列表。要创建签名标头列表,请将所有标头名称都转换为小写,按字符代码顺序对其进行排序,并使用英文分号分隔各标头名称。

  • HexEncode(HMAC-SHA256(REQUEST_PAYLOAD)):十六进制编码的 SHA-256 哈希请求负载。该字符串必须显示在规范化请求的最后一行中。如果负载为空,请使用空字符串作为哈希函数输入。哈希负载(空负载)的示例将是:

    3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

如果您遵循之前介绍的规范化请求伪代码并将这些元素全部合并在一起,那么您应该会获得如下例所示的规范化请求字符串:

GET
/

host:storage.googleapis.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:20190301T190859Z

host;x-amz-content-sha256;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

身份验证请求示例

以下示例将名为 /europe/france/paris.jpg 的对象上传到名为 my-travel-maps 的存储分区,应用预定义的 ACL public-read,并为审核者定义自定义元数据标头。以下是对 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

以下是针对 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

以下是为此请求创建的相应规范化请求:

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

以下是为此请求创建的要签名的相应字符串:

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

此请求未提供 Content-MD5 标头,因此消息中显示了空字符串(第二行)。

简单迁移情景中的访问控制

为了支持简单迁移,Cloud Storage 允许使用 Amazon S3 生成的 ACL。在简单迁移情景中,您将使用 AWS 作为签名标识符,该标识符向 Cloud Storage 告知,ACL 语法会使用 Amazon S3 ACL XML 语法。您应确保您使用的 Amazon S3 ACL 映射到 Cloud Storage ACL 模型。例如,如果您的工具和库使用 Amazon S3 的 ACL 语法授予存储分区 WRITE 权限,那么它们还必须授予存储分区 READ 权限,因为 Cloud Storage 权限是同心权限(即授予其中一种权限时,也会同时授予其他权限)。使用 Cloud Storage 语法授予 WRITE 权限时,您无需同时指定 WRITEREAD 权限。

在以下情景中,Cloud Storage 支持 Amazon S3 ACL 语法:

  • 在对 Cloud Storage 发出的 ACL 检索请求中(例如,GET Object 或 GET Bucket 请求),Cloud Storage 返回 Amazon S3 ACL 语法。
  • 在对 Cloud Storage 发出的 ACL 应用请求中(例如,PUT Object 或 PUT Bucket 请求),Cloud Storage 预期会收到 Amazon S3 ACL 语法。

简单迁移情景中的 Authorization 标头将使用 AWS 作为签名标识符,但会结合使用您的 Google 访问密钥。

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

以下示例显示了对 Cloud Storage 发出的 GET 请求,该请求要求返回对象的 ACL。

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

该请求的响应包含使用 Amazon S3 ACL 语法的 ACL。

<?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>

以下示例显示了对 Cloud Storage 发出的 PUT 请求,该请求要求设置对象的 ACL。该示例显示了具有 Amazon S3 ACL 语法的请求正文。

PUT europe/france/paris.jpg?acl HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Thu, 21 Feb 2019 23:50:10 GMT
Content-Type: application/xml
Content-Length: 337
X-Amz-Date: 20190221T235010Z
Authorization: AWS4-HMAC-SHA256 Credential=GOOGMC5PDPA5JLZYQMHQHRAX/20190221/region/s3/aws4_request, SignedHeaders=host;x-amz-date, Signature=29088b1d6dfeb2549f6ff67bc3744abb7e45475f0ad60400485805415bbfc534

<?xml version='1.0' encoding='utf-8'?>
<AccessControlPolicy>
  <AccessControlList>
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="AmazonCustomerByEmail">
        <EmailAddress>jane@gmail.com</EmailAddress>
      </Grantee>
      <Permission>FULL_CONTROL</Permission>
    </Grant>
  </AccessControlList>
</AccessControlPolicy>

最后,在简单迁移情景中,您还可以在 Authorization 标头中使用 GOOG1 签名标识符。在这种情况下,您必须使用 Cloud Storage ACL 语法,并确保所有标头都是 Google 标头 x-goog-*。在尽可能的情况下,我们建议您按照以下说明执行完整迁移,以便充分利用 Cloud Storage 的全部优势。

完整迁移

通过从 Amazon S3 完整迁移到 Cloud Storage,您可以充分利用 Cloud Storage 的所有功能,包括:

支持服务帐号
服务帐号对于不需要最终用户参与的服务器间交互十分有用。有关详情,请参阅服务帐号
支持多个项目
实际上,多个项目允许您拥有 Cloud Storage 服务的多个实例。此功能允许您根据需要分离应用或业务的不同功能或服务。有关详情,请参阅使用项目
OAuth 2.0 身份验证
OAuth 2.0 依靠 SSL 来实现安全性,它不要求您的应用直接进行加密签名,因此更容易实现。借助 OAuth,您的应用可以请求访问与用户的 Google 帐号关联的数据,并且可以将访问权限限定为多个级别(包括只读、读写和完全控制)。有关详情,请参阅 OAuth 2.0 身份验证

要从 Amazon S3 完整迁移到 Cloud Storage,您需要进行以下更改:

  • 将所有现有的 x-amz-* 标头更改为相应的 x-goog-* 标头。
  • 将 AWS 访问控制列表 (ACL) XML 更改为相应的 Cloud Storage ACL XML(请参阅指定存储分区和对象 ACL)。
  • 在请求中设置 x-goog-project-id 标头。请注意,在简单迁移情景中,您为所有请求选择了默认项目。在完整迁移中,您无需执行此操作。
  • 按照 OAuth 2.0 身份验证中所述,完成相关设置以使用 OAuth 2.0 身份验证。第一步是向 Google 注册您的应用(您将发出请求的应用)。使用 OAuth 2.0 时,您的 Authorization 标头将如下所示:

    Authorization: Bearer <oauth2_token>

完整迁移中的访问控制

本节介绍了一些访问控制示例,这些示例可帮助您从 Amazon S3 迁移到 Cloud Storage。要查看 Cloud Storage 中的访问控制的概览,请参阅访问控制

在 Cloud Storage 中,您可以通过多种方法将 ACL 应用到存储分区和对象上(请参阅指定存储分区和对象 ACL)。其中两种用于指定 ACL 的方法与您在 Amazon S3 中执行的操作类似:

  • 用于为特定范围应用 ACL 的 acl 查询字符串参数。
  • x-goog-acl 请求标头允许您应用预定义的 ACL(有时称为预设 ACL)。

使用 acl 查询字符串参数

您可以将 acl 查询字符串参数用于 Cloud Storage 请求,该参数的使用方式与用于 Amazon S3 请求时完全相同。您可以结合使用 acl 参数与 PUT 方法,以将 ACL 应用于以下目标:现有对象、现有存储分区或要创建的存储分区。在 PUT 请求中使用 acl 查询字符串参数时,您必须将 XML 文档附加到请求正文中(使用 Cloud Storage ACL 语法)。XML 文档包含要应用于存储分区或对象的各个 ACL 条目。

以下示例显示了向 Amazon S3 发出的、使用 acl 查询字符串参数的 PUT 请求。将在请求正文中发送的 XML 文档中定义 ACL。PUT 请求会更改名为 europe/france/paris.jpg 的对象上的 ACL,该对象位于名为 my-travel-maps 的存储分区中。ACL 授予 jane@gmail.com FULL_CONTROL 权限。

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>

以下是向 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>

请注意,Cloud Storage 不需要在 ACL XML 文档中包含 <Owner/> 元素。有关详情,请参阅默认对象 ACL

您还可以结合使用 acl 查询字符串参数和 GET 方法来检索存储分区和对象 ACL。XML 文档中对 ACL 进行了说明,该文档随附在响应正文中。您必须具有 FULL_CONTROL 权限才能在对象或存储分区上应用或检索 ACL。

应用具有扩展请求标头的 ACL

您可以使用 Cloud Storage 请求中的 x-goog-acl 标头将预定义的 ACL 应用于存储分区和对象,此过程与在 Amazon S3 请求中使用 x-amz-acl 标头的方式完全相同。在创建或上传存储分区或对象时,您通常使用 x-goog-acl (x-amz-acl) 标头将预定义的 ACL 应用于存储分区或对象。Cloud Storage 预定义 ACL 类似于 Amazon S3 预设 ACL,其中包括私有、公共-读取、公共-读取-写入以及其他权限设置。如需查看 Cloud Storage 预定义 ACL 的列表,请参阅预定义 ACL

以下示例显示了一个 PUT Object 请求,该请求将 public-read ACL 应用于名为 europe/france/paris.jpg 的对象,而该对象将上传到 Amazon S3 中名为 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>

以下是向 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>

您还可以使用 x-goog-acl 标头将预定义 ACL 应用于现有存储分区或对象。要执行此操作,请在请求中添加 acl 查询字符串参数,但不要在请求中添加 XML 文档。如果要从一个预定义 ACL 更改为另一个预定义 ACL,或者要将自定义 ACL 更新为预定义 ACL,建议您将预定义 ACL 应用于现有对象或存储分区。例如,以下 PUT Object 请求可将预定义 ACL private 应用于名为 my-travel-maps 的存储分区中名为 europe/france/paris.jpg 的对象。

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>

有关管理 ACL 的详细信息,请参阅管理访问控制

从 Amazon S3 迁移到 Cloud Storage 请求方法

Cloud Storage 与 Amazon S3 支持相同的标准 HTTP 请求方法(用于向您的存储分区读取和写入数据)。因此,您当前用于 Amazon S3 的大多数工具和库也将适用于 Cloud Storage。Cloud Storage 支持以下请求方法:

  • 适用于 GET 的服务请求。
  • 存储分区请求,包括 PUT、GET、DELETE。
  • 对象请求,包括 GET、POST、PUT、HEAD 和 DELETE。

有关详情,请参阅 XML API 参考方法。请记住,当您向 Cloud Storage 发送请求时,您需要更改请求正文(如果适用),以便使用相应的 Cloud Storage 语法。例如,在为存储分区创建生命周期配置时,请使用与 Amazon S3 生命周期 XML 不同的 Cloud Storage 生命周期 XML。

Cloud Storage XML API 和 Amazon S3 之间存在一些差异,以下内容对这些差异进行了总结,并给出了建议的 Cloud Storage 替代方案:

Amazon S3 功能 Cloud Storage XML API 功能
多部分上传。
POST /<object-name>, PUT /<object-name>

在 Cloud Storage XML API 中,您可以上传一系列组件对象,从而为每个组件执行单独的上传。然后,您可以将对象组合为单个复合对象。

注意:虽然 JSON API 提供多部分上传功能,但此功能会将对象数据连同元数据一起发送。它并不等同于 S3 的多部分上传功能。

GET/POST 存储分区查询字符串参数:
  • “policy”- 使用 Amazon S3 存储分区政策。
  • “website”- 配置存储分区网站。
  • “tagging”- 标记存储分区以分配费用。
  • “notification”- 通知存储分区事件。
  • “requestPayment”- 配置为请求以及从存储分区下载的数据付费的对象。
替代方案:
  • “policy”- 借助 Cloud Storage ACL、项目团队成员身份以及使用多个项目的能力,您可以应对众多使用存储分区政策的情景。
  • “website”- 使用 gsutil web 命令管理网站,或尝试使用 JSON API(请参阅 buckets 资源)。
  • “tagging”- 使用多个项目来跟踪不同的费用中心。有关项目的更多信息,请参阅管理项目
  • “notification”- 使用 gsutil 或 JSON API Cloud Pub/Sub 通知
  • “requestPayment”- 使用多个项目(具有不同的结算配置文件)来管理为请求以及从存储分区下载的数据付费的对象。有关配置结算的详细信息,请参阅 Google API Console 帮助文档中的结算
多对象删除。
POST /?delete

使用 gsutil rm 命令可以轻松移除多个对象。rm 命令支持“-m”选项,可以执行并行(多线程/多处理)删除操作。

或者,也可以通过 JSON API 发送批量请求以减少客户端发起的 HTTP 连接数。

从 Amazon S3 迁移到 Cloud Storage 标头

Cloud Storage 使用了多个标准 HTTP 标头以及多个自定义(扩展)HTTP 标头。如果您要从 Amazon S3 过渡到 Cloud Storage,您可以将自定义 Amazon S3 标头转换为等效的 Cloud Storage 自定义标头或类似的功能,如下表所示。

Amazon S3 标头 Cloud Storage 标头
x-amz-acl x-goog-acl
x-amz-date x-goog-date
x-amz-meta-* x-goog-meta-*
x-amz-grant-* x-goog-acl(带有预定义的 ACL 值)。
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
x-amz-server-side-encryption 不需要。Cloud Storage 会在数据写入磁盘之前自动加密所有数据。有关详情,请参阅加密
x-amz-storage-class 您可以在创建存储分区时指定存储类别。有关详情,请参阅存储类别
x-amz-mfa 使用 OAuth 2.0 身份验证
x-amz-website-redirect-location, x-amz-copy-source-range 不适用

论坛以及针对与 Amazon S3 之间的 XML API 兼容性提供的支持服务

以前为 XML API 互操作性和迁移问题提供支持的 Cloud Storage gs 论坛处于归档模式。您现在可以使用标记 google-cloud-storage,在 Stack Overflow 上访问论坛。有关论坛和订阅公告的更多信息,请参阅资源和支持页面。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Cloud Storage
需要帮助?请访问我们的支持页面