ソースへのアクセスを構成する: Amazon S3

Amazon S3 バケットへのアクセスは、次のいずれかの方法で設定できます。

サポートされるリージョン

Storage Transfer Service は、次の Amazon S3 リージョンからデータを転送できます。 af-south-1ap-east-1ap-northeast-1ap-northeast-2ap-northeast-3ap-south-1ap-south-2ap-southeast-1ap-southeast-2ap-southeast-3ca-central-1eu-central-1eu-central-2eu-north-1eu-south-1eu-south-2eu-west-1eu-west-2eu-west-3me-central-1me-south-1sa-east-1us-east-1us-east-2us-west-1us-west-2

必要な権限

Storage Transfer Service を使用して Amazon S3 バケットからデータを移動するには、ユーザー アカウントまたはフェデレーション ID のロールにバケットに対する適切な権限が必要です。

権限 説明 使用
s3:ListBucket Storage Transfer Service にバケット内のオブジェクトの一覧表示を許可します。 常に必要。
s3:GetObject Storage Transfer Service にバケット内のオブジェクトの読み取りを許可します。 すべてのオブジェクトを現在のバージョンに転送する場合は必須です。マニフェストでオブジェクトのバージョンが指定されている場合は、代わりに s3:GetObjectVersion を使用します。
s3:GetObjectVersion Storage Transfer Service にバケット内の特定のバージョンのオブジェクトの読み取りを許可します。 マニフェストでオブジェクトのバージョンが指定されている場合は必須です。それ以外の場合は、s3:GetObject を使用します。
s3:DeleteObject Storage Transfer Service にバケット内のオブジェクトの削除を許可します。 deleteObjectsFromSourceAfterTransfertrue に設定する場合は必須です。

アクセス認証情報を使用して認証する

