從 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 身分驗證機制。

簡易遷移

在簡易遷移模式下,您必須使用既有的工具和程式庫來產生經過驗證的 REST 要求,再將要求傳送到 Cloud Storage,這和您在使用 Amazon S3 時所採取的做法是一樣的。向 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 清單物件方法才能列出物件。以下範例顯示這類列出物件的方法:

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 Settings」 (Cloud Storage 設定) 頁面
  2. 選取 [Interoperability] (互通性)
  3. 按一下 [Make PROJECT-ID my default project] (將 PROJECT-ID 設為預設專案

    如果專案已經是預設專案,您會看到「PROJECT-ID is your default project for interoperable access」 (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 Settings」 (Cloud Storage 設定) 頁面
  2. 選取 [Interoperability] (互通性)
  3. 如果您之前未設定互通性,請按一下 [Enable interoperability access] (啟用互通性存取權)
  4. 按一下 [Create a new key] (建立新的金鑰)。

使用 HMAC 金鑰的安全性提示

  • 您可以建立多個 HMAC 金鑰。如果您正在處理多個不同的專案,且想要為每個專案使用不同的 HMAC 金鑰,這個方法就非常實用。

  • 不要讓其他人使用您的 HMAC 金鑰。您的 HMAC 金鑰已連結至您的 Google 帳戶,請將其視同一般存取憑證妥善使用。

  • 為了確保最佳安全性,建議您定期變更金鑰以完成金鑰輪替。

  • 如果您認為其他人正在使用您的 HMAC 金鑰,您必須立即刪除受影響的 HMAC 金鑰,然後建立新的金鑰。

  • 變更 HMAC 密鑰時,應在刪除舊金鑰之前使用新的 HMAC 金鑰更新代碼。當您刪除 HMAC 金鑰時,它們將立即失效並且無法復原。

在簡易遷移情境中進行驗證

Authorization 標頭

如果您要在簡易遷移情境中進行需要驗證的操作,則必須包含 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 作為雜湊函式所建立,並由密鑰及憑證範圍衍生金鑰作為加密編譯金鑰。結果摘要即會以 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:要求的憑證範圍,用於簽署欲簽署字串,詳情請參閱驗證標頭一節。
  • 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 物件或 值區要求) 時,Cloud Storage 會傳回 Amazon S3 ACL 語法。
  • 向 Cloud Storage 提出套用 ACL 的要求時 (例如,PUT 物件或 值區要求) 時,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 提出之傳回物件 ACL 的 GET 要求。

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 提出之設定物件 ACL 的 PUT 要求。範例說明採用 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 要求會針對 my-travel-maps 值區中的 europe/france/paris.jpg 物件變更 ACL。接著 ACL 會將 FULL_CONTROL 權限授予 jane@gmail.com。

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 套用至正在上傳至 Amazon S3 my-travel-maps 值區的 europe/france/paris.jpg 物件。

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 控制台說明文件中的計費部分。
刪除多個物件。
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

在 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
需要協助嗎?請前往我們的支援網頁