从 Amazon S3 迁移到 Cloud Storage

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

如果您刚接触 Cloud Storage,并且不会直接使用 API,请考虑使用 Google Cloud Console 来设置和管理转移作业。Google Cloud 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 访问 ID 和密钥(统称为 Cloud Storage HMAC 密钥)。
    • 请确保您的 x-amz- 标头使用受支持的 Cloud Storage 值。例如,x-amz-storage-class 应使用一个可用的 Cloud Storage 存储类别

      在简单迁移情景中使用 Cloud Storage XML API 时,通过在 Authorization 标头中指定 AWS 签名标识符,您可让 Cloud Storage 了解,您的请求中会出现 x-amz-* 标头和 Amazon S3 ACL XML 语法。Cloud Storage 会处理具有 x-goog-* 等效项的 x-amz-* 标头,如标头表中列出的标头。

完成这些更改后,您就可以开始使用现有工具和库将键控哈希消息身份验证代码 (HMAC) 请求发送到 Cloud Storage。

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

Go

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

import (
	"context"
	"fmt"
	"io"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

func listGCSBuckets(w io.Writer, googleAccessKeyID string, googleAccessKeySecret string) error {
	// googleAccessKeyID := "Your Google Access Key ID"
	// googleAccessKeySecret := "Your Google Access Key Secret"

	// 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.
	sess := session.Must(session.NewSession(&aws.Config{
		Region:      aws.String("auto"),
		Endpoint:    aws.String("https://storage.googleapis.com"),
		Credentials: credentials.NewStaticCredentials(googleAccessKeyID, googleAccessKeySecret, ""),
	}))

	client := s3.New(sess)
	ctx := context.Background()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()
	result, err := client.ListBucketsWithContext(ctx, &s3.ListBucketsInput{})
	if err != nil {
		return fmt.Errorf("ListBucketsWithContext: %v", err)
	}

	fmt.Fprintf(w, "Buckets:")
	for _, b := range result.Buckets {
		fmt.Fprintf(w, "%s\n", aws.StringValue(b.Name))
	}

	return nil
}

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 列出对象方法执行。以下示例演示了这类列出对象的方法:

Go

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

import (
	"context"
	"fmt"
	"io"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

func listGCSObjects(w io.Writer, bucketName string, googleAccessKeyID string, googleAccessKeySecret string) error {
	// bucketName := "your-gcs-bucket-name"
	// googleAccessKeyID := "Your Google Access Key ID"
	// googleAccessKeySecret := "Your Google Access Key Secret"

	// 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.
	sess := session.Must(session.NewSession(&aws.Config{
		Region:      aws.String("auto"),
		Endpoint:    aws.String("https://storage.googleapis.com"),
		Credentials: credentials.NewStaticCredentials(googleAccessKeyID, googleAccessKeySecret, ""),
	}))

	client := s3.New(sess)
	ctx := context.Background()

	result, err := client.ListObjectsWithContext(ctx, &s3.ListObjectsInput{
		Bucket: aws.String(bucketName),
	})
	if err != nil {
		return fmt.Errorf("ListObjectsWithContext: %v", err)
	}

	fmt.Fprintf(w, "Objects:")
	for _, o := range result.Contents {
		fmt.Fprintf(w, "%s\n", aws.StringValue(o.Key))
	}

	return nil
}

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;

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,我们建议您设置默认项目。在您设置默认项目后,Cloud Storage 便会知道要将哪个项目用于 GET 服务或 PUT 存储分区等操作。如果您未设置默认项目,则必须在特定请求中指定项目标头

如需设置默认项目,请执行以下操作

  1. Google Cloud Console打开 Cloud Storage 设置页面
  2. 选择互操作性标签页。
  3. 点击位于“互操作访问的默认项目”部分中的PROJECT-ID 设置为默认项目

    如果该项目已经是默认项目,您将会看到 PROJECT-ID 是用于互操作访问的默认项目

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

替代方案:指定项目标头

您还可以在需要您指定项目的各个请求中使用 x-amz-project-id 标头,以取代设置默认项目或作为其补充。

  • 即使您设置了默认项目,使用 x-amz-project-id 的请求也会使用标头中指定的项目。

在以下情况下,使用 x-amz-project-id 标头非常有用:

  • 您正在处理多个项目。
  • 您的请求由与其他项目关联的服务帐号发出,因为服务帐号会将其父项目用作默认项目。

请注意,Amazon S3 没有项目,因此根据您使用的工具或客户端库,可能无法指定 x-amz-project-id 标头。在这种情况下,您应该设置默认项目

使用 HMAC 密钥进行简单迁移

如需在简单迁移情景中使用 Cloud Storage XML API,请使用 Cloud Storage 基于哈希的消息身份验证代码 (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 访问 ID,并确保您附加的 Signature 是以 Google HMAC 密钥计算得出的:

Authorization: ALGORITHM Credential=GOOG-ACCESS-ID/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-ID:访问 ID 标识发出请求并对请求签名的实体。在简单迁移中,请将您用于访问 Amazon S3 的 Amazon Web Service (AWS) 访问密钥 ID 替换为您的 Google HMAC 访问 ID。您的 Google HMAC 访问 ID 应以 GOOG 开头。

  • CREDENTIAL_SCOPE:凭据范围,如签名中所定义。在简单迁移中,如果您使用 AWS4-HMAC-SHA256 作为 ALGORITHM 值,则无需更改凭据范围。

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

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

    content-type;host;x-amz-date

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

  • SIGNATURE:允许对请求进行身份验证的签名。在简单迁移中,将 AWS 访问密钥信息替换为等效的 Google HMAC 密钥信息。

身份验证请求示例

以下示例会将名为 /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-ID/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 或 GET Bucket 请求)时,Cloud Storage 会返回 Amazon S3 ACL 语法。
  • 向 Cloud Storage 发出应用 ACL 的请求(例如 PUT Object 或 PUT Bucket 请求)时,Cloud Storage 应会收到 Amazon S3 ACL 语法。

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

Authorization: AWS4-HMAC-SHA256 Credential=GOOG-ACCESS-ID/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,您可以充分利用包括 OAuth 2.0 身份验证在内的所有 Cloud Storage 功能。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 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 标记)。如需详细了解论坛以及如何订阅公告,请参阅获取支持页面。