AWS DataSyncでGoogleCloudStorageからS3にデータ転送してみた

AWS DataSyncでGoogleCloudStorageからS3にデータ転送してみた

Clock Icon2025.05.31

お疲れさまです。とーちです。

AWS DataSyncでDataSync エージェントをデプロイすることなく、他のクラウドのストレージとAmazon S3間でデータを直接転送できるようになったというアップデートがありました。これはクラウド間でのデータ転送をしたい方にとってはかなり良いアップデートではないでしょうか。

https://aws.amazon.com/about-aws/whats-new/2025/05/aws-datasync-accelerates-cross-cloud-data-transfers/

以下の記事ではAmazon S3 と Azure Blob Storage間でデータ転送を行っているのですが、私はGoogle Cloud StorageとS3間で試してみました。

https://dev.classmethod.jp/articles/datasync-accelerates-cross-cloud-data-transfers/

今回のアップデートのポイント

今までは、例えばGoogle Cloud StorageとS3の間などクラウドストレージ間でデータを転送する際に、DataSync エージェントを使用する必要がありました。

DataSync エージェントの用意は正直なところ結構面倒で、まずDataSync用のAMIを使い、Amazon EC2 インスタンスを立てる必要がありました。

しかもインスタンスタイプは2xlarge以上と結構大きめなインスタンスを用意し維持する必要があります。

可用性のことを考えるとEC2の冗長化も考えなければならないので、なおさら大変だったと思います。

これらの手間が今回のアップデートによりなくなります。とても良いですね。

なお、どういったケースでDataSyncエージェントが不要となるかについては以下のURLに記載があるのでこちらもご確認ください。

https://docs.aws.amazon.com/datasync/latest/userguide/do-i-need-datasync-agent.html#when-agent-not-required

やってみた

Google Cloudは今まではほとんど使ってこなかったので、キャッチアップも兼ねてGoogle Cloud Storageの作成から行ってみます。

Google Cloud Storageバケットの作成

とりあえずCloud Storageの画面に行き、作成ボタンを押してバケットを作成しました。

alt text

作成したバケットの設定はこんな感じです。

alt text

HMACキーの作成

DataSync は、Google サービス アカウントに関連付けられた HMAC キーを使用して、データの転送元となるバケットの認証と読み取りを行うとのことです。

HMACキーについて簡単に調べてみたところ以下のような特徴を持つようです。

  • HMAC キーは Google Cloud Storage XML API へのアクセスを認証するための、アクセス ID とシークレットからなる認証情報
  • Google Cloud Storage XML APIはGoogle Cloud Storage に対するリクエストを行うための APIで、Amazon S3 互換のインターフェースを提供

Google Cloud StorageではJSON APIが一般的には使われるようですが、XML APIはAmazon S3 互換のインターフェースをもつので、DataSyncではこちらを使うようです。

それではHMACキーを作成してみます。Cloud Storageの画面から作成していきます。

alt text

サービスアカウントをまだ作成していなかったので「新しいアカウントを作成」を選択します。

alt text

サービスアカウントの作成と権限設定

なお、Google Cloud におけるアカウントはユーザーアカウントとサービスアカウントの2種類があるようです。ユーザーアカウントは主に人間が使うものでCloud Console にログインしたりするのに使ったりします。

サービスアカウントは人間ではなく、プログラム、アプリケーション等がGoogle Cloudの各リソースにアクセスするのに使うためのものです。

というわけでサービスアカウントを作成します。

alt text

権限を付け忘れていたので権限をつけます。こちらに記載がある通り、サービス アカウントに少なくともStorage Object Viewer権限が必要です。

作成したサービスアカウントを選択し、権限 ⇒ アクセスを管理する を選択します。

alt text

ロール割当て画面で、ロールの枠をクリックすると以下のようにロールを選択できます。ここで「Storageオブジェクト閲覧者」を選択しましょう。

alt text

そのまま保存を押して保存します。

alt text

HMACキーの生成

Cloud Storageの画面に戻り、再度「サービスアカウント用にキーを作成」ボタンを押します。先ほど作成したサービスアカウントが表示されるので「鍵を作成」を選択しました。

alt text

すると以下のような画面が表示され、HMACキーを入手できます。画面を閉じると二度と参照できないので注意です。

alt text

テストファイルのアップロード

最後にCloud StorageにS3に転送するファイルを置いておきます。CLIでサクッと置きたいと思ったので、gcloudコマンドをインストールしました。

macであれば、brew install --cask google-cloud-sdk でインストール出来ます。

PATHも自動で設定されていました。

> which gcloud
/opt/homebrew/bin/gcloud

アカウントとの連携(AWS CLIで言うところの aws configure)はgcloud auth loginコマンドで簡単に実行できました。Your current project is [None] と言われたのでプロジェクトIDも指定しておきます。

> gcloud auth login
Your browser has been opened to visit:

<中略>

Your current project is [None].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID
> gcloud config set project <PROJECT_IDを入力>
Updated property [core/project].

続いて適当なファイルをCloud Storageにコピーしておきます。

