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 に簡単に移行できます。次の 2 つの移行オプションがあります。

  • 単純な移行: Amazon S3 から移行する場合、Cloud Storage を始めるための最も簡単な方法です。現在 Amazon S3 で使用しているツールやライブラリで必要な変更はわずかで、単純なものです。

  • 完全な移行: Amazon S3 から Cloud Storage への完全な移行は、単純な移行に比べて少し多い手順が必要ですが、サービス アカウント、複数のプロジェクト、認証用の OAuth 2.0 など、Cloud Storage のすべての機能を使用できます。

単純な移行

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 を単純な移行のシナリオで使用する場合、AWS 署名 ID を Authorization ヘッダーで使用すると、Cloud Storage では x-amz-* ヘッダーと Amazon S3 ACL XML 構文がリクエストに存在するものと想定します。

デフォルトのプロジェクトの設定

単純な移行のシナリオで Cloud Storage を使用するには、デフォルトのプロジェクトを選択する必要があります。デフォルトのプロジェクトを選択すると、GET サービスや PUT バケットなどのオペレーションに使用するプロジェクトが Cloud Storage に指示されます。

デフォルトのプロジェクトを設定するには:

  1. Google Cloud Platform Console[Cloud Storage の設定] ページを開きます
  2. [相互運用性] を選択します。
  3. [プロジェクト ID をデフォルト プロジェクトにする] をクリックします。

    プロジェクトがすでにデフォルトになっている場合は、[プロジェクト ID が相互運用アクセスのデフォルト プロジェクトです] と表示されます。

これで、このプロジェクトがデフォルトのプロジェクトになりました。別のプロジェクトを選択して次の手順を行うことで、いつでもデフォルトのプロジェクトを変更できます。

単純な移行での HMAC キーの管理

単純な移行のシナリオで Cloud Storage XML API を使用するには、認証情報に Cloud Storage のハッシュベースのメッセージ認証コード(HMAC)キーを使用します。HMAC キーは「アクセスキー」と「秘密鍵」で構成されます。アクセスキーは 24 文字の英数字からなる文字列で、Google アカウントに関連付けられています。Cookie ベースの認証を使用するものを除き、認証されたすべての Cloud Storage リクエストは、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 キーはすぐに無効になり、復元できません。

単純な移行のシナリオでの認証

認証ヘッダー

認証が必要な単純な移行のシナリオのオペレーションでは、Amazon S3 にリクエストを送信するときと同じように、Authorization リクエスト ヘッダーを含めます。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

    単純な移行で、ALGORITHM の値に AWS4-HMAC-SHA256 を使用している場合、認証情報スコープを変更する必要はありません。GOOG4-HMAC-SHA256 を使用する場合、aws4_requestgoog4_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 エンコードされた 2 つの入力パラメータ、すなわち署名鍵と署名対象文字列が必要になります。

署名鍵は 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: 正規リクエストの 16 進エンコードの 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 ヘッダーを指定しなかったため、メッセージの 2 行目に空文字列が表示されています。

単純な移行シナリオでのアクセス制御

単純な移行をサポートするために、Cloud Storage では Amazon S3 によって生成される ACL を使用できます。単純な移行のシナリオでは、AWS を署名 ID として使用することで、Amazon S3 ACL XML 構文を使用して、ACL 構文に対応するよう Cloud Storage に指示します。使用する 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 ヘッダーは、署名 ID として AWS を使用しますが、Google アクセスキーもあわせて使用します。

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

次の例は、オブジェクトの ACL を返す Cloud Storage に対する 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>

次の例は、オブジェクトの ACL を設定する Cloud Storage に対する 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 署名 ID を使用することもできます。この場合、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 を指定する方法のうち 2 つは、Amazon S3 の方法と似ています。

  • 特定の範囲の ACL を適用するための acl クエリ文字列パラメータ。
  • x-goog-acl リクエスト ヘッダーを使用すると、定義済み ACL(ACL テンプレート)を適用できます。

acl クエリ文字列パラメータの使用

