从 Amazon S3 到 Cloud Storage 的完整迁移

本页面介绍使用 API 发送请求的用户如何从 Amazon Simple Storage Service (Amazon S3) 完整迁移到 Cloud Storage。进行完整迁移后,您可以使用 Cloud Storage 的所有功能,包括多项目及 OAuth 2.0 身份验证。

如果您希望快速开始使用 Cloud Storage,您可以选择简单迁移,只需对您当前在 Amazon S3 中使用的工具和库做出几项简单的更改即可。

从 Amazon S3 迁移到 Cloud Storage

如需从 Amazon S3 完整迁移到 Cloud Storage,您需要完成以下步骤:

  • 将现有的 x-amz-* 标头更改为相应的 x-goog-* 标头。
  • 将 AWS 访问控制列表 (ACL) XML 更改为相应的 Cloud Storage ACL XML(请参阅创建和管理访问控制列表)。
  • 在请求中设置 x-goog-project-id 标头。
  • 按照 OAuth 2.0 身份验证中所述,完成相关设置以使用 OAuth 2.0 身份验证。第一步是向 Google 注册您的应用(即您将从中发出请求的应用)。使用 OAuth 2.0 时,您的 Authorization 标头将如下所示:

    Authorization: Bearer OAUTH2_TOKEN

    OAuth 2.0 依靠 SSL 维护安全性,不要求应用直接进行加密签名,因此更容易实现。借助 OAuth,您的应用可以请求访问与用户账号关联的数据,并且可以将访问权限限定为多个级别(包括只读、读写和完全控制)。如需了解详情,请参阅 OAuth 2.0 身份验证

访问权限控制

本节介绍了一些访问控制示例,这些示例可帮助您从 Amazon S3 迁移到 Cloud Storage。如需简要了解 Cloud Storage 中的访问权限控制,请参阅访问权限控制

在 Cloud Storage 中,您可以通过多种方法将 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 请求。ACL 将在请求正文中发送的 XML 文档中定义。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 查询字符串参数和 GET 方法来检索存储桶和对象 ACL。ACL 会在附加于响应正文的 XML 文档中说明。您必须具有 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,其中包括 private、public-read、public-read-write 以及其他权限设置。如需查看 Cloud Storage 预定义 ACL 的列表,请参阅预定义 ACL

以下示例显示了一个 PUT 对象请求,该请求将 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 对象请求可将预定义 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 支持的标准 HTTP 请求方法与 Amazon S3 支持的请求方法相同。因此,您目前在 Amazon S3 中使用的大多数工具和库也将适用于 Cloud Storage。Cloud Storage 支持以下请求方法:

  • GET 服务请求。
  • PUTGETDELETE 等存储桶请求。
  • GETPOSTPUTHEADDELETE等对象请求。

有关详情,请参阅 XML API 参考方法。请记住,当您向 Cloud Storage 发送请求时,您需要视情况更改请求正文,使其使用适当的 Cloud Storage 语法。例如,在为存储桶创建生命周期配置时,请使用 Cloud Storage 生命周期 XML,而不是使用 Amazon S3 生命周期 XML。

下面总结了 Cloud Storage XML API 和 Amazon S3 之间的一些差异:

Amazon S3 功能 Cloud Storage XML API 功能
分段上传中使用客户提供的加密键时,最终请求不包括客户提供的加密键。 在 Cloud Storage XML API 中,分段上传中的所有请求(包括最终请求)要求您提供相同的客户提供的加密密钥。存在此要求的原因是,Cloud Storage 在等待上传完成时不会存储您的加密密钥信息,但这项请求需要使用密钥来计算已完成对象的校验和。
在 Amazon S3 中,V4 签名可用于对使用分块传输编码的上传进行身份验证。 在 Cloud Storage XML API 中,分块传输编码和 V4 签名目前无法同时使用。某些 Amazon S3 工具默认使用分块传输编码以及签名;您应该在此类情况下停用分块传输编码。
GET/POST 存储桶查询字符串参数:
  • “policy”- 使用 Amazon S3 存储桶政策。
  • “notification”- 通知存储桶事件。
  • “requestPayment”- 配置请求和存储桶数据下载费用的支付者。
替代方案:
  • “policy”- 借助 Cloud Storage ACL、项目团队成员资格以及使用多个项目的能力,您可以应对众多使用存储桶政策的情景。
  • “notification”- 使用 gcloud CLI 或 JSON API Pub/Sub 通知
  • “requestPayment”- 在 Cloud Storage 中,requestPayment 的等效查询字符串参数为 billing
多对象删除。
POST /?delete

使用 Google Cloud 控制台可轻松移除多个对象。

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

从 Amazon S3 迁移到 Cloud Storage 标头

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

对于大部分 Amazon S3 标头,您只需将 x-amz 前缀替换为 x-goog 即可实现转换:

Amazon S3 标头 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

对于少数 Amazon S3 标头,有的需要转换为完全不同的 Cloud Storage 标头,有的不适用于 Cloud Storage:

Amazon S3 标头 Cloud Storage 标头
x-amz-server-side-encryption 不需要。Cloud Storage 会在数据写入磁盘之前自动加密所有数据。有关详情,请参阅加密
x-amz-grant-* 具有预定义 ACL 值的 x-goog-acl
x-amz-mfa 使用 OAuth 2.0 身份验证
x-amz-website-redirect-locationx-amz-copy-source-range 不适用

如需了解 Cloud Storage 标头,请参阅适用于 XML API 的 HTTP 标头和查询字符串参数

后续步骤