0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VPC Service Controls 有効環境における AWS DataSync を利用した Google Cloud Storage から Amazon S3 へのデータ転送について

0
Last updated at Posted at 2026-09-17

はじめに

こんにちは、博報堂テクノロジーズの山田です。

Google Cloud Storage のバケットから、 Amazon S3 のバケットに多くのオブジェクトデータを転送したいケースはあるかと思います。

この記事では、VPC Service Controls が有効な環境で、AWS DataSync を利用してオブジェクトデータの連携をしたい場合という観点で、手順について紹介したいと思います。
内容としては一般的なものですが、VPC Service Controls を有効とした環境での手順のドキュメントなど見当たらなかったので、もし同様の作業を行いたい方はご参考としていただければ幸いです。

AWS DataSync とは

AWS DataSync は安全で信頼性の高い高速ファイル転送サービスです。
AWS DataSync を利用することで、Amazon S3 や Amazon EFS などの AWS ストレージサービスとの間でファイルやオブジェクトデータを簡単に転送することができます。
ある S3 バケットから別の S3 バケットへの転送のように、AWS ストレージサービス間の転送の他に、オンプレミスのストレージシステムと AWS ストレージサービス間の転送や、他のクラウドプロバイダーのストレージサービスと AWS ストレージサービス間のデータ転送を実施することも可能です。

Cloud Storage のバケットから S3 バケットへのオブジェクトの転送は、上記の他のクラウドプロバイダーのストレージサービス(Google Cloud Storage)と AWS ストレージサービス間でのオブジェクトデータの転送にあたるため、AWS DataSync を利用して実施することが可能となります。

VPC Service Controls とは

VPC Service Controls は Google Cloud の機能です。
VPC Service Controls を使用することで、明示的に指定したサービスのリソースとデータを保護する境界(サービス境界)を作成することが可能です。

サービス境界を設定すると、境界内では自由に通信が可能ですが、境界を越える Google Cloud サービスとの通信はデフォルトでブロックされます[1]。
例えば、サービス境界を構成する VPC ネットワーク内のクライアントから Cloud Storage バケットのデータの参照は可能ですが、境界外の VPC ネットワークなどのクライアントから境界内の Cloud Storage バケットへのアクセスは許可されません。

今回紹介する構成では、AWS DataSync が Google サービスアカウントに関連付けられた HMAC キーを使用してデータ転送元のバケットを認証し読み取ります[2]。
この場合、サービス境界の外からの Cloud Storage バケットへのアクセスになるため、AWS DataSync 側から Cloud Storage バケットにアクセスすることができません。
境界外にある AWS DataSync から境界内の Cloud Storage バケットにアクセスできるようにするには、上り(内向き)ポリシーを指定する必要があります。

設定手順

実際の設定手順を記載します。設定するリソース構成の概要は下記です。
AWS DataSync ではエージェントが必要になる場合がありますが、拡張モードを使用して Google Cloud Storage と Amazon S3 間で転送する場合は、エージェントは不要です。
DataSync.png

設定手順は事前に送信元の Cloud Storage バケットと送信先の Amazon S3 バケットが作成済みの想定で記載しています。
まだ、バケットや転送用のオブジェクトが作成されていない場合は、ドキュメント等を参考にご作成ください[3][4][5]。

1. Google Cloud Storage バケット参照用のサービスアカウントと HMAC キーの作成

AWS DataSync は HMAC キーを利用してCloud Storage XML API に接続することで、Cloud Storage データを参照することが可能になります。
そのため、Cloud Storage データを参照するための HMAC キーが必要になります。

HMAC キーはサービスアカウントに関連付けることが推奨されています。
HMAC キーを発行する前にサービスアカウントを作成してください。

gcloud iam service-accounts create < サービス アカウントの名前 > \
  --description="< 説明 >" \
  --display-name="< Google Cloud コンソールに表示するサービス アカウント名 >"

作成したサービスアカウントには Storage Object Viewerロールを付与してください。
こちらのドキュメントを参考にコマンドを実行することで、バケットレベルでの IAM ポリシーを設定することが可能です。

gcloud storage buckets add-iam-policy-binding gs://<バケット名> --member=serviceAccount:< サービスアカウントの Email アドレス > --role=roles/storage.objectViewer

HMAC キーは下記のコマンドで作成することが可能です。
レスポンスに accessId と secret の値が含まれます。こちらの情報を後続の作業で利用します。

gcloud storage hmac create < サービスアカウントの Email アドレス >

2. HMAC キーの Secrets Manager への登録