Cloud Storage リクエストの acl 文字列パラメータは、Amazon S3 リクエストで使用する場合とまったく同じ方法で使用できます。acl パラメータを PUT メソッドと組み合わせて使用し、ACL を既存のオブジェクト、既存のバケット、作成中のバケットに適用します。PUT リクエストで acl クエリ文字列パラメータを使用する場合は、Cloud Storage ACL 構文を使用して、リクエストの本文に XML ドキュメントを添付する必要があります。この XML ドキュメントに、バケットまたはオブジェクトに適用する個別の ACL エントリを記述します。

次の例は、acl クエリ文字列パラメータを使用する Amazon S3 に対する PUT リクエストを示しています。ACL は、リクエストの本文で送信される XML ドキュメント内に定義されます。この PUT リクエストは my-travel-maps というバケット内にある europe/france/paris.jpg というオブジェクトの ACL を変更します。この 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/> 要素は必要ありません。詳しくは、バケットとオブジェクトの所有権をご覧ください。

また、GET メソッドで acl クエリ文字列パラメータを使用して、バケットやオブジェクトの ACL を取得することもできます。ACL は、レスポンスの本文に添付された XML ドキュメントに記載されます。オブジェクトまたはバケットの ACL を適用したり取得したりするには、FULL_CONTROL 権限が必要です。

拡張リクエスト ヘッダーを使用した ACL の適用

Cloud Storage リクエストで x-goog-acl ヘッダーを使用すると、Amazon S3 リクエストで x-amz-acl ヘッダーを使用する場合とまったく同じ方法で事前に定義された ACL をバケットやオブジェクトに適用できます。通常は、バケットやオブジェクトの作成時またはアップロード時に x-goog-aclx-amz-acl)ヘッダーを使用して、定義済み ACL を適用します。Cloud Storage の定義済み ACL は、Amazon S3 Canned ACL と同様、private、public-read、public-read-write などを含んでいます。Cloud Storage の定義済み ACL のリストについては、定義済み ACL をご覧ください。

次の例は、europe/france/paris.jpg という名前のオブジェクトに public-read ACL を適用する PUT Object リクエストを示しています。このオブジェクトは、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 を適用すると便利です。たとえば、次の PUT Object リクエストでは、定義済み ACL privatemy-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 では、バケットのデータの読み取りと書き込みのために、Amazon S3 でサポートされるメソッドと同じ標準の HTTP リクエスト メソッドがサポートされています。そのため、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 では、一連のコンポーネント オブジェクトをアップロードし、各コンポーネントの個別のアップロードを実行できます。その後、オブジェクトを合成して 1 つのオブジェクトにできます。

注: JSON API にはマルチパート アップロード機能がありますが、この機能は、オブジェクト データとともにメタデータを送信するために使用するものです。S3 のマルチパート アップロード機能とは異なります。

GET/POST バケットクエリ文字列パラメータ:
  • 「policy」 - Amazon S3 バケット ポリシーを操作します。
  • 「website」 - バケット ウェブサイトを構成します。
  • 「tagging」 - コスト アプリケーションを目的としてバケットにタグ付けします。
  • 「notification」 - バケット イベントを通知します。
  • 「requestPayment」 - リクエストとバケットからのデータ ダウンロードのコストの負担元を構成します。
別の方法:
  • 「policy」 - Cloud Storage ACL、プロジェクト チーム メンバーシップ、複数のプロジェクトを使用できる機能により、バケット ポリシーが使用される多くのシナリオを解決できます。
  • 「website」 - gsutil web コマンドを使用してウェブサイトを管理するか、JSON API を試してください(buckets リソースをご覧ください)。
  • 「tagging」 - 複数のプロジェクトを使用して、異なる複数のコストセンターをトラックします。プロジェクトについて詳しくは、プロジェクトの管理をご覧ください。
  • 「notification」 - gsutil または JSON API Cloud Pub/Sub Notifications を使用します。
  • 「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-* x-goog-acl と定義済みの ACL 値。
x-amz-mfa OAuth 2.0 認証を使用します。
x-amz-website-redirect-locationx-amz-copy-source-range なし

Cloud Storage ヘッダーについては、XML API の HTTP ヘッダーとクエリ文字列パラメータをご覧ください。

Amazon S3 と XML API の互換性に関するサポート

XML API の相互運用性については、google-cloud-storage タグを使用してスタック オーバーフローを参照してください。ディスカッション フォーラムと通知の登録に関する詳細については、サポートの利用ページをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。