本页面介绍使用 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 时,您的
Authorization标头将如下所示:Authorization: Bearer OAUTH2_TOKEN
OAuth 2.0 依靠 SSL 维护安全性,不要求应用直接进行加密签名,因此更容易实现。借助 OAuth,您的应用可以请求访问与用户账号关联的数据,并且可以将访问权限限定为多个级别(包括只读、读写和完全控制)。如需了解详情,请参阅 Cloud Storage 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 会向 jeffersonloveshiking@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>jeffersonloveshiking@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>jeffersonloveshiking@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服务请求。PUT、GET、DELETE等存储桶请求。GET、POST、PUT、HEAD和DELETE等对象请求。
有关详情,请参阅 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 存储桶查询字符串参数:
|
替代方案:
|
| 多对象删除。 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-version-id |
x-goog-generation |
x-amz-mfa |
使用 OAuth 2.0 身份验证。 |
x-amz-decoded-content-length |
不支持作为 x-goog 标头 |
x-amz-website-redirect-location、x-amz-copy-source-range |
不适用 |
如需了解 Cloud Storage 标头,请参阅适用于 XML API 的 HTTP 标头和查询字符串参数。
组织政策对 HMAC 密钥身份验证的影响
如果您从 Amazon S3 迁移到 Cloud Storage 的工作负载依赖于基于哈希的消息身份验证代码 (HMAC) 密钥进行身份验证,请注意,Google Cloud 组织政策服务允许管理员强制执行安全限制。constraints/storage.restrictAuthTypes 政策可用于防止使用特定身份验证类型。如需详细了解每种身份验证类型,请参阅限制身份验证类型。
如果您的组织制定了拒绝使用您的工具配置为使用的 HMAC 密钥类型的政策,那么您尝试连接到 Cloud Storage 时会失败,并显示 403 Forbidden 错误。
为防止出现此错误,在迁移依赖于 HMAC 密钥身份验证的工作流之前,请咨询 Google Cloud 组织管理员,确定是否强制执行 constraints/storage.restrictAuthTypes 政策,以及限制了哪些身份验证类型(如果有)。如果系统不允许使用 HMAC 密钥,您需要调整工具和应用,以使用其他 Google Cloud 身份验证方法,例如使用 OAuth 2.0 的服务账号凭证。
后续步骤
- 规划从 Amazon S3 进行的迁移。
- 使用 Storage Transfer Service 将数据从外部来源转移到 Cloud Storage(外部来源有 Amazon S3 和 Microsoft Azure Blob Storage 等)。
- 创建事件驱动型转移作业,以使用 Amazon S3 事件通知使 Cloud Storage 存储桶与 Amazon S3 保持同步。