# ブログ検証用に使った適当なファイル群
> ls -l
total 32
-rw-r--r--@ 1 kikuchi.toshinori  staff  183 May 30 17:06 app.py
drwxr-xr-x@ 4 kikuchi.toshinori  staff  128 May 30 17:28 cloudformation-templates/
-rw-r--r--@ 1 kikuchi.toshinori  staff  177 May 30 17:24 docker-compose.yml
-rw-r--r--@ 1 kikuchi.toshinori  staff  504 May 30 17:21 Dockerfile
-rw-r--r--@ 1 kikuchi.toshinori  staff   30 May 30 17:23 requirements.txt
# 上記のファイルをコピー
> gcloud storage cp -r ./* gs://YOUR_BUCKET_NAME
# ファイルが格納されたことを確認
> gcloud storage ls gs://YOUR_BUCKET_NAME
gs://YOUR_BUCKET_NAME/Dockerfile
gs://YOUR_BUCKET_NAME/app.py
gs://YOUR_BUCKET_NAME/docker-compose.yml
gs://YOUR_BUCKET_NAME/requirements.txt
gs://YOUR_BUCKET_NAME/cloudformation-templates/

AWS DataSyncの設定

ここまでできたら次はAWS DataSync側の設定になります。

Google Cloud Storageロケーションの作成

まずGoogle Cloud Storage バケットを DataSync ソースとして使うためにロケーション登録します。

alt text

ドキュメントに従い、以下のような設定で作成しました。アクセスキーとシークレットキーにはHMAC キーのアクセスキーとシークレットを入力してください。シークレットキーに関してはSecrets Managerから参照させることもできるようなので、実際に構築するときはこちらを使ったほうが良いですね。

alt text

S3ロケーションの作成

続いて転送先S3バケットもロケーションとして登録します。まず datasync-destination-3oiad0f023 という名前のS3バケットをデフォルト設定のまま作成し、その後、以下の設定でロケーション登録しました。IAMロールは自動生成というボタンがあったのでそれを押して、自動生成されたものを使ってます。

alt text

データ転送タスクの作成

ロケーションが登録できたので、ロケーション間でデータを転送するタスクを作成します。

alt text

まず送信元ロケーションとしてGoogle Cloud Storageを指定します。

alt text

送信先ロケーションとしてS3を指定します。

alt text

次の画面でタスクモードを選びますが、これは拡張で固定となっていました。従来は、他のクラウド間の転送をする場合、基本を選ぶ必要がありましたが、今回のアップデートで拡張モードが使えるようになったということですね。

alt text

転送オプションはほぼデフォルトのままで作りましたが、一点だけ、「オブジェクトのタグをコピー」は外さないとタスク作成でエラーとなったので外しています。こちらにも記載がありますが、Google Cloud Storage XML API はオブジェクト タグの読み取りや書き込みをサポートしていない ので外す必要があるとのこと。

alt text

Google Cloud StorageからS3への転送実行

それではこの状態でタスクを開始してみます。タスクの画面から以下のように開始⇒デフォルトから開始するを選択すると転送が開始されます。

alt text

少し待つとタスクが正常終了したことが確認できました。

alt text

S3バケットを見るとちゃんと意図したファイルが転送されていました。

alt text

S3からGoogle Cloud Storageへの転送も試してみる

S3からCloud Storageへの転送もできるか気になったのでやってみます。

サービスアカウント権限の変更

Cloud Storageへの書き込みを行う必要があるので、まずサービスアカウントの権限を以下のように変更しました。

alt text

Cloud Storageのファイル削除

続いて、一旦Cloud Storage上のファイルを削除します。実はこの操作を行うときに誤ってバケットを一度消してます。私はgcloudコマンドに慣れていないので、 gcloud storage rm -r gs://YOUR_BUCKET_NAMEと入力してしまい、バケットごと消してしまいました。そのためバケットを一度作り直してます。

> gcloud storage rm -r 'gs://YOUR_BUCKET_NAME/*'
Removing objects:
⠹Removing gs://YOUR_BUCKET_NAME/Dockerfile#1748643245319890...                                                                  
Removing gs://YOUR_BUCKET_NAME/cloudformation-templates/ecs-web-app-ecs-infrastructure.json#1748643245331062...
Removing gs://YOUR_BUCKET_NAME/docker-compose.yml#1748643245398701...
Removing gs://YOUR_BUCKET_NAME/app.py#1748643245338697...
Removing gs://YOUR_BUCKET_NAME/cloudformation-templates/ecs-web-app-ecr-infrastructure.json#1748643245372863...
Removing gs://YOUR_BUCKET_NAME/requirements.txt#1748643245358491...
  Completed 6/6                                                                                                                            
> gcloud storage ls gs://YOUR_BUCKET_NAME
> 

S3からCloud Storageへの転送タスク作成

ファイルがなくなったことを確認できたので、AWS DataSync上でS3からCloud Storageへの転送するタスクを作成します。ロケーションは先程作成したものを使いまわしました。

送信元ロケーションとしてS3を指定します。

alt text

送信先ロケーションとしてGoogle Cloud Storageを指定します。

alt text

転送オプションは先程と同じくオブジェクトのタグをコピーは外しました。

alt text

S3からCloud Storageへの転送実行

これでタスクを実行してみます。しばらくすると正常終了しました。

alt text

> gcloud storage ls -r gs://YOUR_BUCKET_NAME
gs://YOUR_BUCKET_NAME/:
gs://YOUR_BUCKET_NAME/Dockerfile
gs://YOUR_BUCKET_NAME/app.py
gs://YOUR_BUCKET_NAME/docker-compose.yml
gs://YOUR_BUCKET_NAME/requirements.txt

gs://YOUR_BUCKET_NAME/cloudformation-templates/:
gs://YOUR_BUCKET_NAME/cloudformation-templates/ecs-web-app-ecr-infrastructure.json
gs://YOUR_BUCKET_NAME/cloudformation-templates/ecs-web-app-ecs-infrastructure.json

バケットを確認するとちゃんとファイルが転送されていることを確認できました。

まとめ

というわけで、AWS DataSyncでクラウド間のデータ転送が簡単にできるようになったというアップデートでした。

以前と比べるととても簡単になりましたね。DataSyncエージェントの構築・運用が不要になったことで、クラウド間でのデータのやりとりがある場合には積極的に活用したいなと思えるアップデートでした。

以上、とーちでした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.