作成した HMAC キーはアクセス ID とシークレットの 2 つで構成されます。
シークレットを使用して、認証プロセスの一環として署名を作成し、Cloud Storage XML API に対するリクエストに含めることになります。
HMAC キー シークレットはアクセス認証情報と同様に扱う必要がある機密性の高い情報です。

HMAC キー シークレットは AWS DataSync 側の設定をする際に直接入力することも可能ですが、リソース構成図に記載したように、Secrets Manager に登録して参照する構成にします。
下記のようなコマンドで、Secrets Manager に HMAC キー シークレットを登録することが可能です。

aws secretsmanager create-secret \
    --name < Secret 名 > \
    --description "< 説明 >" \
    --secret-string 'HMAC キー シークレット'

3. VPC Service Controls の設定

すでに記載したように、AWS DataSync からデータ転送元の Cloud Storage バケットへのアクセスは VPC Service Controls のサービス境界外からのアクセスになります。
そのため、VPC Service Controls が有効になっている環境では、デフォルトの設定では DataSync で Cloud Storage から S3 にデータを転送しようとすると失敗します。

一例ではありますが、下記のような設定で VPC Service Controls の内向きポリシーを設定することで、AWS DataSync から HMAC キーを利用してサービス境界内の Cloud Storage バケットを参照することが可能になることを確認しています。

- ingressFrom:
    identities:
      - serviceAccount:<サービスアカウントの名前>@<project>.iam.gserviceaccount.com
    sources:
      - accessLevel: "*"
  ingressTo:
    operations:
      - serviceName: storage.googleapis.com
        methodSelectors:
          - method: "*"
    resources:
      - projects/<転送バケットのプロジェクト番号> 
  title: allow-datasync-gcs-read

なお、実際の環境で確認した限り、サービスアカウントに関連付けた HMAC キーを利用したアクセスの場合、identityType: ANY_SERVICE_ACCOUNT の内向きポリシーの設定ではアクセスは許可されませんでした。
内向きポリシーの設定をする際は、ドライラン モードでご自身の環境への影響を確認したうえで適用することをご検討ください。

4. Google Cloud Storage バケット用の DataSync ソースロケーションの作成

DataSync を利用してストレージデータを転送する際は、転送元と転送先のロケーションを作成した後に、タスクを作成して、ロケーション間でデータをコピーする方法の詳細を指定します。

Google Cloud Storage のロケーション(送信元)を作成していきたいと思いますが、その前に、手順 2 で Secrets Manager に登録した HMAC キー シークレットを DataSync で利用できるようにするための IAM ロールを作成します。

設定する信頼ポリシーは下記です。

trust-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "datasync.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                "aws:SourceAccount": "< AWS アカウント >"
                },
                "ArnLike": {
                "aws:SourceArn": "arn:aws:datasync:< リージョン >:< AWS アカウント >:*"
                }
            }
        }
    ]
}

IAM ロールの作成コマンドは下記です。

aws iam create-role \
    --role-name < IAM ロール名 > \
    --assume-role-policy-document file://trust-policy.json

DataSync が Secrets Manager に登録した HMAC キー シークレットを利用できるようにするための IAM ポリシーを作成し、上記で作成したロールにアタッチします。
ドキュメントを参考に、下記のポリシーを設定します。

policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret"
            ],
            "Resource": "< HMAC キー シークレットを登録したシークレットの ARN >"
        }
    ]
}

IAM ポリシーを作成し、事前に作成しておいた IAM ロールにアタッチします。

aws iam create-policy \
    --policy-name < ポリシー名 > \
    --policy-document file://policy.json

aws iam attach-role-policy \
    --policy-arn < 作成したポリシーの ARN > \
    --role-name < ポリシーをアタッチするロール名 >

次に作成した IAM ロールを指定して Google Cloud Storage のロケーション(送信元)を作成します。

aws datasync create-location-object-storage \
    --server-hostname storage.googleapis.com \
    --bucket-name < Cloud Storage バケット名 > \
    --subdirectory < フォルダ名 > \
    --server-protocol HTTPS \
    --server-port 443 \
    --access-key < HMAC キー アクセスキー > \
    --custom-secret-config '{"SecretArn": "< 2 で作成した Secrets の ARN >","SecretAccessRoleArn": "< 上記の手順で作成した DataSync が HMAC キー シークレットを利用するための IAM ロールの ARN >"}'

5. Amazon S3 バケット用の DataSync 送信先のロケーションの作成

AWS DataSync は、送信先バケットにデータを移行するために、Amazon S3 バケットにアクセスする必要があります。
まずは DataSync が引き受ける、Amazon S3 バケットにアクセスするための IAM ロールを作成します。

設定する信頼ポリシーは下記です。

