从 Amazon S3 迁移到 Cloud Storage

本页面介绍了使用 API 发送请求的用户如何从 Amazon Simple Storage Service (Amazon S3) 迁移到 Cloud Storage。

如果您刚接触 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 中使用的工具和库做出几项简单的更改。

  • 完整迁移:与简单迁移相比,从 Amazon S3 到 Cloud Storage 的完整迁移还需要进行一些额外的步骤,但优点是,您可以使用 Cloud Storage 的所有特性,包括对服务帐号、多个项目及 OAuth 2.0 身份验证的支持。

简单迁移

在从 Amazon S3 到 Cloud Storage 的简单迁移中,您可以使用现有的工具和库生成向 Amazon S3 发出的经过身份验证的 REST 请求,如此也能一并向 Cloud Storage 发送经过身份验证的请求。 如要向 Cloud Storage 发出请求,您只需执行以下步骤:

  • 设置默认 Google 项目
  • 获取 HMAC 密钥
  • 在现有工具或库中,进行如下更改:

    • 将请求端点更改为使用 Cloud Storage XML API 请求端点
    • 将 Amazon Web Services (AWS) 访问密钥和密钥替换为相应的 Cloud Storage 访问密钥和密钥(统称为 Cloud Storage HMAC 密钥)。

完成这些更改后,您就可以开始使用现有工具和库将键控哈希消息身份验证代码 (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 list objects 方法执行。以下示例演示了这类列出对象的方法:

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 是用于互操作访问的默认项目

该项目现在是您的默认项目。您可以随时更改默认项目,方法是选择其他项目并按照上述步骤进行操作。

管理用于简单迁移的 HMAC 密钥

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

GOOGTS7C7FUP3AIRVJTE2BCD

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

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

如需生成 HMAC 密钥,请执行以下操作

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

关于使用 HMAC 密钥的安全提示

  • 您可以创建多个 HMAC 密钥。如果您要处理多个不同的项目,并且希望为每个项目使用不同的 HMAC 密钥,此操作将非常实用。

  • 切勿让其他人使用您的 HMAC 密钥。您的 HMAC 密钥会关联至您的 Google 帐号;您应该将其视为访问凭据使用。

  • 为保证安全性,建议您在轮替密钥时定期更改您的密钥。

  • 如果您认为其他人正在使用您的 HMAC 密钥,请立即删除受影响的 HMAC 密钥并创建新的 HMAC 密钥。

  • 更改 HMAC 密钥时,应先使用新 HMAC 密钥更新您的代码,然后再删除旧密钥。删除 HMAC 密钥时,这些密钥会立即失效且无法恢复。

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

授权标头

如果您要在简单迁移情景中进行需要身份验证的操作,请在操作中添加一个 Authorization 请求标头(与向 Amazon S3 发出请求时一样)。Amazon S3 请求的 Authorization 标头语法如下:

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

在简单迁移情景中,您只需将此标头更改为使用您的 Google HMAC 访问密钥,并确保您附加的 Signature 是以 Google HMAC 密钥进行计算:

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:访问密钥,用于标识发出请求并对请求进行签名的实体。在简单迁移中,请将您用于访问 Amazon S3 的 Amazon Web Service (AWS) 访问密钥 ID 替换为您的 Google HMAC 访问密钥。您的 Google HMAC 访问密钥应以 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 会使用访问密钥来查询您的密钥,并验证签名是否由您创建。如需详细了解如何获取访问密钥和密钥,请参阅在简单迁移情景中管理用于控制访问权限的 HMAC 密钥

    在简单迁移中,请将 AWS 访问密钥替换为您的 Google HMAC 密钥,以便派生加密密钥。

身份验证计算

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

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

以下伪代码显示了如何为 Authorization 标头创建签名:

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:请求的凭据范围,用于对待签名字符串进行签名,详情请参阅 Authorization 标头部分。
  • HashedCanonicalRequest:规范化请求的十六进制编码 SHA-256 哈希。使用 SHA-256 哈希函数创建规范化请求的哈希值。您的编程语言应具有用于创建 SHA-256 哈希的库。示例哈希值如下所示:

    436b7ce722d03b17d3f790255dd57904f7ed61c02ac5127a0ca8063877e4e42c

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

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

身份验证请求示例

以下示例会将名为 /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 了解将会收到采用 Amazon S3 ACL XML 语法的 ACL 语法。您应确保自己使用的 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 或 Bucket 请求)时,Cloud Storage 会返回 Amazon S3 ACL 语法。
  • 向 Cloud Storage 发出应用 ACL 的请求(例如 PUT Object 或 Bucket 请求)时,Cloud Storage 应会收到 Amazon S3 ACL 语法。

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

Authorization: AWS4-HMAC-SHA256 Credential=GOOG-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(请参阅创建和管理访问控制列表)。
  • 在请求中设置 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 的方法与您在 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 之间的一些差异,并给出了建议的 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(请参阅 存储分区 资源)。
  • “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 标头,您只需将 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 标头和查询字符串参数

针对 XML API 与 Amazon S3 兼容性的支持服务

有关 XML API 互操作性的讨论,请参阅 Stack Overflow(使用 google-cloud-storage 标记)。如需详细了解论坛以及如何订阅公告,请参阅获取支持页面。

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

发送以下问题的反馈:

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