業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【データ基盤】
クラウドDWHを比較
BigQuery Data Transfer Service
Cloud ComposerData Catalog
VPC Service Controls
データの保守運用
AI

執筆者:Handbook編集部

Storage Transfer Serviceの概要

Google Cloud の Storage Transfer Service について

この記事では、Google Cloud の Storage Transfer Service について紹介します。

Storage Transfer Service の概要

Storage Transfer Service とは、あらゆるデータソースに対して「セキュアに」Google Cloud Storage(GCS)に転送処理を行うことができる Google Cloud のサービスです。大容量のデータであっても Google Cloud 側が対応するため、メモリなどを特に気にする必要はありません。

Storage Transfer Service は、例えば AWS の S3 のデータ転送するようなケースでは以下のような機能があります。

  • データ転送における End to End のパスは TLS で暗号化
  • S3 バケットに必要となる AWS IAM アカウントと Credential を GCP 側に保持
    • (Optional)AWS IAM 側では上記 IAM アカウントに対して必要最小限のポリシーを付与
    • (Optional)VPC Service Controls を使っている場合は、データ転送先の GCS バケットからのデータの持ち出しは定義した環境に限定可能

ハンズオン

今回は Amazon S3 から GCS への csv ファイル転送をコンソールで行なっていきます。

バケット作成

今回のハンズオンの準備として、以下のように S3 バケットと GCS バケットを作成します。

  • S3
  • GCS
    • GCS バケットを作成(このハンズオンでは「storage-transfer-destination」という名前にしています。)

アクセス権限の設定

Storage Transfer Service の S3 バケットに対するアクセス方法は以下の 2 つの方法があります。

  • AWS アクセスキーを使う
  • AWS IAM Role をを使う

AWS アクセスキーを使う場合、永続的なキーを発行しないといけないため、アクセス情報の漏洩に対してセキュアではありません。そのため、後者の IAM Role を用いて S3 へのアクセスを行います。

まずはこちらからプロジェクト ID を入力して「subjectId」を取得し、メモしておきます。

次に AWS で Role を作成します。以下のように「Trusted entity type」を「Web identity」、「Identity provider」を「Google」、「Audience」にメモしておいた「subjectId」を入力します。そして「GCPStorageTransferService」などと名付けてポリシーを以下のように編集して Role を作成します。(accounts.google.com:audaccounts.google.com:subに変更)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Principal": {
        "Federated": "accounts.google.com"
      },
      "Condition": {
        "StringEquals": {
          "accounts.google.com:sub": "メモしたsubjectId"
        }
      }
    }
  ]
}

作成した Role に以下のようなポリシーをアタッチします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetBucketLocation"],
      "Resource": "arn:aws:s3:::storage-transfer-datasource"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::storage-transfer-datasource/*"
    }
  ]
}

Transfer の作成

Transferページに移動し、Transfer を作成します。設定項目を入力し、「CREATE」をクリックします。

AWS S3 の「storage-transfer-datasource」バケットにある「product.csv」を GCS の「storage-transfer-datasource」バケットに転送することができました。

Python で Transfer を作成

上記では、コンソールで Transfer の作成を行いましたが、次に Python での Transfer の作成を紹介します。まずは以下のリンクから「Storage Transfer API」を有効化します。

次に「Storage Transfer Admin」などの Role を持ったサービスアカウントを作成し、サービスアカウントキー(JSON)を発行します。

そして以下のコマンドのようにキーのパスを指定します。

$ export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Python のライブラリをインストールします。

$ pip install --upgrade google-cloud-storage-transfer

そして以下のような Python スクリプトを記述します。(role_arnは書き換える必要あり)

# create_transfer.py

from google.cloud import storage_transfer

def create_one_time_transfer():
    """Creates a one-time transfer job."""
    client = storage_transfer.StorageTransferServiceClient()

    # The ID of the Google Cloud Platform Project that owns the job
    project_id = 'YOUR PROJECT ID'

    # Google Cloud Storage source bucket name
    source_bucket = 'storage-transfer-datasource'

    # Google Cloud Storage destination bucket name
    sink_bucket = 'storage-transfer-destination'

    transfer_job_request = storage_transfer.CreateTransferJobRequest({
        'transfer_job': {
            'project_id': project_id,
            'status': storage_transfer.TransferJob.Status.ENABLED,
            'transfer_spec': {
                'aws_s3_data_source': {
                    'bucket_name': source_bucket,
                    'role_arn': 'arn:aws:iam::123456789123:role/GCPStorageTransferService'
                },
                'gcs_data_sink': {
                    'bucket_name': sink_bucket,
                }
            }
        }
    })

    transfer_job = client.create_transfer_job(transfer_job_request)
    client.run_transfer_job({
        'job_name': transfer_job.name,
        'project_id': project_id
    })

    print(f'Created and ran transfer job: {transfer_job.name}')

if __name__ == "__main__":
    create_one_time_transfer()

最後に以下のコマンドを実行すると Transfer が作成されます。

$ python create_transfer.py

Terraform で Transfer を作成

Terraform で Transfer を作成するには以下のようなコードを実行します。

data "google_storage_transfer_project_service_account" "default" {
  project = var.project
}

data "google_storage_bucket" "storage-destination" {
  name = "storage-transfer-destination"
}

resource "google_storage_bucket_iam_member" "storage-destination" {
  bucket     = google_storage_bucket.storage-destination.name
  role       = "roles/storage.admin"
  member     = "serviceAccount:${data.google_storage_transfer_project_service_account.default.email}"
  depends_on = [google_storage_bucket.storage-destination]
}

resource "google_storage_transfer_job" "s3-bucket-transfer" {
  project = var.project

  transfer_spec {
    aws_s3_data_source {
      bucket_name = "storage-transfer-datasource"
      role_arn    = "arn:aws:iam::123456789123:role/GCPStorageTransferService"
    }
    gcs_data_sink {
      bucket_name = google_storage_bucket.storage-destination.name
    }
  }

  schedule {
    schedule_start_date {
      year  = 2022
      month = 8
      day   = 1
    }
    schedule_end_date {
      year  = 2022
      month = 8
      day   = 5
    }
    start_time_of_day {
      hours   = 23
      minutes = 30
      seconds = 0
      nanos   = 0
    }
    repeat_interval = "604800s"
  }

  depends_on = [google_storage_bucket_iam_member.storage-destination]
}

参考

2025年07月06日に最終更新
読み込み中...