trust-policy.json
{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "datasync.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                "aws:SourceAccount": "< AWS アカウント >"
                },
                "ArnLike": {
                "aws:SourceArn": "arn:aws:datasync:< リージョン >:< AWS アカウント >:*"
                }
            }
        }
    ]
}

IAM ロールの作成コマンドは下記です。

aws iam create-role \
    --role-name < IAM ロール名 > \
    --assume-role-policy-document file://trust-policy.json

DataSync に Amazon S3 バケットへの読み取りおよび書き込みを許可するための、IAM ポリシーをロールにアタッチします。
ドキュメントを参考に下記の IAM ポリシーを作成します。

policy.json
{
 "Version": "2012-10-17",
 "Statement": [
     {
         "Action": [
             "s3:GetBucketLocation",
             "s3:ListBucket",
             "s3:ListBucketMultipartUploads"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:s3:::< 送信先バケット名 >",
         "Condition": {
             "StringEquals": {
                 "aws:ResourceAccount": "< AWS アカウント >"
             }
         }
     },
     {
         "Action": [
             "s3:AbortMultipartUpload",
             "s3:DeleteObject",
             "s3:GetObject",
             "s3:GetObjectTagging",
             "s3:GetObjectVersion",
             "s3:GetObjectVersionTagging",
             "s3:ListMultipartUploadParts",
             "s3:PutObject",
             "s3:PutObjectTagging"
           ],
         "Effect": "Allow",
         "Resource": "arn:aws:s3:::< 送信先バケット名 >/*",
         "Condition": {
             "StringEquals": {
                 "aws:ResourceAccount": "< AWS アカウント >"
             }
         }
     }
 ]
}

下記のコマンドで IAM ポリシーの作成とロールへのアタッチを実行します。

aws iam create-policy \
    --policy-name < ポリシー名 > \
    --policy-document file://policy.json

aws iam attach-role-policy \
    --policy-arn < 作成したポリシーの ARN > \
    --role-name < ポリシーをアタッチするロール名 >

次に Amazon S3 のロケーション(送信先)を作成します。

aws datasync create-location-s3 \
    --s3-bucket-arn '< 転送先の S3 バケットの ARN >' \
    --s3-storage-class '< S3 のストレージクラス >' \
    --s3-config 'BucketAccessRoleArn=< 上記の手順で作成した IAM ロールの ARN >' \
    --subdirectory /< プレフィックス >

6. データ同期タスクを作成して開始する

ロケーションを作成したら、それぞれのロケーションを指定して、タスクを作成します。
なお、Cloud Storage XML API はオブジェクトタグの読み取りや書き込みをサポートしていないため、オブジェクトタグをコピーしようとすると、DataSync タスクが失敗する可能性があります[6]。
オブジェクトのタグはコピーしない設定(ObjectTags=NONE)にします。

aws datasync create-task \
    --source-location-arn < ソースロケーションの ARN > \
    --destination-location-arn < 送信先のロケーションの ARN > \
    --name < タスク名 > \
    --task-mode ENHANCED \
    --options \
    TransferMode=CHANGED,VerifyMode=ONLY_FILES_TRANSFERRED,ObjectTags=NONE

タスクの作成が完了したら、実行します。

aws datasync start-task-execution \
    --task-arn '< 作成したタスクの ARN >'

Cloud Storage バケットのオブジェクトが S3 側に送信されていることが確認できるかと思います。

まとめ

VPC Service Controls が有効な環境における DataSync を利用した Cloud Storage から Amazon S3 へのデータ転送について紹介しました。
もし、同様の環境で Cloud Storage から Amazon S3 へのデータ転送を検討している方がいれば、参考にしていただけると幸いです。

参考資料

[1] VPC Service Controls の概要 - サービス境界で Google Cloud リソースを分離する
https://docs.cloud.google.com/vpc-service-controls/docs/overview?hl=ja#isolate

[2] Google Cloud Storage を使用した AWS DataSync 転送の設定 - Google クラウドストレージバケット用の HMAC キーを作成します。
https://docs.aws.amazon.com/ja_jp/datasync/latest/userguide/tutorial_transfer-google-cloud-storage.html#transfer-google-cloud-storage-create-hmac-key

[3] バケットの作成
https://docs.cloud.google.com/storage/docs/creating-buckets?hl=ja

[4] 汎用バケットの作成
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/create-bucket-overview.html

[5] オブジェクトのアップロード
https://docs.cloud.google.com/storage/docs/uploads?hl=ja

[6] Google Cloud Storage を使用した AWS DataSync 転送の設定
https://docs.aws.amazon.com/ja_jp/datasync/latest/userguide/tutorial_transfer-google-cloud-storage.html#transfer-google-cloud-storage-start-task

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?