アクセスキー ID と秘密鍵を使用して AWS を認証するには:

  1. AWS Identity and Access Management(AWS IAM)ユーザーを transfer-user などのわかりやすい名前で作成します。

  2. AWS アクセスタイプで [Access key - Programmatic access] を選択します。

  3. 次のいずれかのロールをユーザーに付与します。

    • AmazonS3ReadOnlyAccess。ソースに対する読み取り専用アクセス権を付与します。これにより転送は可能になりますが、転送完了後にソースでオブジェクトを削除することはできません。
    • AmazonS3FullAccess。転送時にオブジェクトを削除するように構成されている場合に使用します。
    • 上の必要な権限の表にある適切な権限を持つカスタムロール。 最小権限の JSON は次の例のようになります。

      {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::AWS_BUCKET_NAME/*",
                    "arn:aws:s3:::AWS_BUCKET_NAME"
                ]
            }
        ]
      }
  4. ユーザーが正常に作成されたら、アクセスキー IDシークレット アクセス キーをメモします。

アクセスキー ID とシークレット アクセスキーを Storage Transfer Service に渡す方法は、転送を開始するために使用するインターフェースによって異なります。

Cloud コンソール

値を転送ジョブ作成フォームに直接入力します。

開始するには、転送を作成するをご覧ください。

gcloud CLI

次の形式の JSON ファイルを作成します。

{
  "accessKeyId": "AWS_ACCESS_KEY_ID",
  "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}

source-creds-file フラグを使用して、ファイルの場所を gcloud transfer jobs create コマンドに渡します。

gcloud transfer jobs create s3://S3_BUCKET_NAME gs://GCS_BUCKET_NAME \
  --source-creds-file=PATH/TO/KEYFILE.JSON

REST API

transferSpec オブジェクトに awsS3DataSource オブジェクトの一部として鍵情報を含める必要があります。

"transferSpec": {
  "awsS3DataSource": {
    "bucketName": "AWS_SOURCE_NAME",
    "awsAccessKey": {
      "accessKeyId": "AWS_ACCESS_KEY_ID",
      "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
    }
  },
  "gcsDataSink": {
    "bucketName": "GCS_SINK_NAME"
  }
}

クライアント ライブラリ

転送を作成するページの例をご覧ください。

アクセス認証情報を Secret Manager に保存する

Secret Manager は、パスワードなどの機密データを保存して管理する安全なサービスです。強力な暗号化、ロールベース アクセス制御、監査ロギングによりシークレットを保護します。

Storage Transfer Service では、Secret Manager を利用して AWS のアクセス認証情報を保護できます。Secret Manager に認証情報を読み込み、シークレット リソース名を Storage Transfer Service に渡します。

API を有効にする

Enable the Secret Manager API.

Enable the API

追加の権限を構成する

ユーザー権限

シークレットを作成するユーザーには、次のロールが必要です。

  • Secret Manager 管理者(roles/secretmanager.admin

ロールを付与する方法を確認する。

サービス エージェントの権限

Storage Transfer Service のサービス エージェントには、次の IAM ロールが必要です。

  • Secret Manager のシークレット アクセサー(roles/secretmanager.secretAccessor

サービス エージェントにロールを付与するには:

Cloud コンソール

  1. 手順に沿ってサービス エージェントのメールアドレスを取得します。

  2. Google Cloud コンソールで [IAM] ページに移動します。

    [IAM] に移動

  3. [アクセス権を付与] をクリックします。

  4. [新しいプリンシパル] テキスト ボックスに、サービス エージェントのメールアドレスを入力します。

  5. [ロールを選択] プルダウンで、「Secret Manager のシークレット アクセサー」を検索して選択します。

  6. [保存] をクリックします。

gcloud

gcloud projects add-iam-policy-binding コマンドを使用して、サービス エージェントに IAM ロールを追加します。

  1. 手順に沿ってサービス エージェントのメールアドレスを取得します。

  2. コマンドラインで次のコマンドを入力します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='serviceAccount:SERVICE_AGENT_EMAIL' \
      --role='roles/secretmanager.secretAccessor'
    

シークレットを作成する

Secret Manager でシークレットを作成します。

Cloud コンソール

  1. Google Cloud コンソールの [Secret Manager] ページに移動します。

    Secret Manager に移動

  2. [シークレットの作成] をクリックします。

  3. 名前を入力します。

  4. [シークレットの値] テキスト ボックスに、次の形式で認証情報を入力します。

    {
      "accessKeyId": "AWS_ACCESS_KEY_ID",
      "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
    }
    
  5. [シークレットの作成] をクリックします。

  6. シークレットが作成されたら、シークレットの完全なリソース名をメモします。

    1. [概要] タブを選択します。

    2. [リソース ID] の値をコピーします。これには次の形式が使用されます。

      projects/1234567890/secrets/SECRET_NAME

gcloud

gcloud コマンドライン ツールを使用して新しいシークレットを作成するには、JSON 形式の認証情報を gcloud secrets create コマンドに渡します。

printf '{
  "accessKeyId": "AWS_ACCESS_KEY_ID",
  "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}' | gcloud secrets create SECRET_NAME --data-file=-

シークレットの完全なリソース名を取得します。

gcloud secrets describe SECRET_NAME

レスポンスの name の値をメモします。これには次の形式が使用されます。

projects/1234567890/secrets/SECRET_NAME

シークレットの作成と管理の詳細については、Secret Manager のドキュメントをご覧ください。

シークレットをジョブ作成コマンドに渡す

Storage Transfer Service で Secret Manager を使用するには、REST API を使用して転送ジョブを作成する必要があります。

Secret Manager リソース名を transferSpec.awsS3DataSource.credentialsSecret フィールドの値として渡します。

POST https://storagetransfer.googleapis.com/v1/transferJobs

{
  "description": "Transfer with Secret Manager",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec": {
      "awsS3DataSource": {
          "bucketName": "AWS_BUCKET_NAME",
          "credentialsSecret": "SECRET_RESOURCE_ID",
      },
      "gcsDataSink": {
          "bucketName": "CLOUD_STORAGE_BUCKET_NAME"
      }
  }
}

フェデレーション ID を使用して認証する

フェデレーション ID を使用して AWS を認証するには:

  1. AWS で新しい IAM ロールを作成します。

  2. 信頼できるエンティティ タイプとして [Custom trust policy] を選択します。

  3. 次の信頼ポリシーをコピーして貼り付けます。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "SUBJECT_ID"
            }
          }
        }
      ]
    }
    
  4. SUBJECT_ID は、Storage Transfer Service の使用を開始するときに自動的に作成される、Google 管理のサービス アカウントの subjectID に置き換えます。subjectID を取得するには:

    1. googleServiceAccounts.get リファレンス ページに移動します。

      [Try this method] というインタラクティブ パネルが開きます。

    2. パネルの [Request parameters] にプロジェクト ID を入力します。ここで指定するプロジェクトは、Storage Transfer Service の管理に使用しているプロジェクトである必要があります。

    3. [実行] をクリックします。レスポンスに subjectId が含まれている。

  5. 次のいずれかの権限ポリシーをロールに付与します。

    • AmazonS3ReadOnlyAccess。ソースへの読み取り専用アクセスを提供します。これにより転送は可能になりますが、転送完了後にソースでオブジェクトを削除することはできません。
    • AmazonS3FullAccess。転送時にオブジェクトを削除するように構成されている場合に使用します。
    • 上の必要な権限の表にある適切な権限を持つカスタムロール。 最小権限の JSON は次の例のようになります。

      {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::AWS_BUCKET_NAME/*",
                    "arn:aws:s3:::AWS_BUCKET_NAME"
                ]
            }
        ]
      }
  6. ロールに名前を割り当てて、ロールを作成します。

  7. 作成したら、ロールの詳細を表示して、Amazon リソース名(ARN)を取得します。この値をメモします。形式は arn:aws:iam::AWS_ACCOUNT:role/ROLE_NAME です。

ARN を Storage Transfer Service に渡す方法は、転送の開始に使用するインターフェースによって異なります。

Cloud コンソール

ARN を転送ジョブ作成フォームに直接入力します。

開始するには、転送を作成するをご覧ください。

gcloud CLI

次の形式の JSON ファイルを作成します。

{
  "roleArn": "ARN"
}

source-creds-file フラグを使用して、ファイルの場所を gcloud transfer jobs create コマンドに渡します。

gcloud transfer jobs create s3://S3_BUCKET_NAME gs://GCS_BUCKET_NAME \
  --source-creds-file=PATH/TO/ARNFILE.JSON

REST API

transferSpec オブジェクトに awsS3DataSource オブジェクトの一部として ARN 情報を含める必要があります。

"transferSpec": {
  "awsS3DataSource": {
    "bucketName": "AWS_SOURCE_NAME",
    "roleArn": "ARN"
  },
  "gcsDataSink": {
    "bucketName": "GCS_SINK_NAME"
  }
}

クライアント ライブラリ

転送を作成するページの例をご覧ください。

IP の制限

AWS プロジェクトでストレージへのアクセスに IP 制限を使用する場合は、Storage Transfer Service ワーカーで使用される IP 範囲を許可 IP リストに追加する必要があります。

これらの IP 範囲は変更される可能性があるため、永続的なアドレスに現在の値を JSON ファイルとして公開します。

https://www.gstatic.com/storage-transfer-service/ipranges.json

ファイルに新しい範囲が追加された場合、Storage Transfer Service からのリクエストに対してその範囲が使用されるまでに少なくとも 7 日間はかかります。

セキュリティ構成を最新の状態に保つため、少なくとも週に 1 回、このドキュメントからデータを pull することをおすすめします。JSON ファイルから IP 範囲を取得する Python スクリプトの例については、Virtual Private Cloud のドキュメントをご覧ください。

これらの範囲を許可された IP として追加するには、AWS S3 のドキュメントの特定の IP アドレスに基づいてアクセスを管理するで説明されているように、バケット ポリシーで Condition フィールドを使用します。