AWS DataSync を使った S3 間のクロスアカウント&クロスリージョンデータ転送をしてみた
いわさです。
AWS でストレージサービス間のデータ転送を実現する方法は色々とあります。
私は AWS DataSync のエージェントレスタスクがスクリプトやコーディング不要で実装できるので好きで、よく使います。
今回 Amazon S3 間の転送を行う際に、クロスアカウントかつクロスリージョンでの転送を行うことがありました。いくつか注意ポイントがあったのでまとめておきます。
今回は次のようにデータ送信先バケットがある AWS アカウント上で DataSync タスクを実行します。
アカウントAでは事前にバージニア北部リージョンに S3 バケットを作成しておきます。
クロスアカウントの場合は暗号化設定もポイントになりそうですが、今回は SSE-S3 を使います。
そして複数のフォルダを作成し、その中の一つのフォルダの中のファイルたちをデータ転送の対象にしたいと思います。
また、アカウントBでは東京リージョンに S3 バケットを作成しておきます。
こちらもフォルダを用意し、特定のフォルダから特定のフォルダにファイルを移動できるか確認してみます。
DataSync ロケーションの作成
AWS DataSync はデータ送信元とデータ送信先のロケーションを構成し、タスクでそのロケーションを参照します。
今回はアカウントB上で DataSync タスクを実行させようとしているので、アカウントB上にまずはデータ送信元とデータ送信先のロケーションを作成しましょう。
ロケーションの作成時に IAM ロールを指定し、DataSync タスクはそれぞれのロケーションに対してこの IAM ロールを使ってアクセスを行います。
ということで、アカウントB上で IAM ロールを作成し、アカウントAのバケットポリシーでこの IAM ロールからのアクセスを許可するように設定しましょう。
許可しているアクションが広くて雑でスマンという感じですが、こんな感じで設定しました。
注意点1:別アカウントのロケーション作成方法
IAM ロールが準備できたのでロケーションを作成してみましょう。
S3 URI はアカウントAの送信元バケットを、IAM ロールには先ほど作成した IAM ロールを指定します。
しかし、作成しようとすると「アクセスが拒否されました。所有しているバケットを選択してください」というエラーが発生しました。これは...
公式ドキュメントに記載がありまして、クロスアカウントロケーションはコンソール上からは作成できないみたいです。[1]
Since you can't create cross-account locations by using the DataSync console interface
ただし、AWS CLI などの API 経由であればクロスアカウントロケーションを作成することが出来ます。
今回は AWS CLI で作成しました。
% cat hoge.json
{
"Subdirectory": "folder2",
"S3BucketArn": "arn:aws:s3:::hoge0826bucket1",
"S3StorageClass": "STANDARD",
"S3Config": {
"BucketAccessRoleArn": "arn:aws:iam::123456789012:role/hoge0826datasyncrole"
}
}
% aws datasync create-location-s3 --cli-input-json file://hoge.json --region us-east-1
{
"LocationArn": "arn:aws:datasync:us-east-1:123456789012:location/loc-017571578c95cfac3"
}
ロケーションを作成するリージョンはデータソースが存在するリージョンに合わせる必要があります。
タスクは異なるリージョンのロケーションを組み合わせることができるのでそこで吸収する感じですね。
作成後、アカウントBのバージニア北部リージョンを確認してみるとロケーションが作成されており、別アカウントのS3バケットが参照されていました。良さそうです。
アカウントBのバケットについては同じアカウント内なので普通にコンソールからロケーションを作成できます。
注意点2:タスクを作成するリージョン
ロケーションの準備が出来たのでタスクを作成しましょう。
アカウントBの東京リージョンで次のようにタスクを作成しようとしました。
送信元ロケーションでバージニア北部リージョンを選択し、先程 AWS CLI で作成したクロスアカウントロケーションを選択します。なるほど、こういう感じでクロスリージョンを構成できるんですね。
送信先は普通にロケーションを選択しますが、こちらはリージョンの選択が出来ませんでした(東京リージョン固定)
どうやら送信元でリージョン指定したので送信先ではタスクと同じリージョンになるようです。
他にも色々なオプションがありますがここでは割愛します。
作成されたタスクを開始してみると、「Unable to connect to S3 endpoint」というエラーが発生しました。
どうやら S3 エンドポイントに接続できていないようです。
色々試してみたのですが、どうやらクロスアカウントロケーションを使ったタスクを作成する場合は、データ転送元リージョンとタスクを作成するリージョンを合わせる必要があるみたいです。
なので、今回だと DataSync タスク自体は次のようにバージニア北部リージョンで作成する必要があります。
同じ内容でリージョンだけ変えて作成しなおしたところ次のように正常にタスクが完了しました。
ファイルもうまく転送されていましたね。
さいごに
本日は AWS DataSync を使った S3 間のクロスアカウント&クロスリージョンデータ転送をしてみました。
クロスアカウント&クロスリージョンでもデータ転送出来ましたね。
気をつける点としてはクロスアカウントの場合マネジメントコンソールからロケーションを作成出来ないのと、タスク作成リージョンに気をつける必要があります。