AWS DataSyncでGoogleCloudStorageからS3にデータ転送してみた
お疲れさまです。とーちです。
AWS DataSyncでDataSync エージェントをデプロイすることなく、他のクラウドのストレージとAmazon S3間でデータを直接転送できるようになったというアップデートがありました。これはクラウド間でのデータ転送をしたい方にとってはかなり良いアップデートではないでしょうか。
以下の記事ではAmazon S3 と Azure Blob Storage間でデータ転送を行っているのですが、私はGoogle Cloud StorageとS3間で試してみました。
今回のアップデートのポイント
今までは、例えばGoogle Cloud StorageとS3の間などクラウドストレージ間でデータを転送する際に、DataSync エージェントを使用する必要がありました。
DataSync エージェントの用意は正直なところ結構面倒で、まずDataSync用のAMIを使い、Amazon EC2 インスタンスを立てる必要がありました。
しかもインスタンスタイプは2xlarge以上と結構大きめなインスタンスを用意し維持する必要があります。
可用性のことを考えるとEC2の冗長化も考えなければならないので、なおさら大変だったと思います。
これらの手間が今回のアップデートによりなくなります。とても良いですね。
なお、どういったケースでDataSyncエージェントが不要となるかについては以下のURLに記載があるのでこちらもご確認ください。
やってみた
Google Cloudは今まではほとんど使ってこなかったので、キャッチアップも兼ねてGoogle Cloud Storageの作成から行ってみます。
Google Cloud Storageバケットの作成
とりあえずCloud Storageの画面に行き、作成ボタンを押してバケットを作成しました。
作成したバケットの設定はこんな感じです。
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の画面から作成していきます。
サービスアカウントをまだ作成していなかったので「新しいアカウントを作成」を選択します。
サービスアカウントの作成と権限設定
なお、Google Cloud におけるアカウントはユーザーアカウントとサービスアカウントの2種類があるようです。ユーザーアカウントは主に人間が使うものでCloud Console にログインしたりするのに使ったりします。
サービスアカウントは人間ではなく、プログラム、アプリケーション等がGoogle Cloudの各リソースにアクセスするのに使うためのものです。
というわけでサービスアカウントを作成します。
権限を付け忘れていたので権限をつけます。こちらに記載がある通り、サービス アカウントに少なくともStorage Object Viewer
権限が必要です。
作成したサービスアカウントを選択し、権限 ⇒ アクセスを管理する を選択します。
ロール割当て画面で、ロールの枠をクリックすると以下のようにロールを選択できます。ここで「Storageオブジェクト閲覧者」を選択しましょう。
そのまま保存を押して保存します。
HMACキーの生成
Cloud Storageの画面に戻り、再度「サービスアカウント用にキーを作成」ボタンを押します。先ほど作成したサービスアカウントが表示されるので「鍵を作成」を選択しました。
すると以下のような画面が表示され、HMACキーを入手できます。画面を閉じると二度と参照できないので注意です。
テストファイルのアップロード
最後に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 ソースとして使うためにロケーション登録します。
ドキュメントに従い、以下のような設定で作成しました。アクセスキーとシークレットキーにはHMAC キーのアクセスキーとシークレットを入力してください。シークレットキーに関してはSecrets Managerから参照させることもできるようなので、実際に構築するときはこちらを使ったほうが良いですね。
S3ロケーションの作成
続いて転送先S3バケットもロケーションとして登録します。まず datasync-destination-3oiad0f023
という名前のS3バケットをデフォルト設定のまま作成し、その後、以下の設定でロケーション登録しました。IAMロールは自動生成というボタンがあったのでそれを押して、自動生成されたものを使ってます。
データ転送タスクの作成
ロケーションが登録できたので、ロケーション間でデータを転送するタスクを作成します。
まず送信元ロケーションとしてGoogle Cloud Storageを指定します。
送信先ロケーションとしてS3を指定します。
次の画面でタスクモードを選びますが、これは拡張で固定となっていました。従来は、他のクラウド間の転送をする場合、基本を選ぶ必要がありましたが、今回のアップデートで拡張モードが使えるようになったということですね。
転送オプションはほぼデフォルトのままで作りましたが、一点だけ、「オブジェクトのタグをコピー」は外さないとタスク作成でエラーとなったので外しています。こちらにも記載がありますが、Google Cloud Storage XML API はオブジェクト タグの読み取りや書き込みをサポートしていない
ので外す必要があるとのこと。
Google Cloud StorageからS3への転送実行
それではこの状態でタスクを開始してみます。タスクの画面から以下のように開始⇒デフォルトから開始するを選択すると転送が開始されます。
少し待つとタスクが正常終了したことが確認できました。
S3バケットを見るとちゃんと意図したファイルが転送されていました。
S3からGoogle Cloud Storageへの転送も試してみる
S3からCloud Storageへの転送もできるか気になったのでやってみます。
サービスアカウント権限の変更
Cloud Storageへの書き込みを行う必要があるので、まずサービスアカウントの権限を以下のように変更しました。
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を指定します。
送信先ロケーションとしてGoogle Cloud Storageを指定します。
転送オプションは先程と同じくオブジェクトのタグをコピーは外しました。
S3からCloud Storageへの転送実行
これでタスクを実行してみます。しばらくすると正常終了しました。
> 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エージェントの構築・運用が不要になったことで、クラウド間でのデータのやりとりがある場合には積極的に活用したいなと思えるアップデートでした。
以上、とーちでした。