AWS Data Replication Hub を使ってみました

# AWS Data Replication Hub とは
AWS中国が提供しているデータ転送のためのツールです。

https://www.amazonaws.cn/en/solutions/data-replication-hub/

https://github.com/awslabs/aws-data-replication-hub

このツールは以下のシーンでの利用を想定しています。

- AWS中国リージョン～(中国以外の)AWSグローバルリージョン間のS3のデータ転送
- AWS以外のクラウドサービスのオブジェクトストレージ[^storage]からS3へのデータ転送
[^storage]: Alibaba Cloud OSS, Tencent COS, Qiniu Kodo
- AWS中国リージョン～(中国以外の)AWSグローバルリージョン間のECRイメージの転送
- AWS以外のクラウドサービスのパブリックコンテナレジストリからAmazon ECRへのコンテナイメージの転送

中国以外からAWS中国リージョンへデータ転送するときには、ケースによってはインターネットを利用することがあるかと思います。中国～海外間のインターネット通信は、様々な理由により、通信品質が良くなくデータ転送に非常に時間を要することがあります。
本ツールを使用することで、例えば、対象データをAWS東京のS3へ配置するだけで、自動でAWS中国へセキュア且つ、効率良く[^multipart]転送します。
[^multipart]: マルチパートアップロードを使用

本ツールは、サーバレス構成でありCloudFormationやCDKで構築できるようになっています。
データ転送元・先のAWSアカウントは、同じ・異なる　の両方に対応しています。

# 構成
本ツールは、専用のWebポータルを用意しています。構成図は以下となります。
※[aws-data-replication-hub](https://github.com/awslabs/aws-data-replication-hub)より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/4c2117f3-8b4e-1b5c-fcc5-45a055de9a26.png)
専用のWebポータルを通じて転送設定を行います。

S3データ転送とコンテナイメージ転送は、それぞれプラグインとして用意されています。構成図は以下となります。

- S3 Plugin
※[amazon-s3-data-replication-hub-plugin](https://github.com/awslabs/amazon-s3-data-replication-hub-plugin)より<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/7ce6b503-6e33-3a21-b607-7c4d2eb20e63.png)
「Source Bucket」へデータを配置すると、「Amazon S3(Destination)」へ転送されます。

- S3 Plugin
※[amazon-ecr-data-replication-hub-plugin](https://github.com/awslabs/amazon-ecr-data-replication-hub-plugin)より<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/076c09dc-1847-61d7-7c3e-4486d75279c8.png)

# 前提
- 今回は、S3のデータ転送を行ってみました。
- 諸々の事情でAWS中国アカウントが利用できないため、グローバルのAWSアカウントを使用します。
- Aアカウントの「バージニアリージョン」からBアカウントの「東京リージョン」へのデータ転送とします。

# 構築
[aws-data-replication-hub](https://github.com/awslabs/aws-data-replication-hub)の「Deploy via CloudFormation」に従って構築します。

AWS中国リージョンへ構築する場合は、以降の手順の前に、中国ルールに従った手順が追加で必要となります。<br>詳しくは[こちら](https://github.com/awslabs/aws-data-replication-hub/blob/master/docs/DeployInChinaWithAuthing_CN.md)参照。

#### Webポータルの構築
データ転送先のBアカウントを使用してマネージメントコンソールへサインインします。

サインイン後、[aws-data-replication-hub](https://github.com/awslabs/aws-data-replication-hub)の「Deploy via CloudFormation」の「Launch Stack」をクリックします。

[スタックの作成]が表示するため、以下の手順で進めます。

- ステップ 1 テンプレートの指定<br>
デフォルトのまま[次へ]をクリック
- ステップ 2 スタックの詳細を指定<br>
[パラメータ]-[User Pool]-[AdminEmail]へWebポータルの管理者のメールアドレスを入力<br>
※本メールアドレスがWebポータルログイン時のユーザ名となります。パスワードはツール側で自動作成され、本メールアドレス宛に通知がされます。
- ステップ 3 スタックオプションの設定<br>
デフォルトのまま[次へ]をクリック
- ステップ 4 レビュー<br>
ページ最後の[The following resource(s) require capabilities: [AWS::IAM::Role]]へチェックを入れ、[スタックの作成]をクリック

しばらくすると、上記で入力したメールアドレス宛にパスワードが届きますので、控えておきます。

スタックの作成が完了した後、[出力]-[PortalUrl]の文字列をコピーし、ブラウザのアドレス欄へペーストし、ポータル画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/049c16e1-1173-53a1-3f51-0ce2c13b810b.png)

メールアドレス・パスワードを入力しサインインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/e8b5fa90-d4a2-d6ca-b425-d8d756ade8e1.png)
新しいパスワードを入力します。
[Account recovery requires verified contact information]は[Skip]をクリックします。
以下画面が表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/dfb09948-777a-6b6c-194d-2174f5dfb74e.png)

#### クレデンシャルの作成
BアカウントからAアカウント上のS3へアクセスするために必要なクレデンシャルを作成します。

Aアカウントにて、IAMユーザを作成し、アクセスキー/シークレットアクセスキーを作成します。IAMユーザの権限は、AアカウントのS3バケットに対する読み取り以上　とします。

Bアカウントにて、[Systems Manager]の[パラメータストア]へアクセスし、パラメータを作成します。
作成時のポイントは以下の通りです。

- タイプ: [安全な文字列]とします。[KMS キーソース][KMSキーID]はデフォルトで問題ありません。
- 値：以下の形式で入力します。各キーは、Aアカウントで作成したIAMユーザの情報となります。

```
{
  "access_key_id": "xxxxxxxxxxxxxxx",
  "secret_access_key": "xxxxxxxxxxxxxxx"
}
```

#### レプリケーションタスクの作成&動作確認
S3データ転送用のタスクを作成します。
[Create Replication Task]から[Amazon S3]を選択し[Next Step]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/c6c3d926-9e6f-f543-b9ee-51bfa3cce74a.png)

[Engine options]は[Amazon S3]を選択し、[Next Step]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/b2ed918b-05bf-7662-c3a3-9af85ce73d31.png)

[Source Type]は[Amazon S3]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/0f9a191a-4127-154d-6969-31844d555186.png)

[Source settings]は転送元の(本アカウント若しくは別アカウント上の)S3の指定となります。以下とします。

- Bucket Name: バケット名を入力
- Bucket Object Prefix- optional: バケット内から特定オブジェクトのみを転送したい場合に入力します。
- Is Bucket in this account?: 同じAWSアカウント上のS3を扱う場合は[Yes]とします。今回は[No]とします。
- Credentials Store: [クレデンシャルの作成]で作成したパラメータストアを選択します。
- Region Name：今回は[N.Virginia(us-east-1)]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/f096c62b-acd1-1204-9598-9e2765e96548.png)

[Destination settings]は転送先の(本アカウント上の)S3の指定となります。以下とします。

- Bucket Name: バケット名を入力
- Bucket Object Prefix- optional: バケット内から特定オブジェクトのみを転送したい場合に入力します。
- Storage Class: 保存後のストレージクラスの指定となります。[Standard/Standard-IA/One Zone-IA/Intelligent-Tiering]を選択できます。今回は[Standard]とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/094b478b-2962-9546-f77c-7d541dc2dac0.png)

[Advanced Options]はLambdaのリソース(メモリ等)の設定となります。今回はデフォルトとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/302e6a4d-861f-f84b-1754-e633d34b2449.png)

[More]の[Alarm Email]は、エラー発生時の通知先のメールアドレスとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/d35791f1-cdcb-3bad-b73a-0242e8b56c67.png)

本ツールでは転送に失敗すると、SQS(キュー)に保管し再度リトライを行います。複数回失敗するとDLQ(Dead Letter Queue)へ送られ、結果エラーとして通知が行われるようです。

最後に[Next Step]をクリックします。設定一覧が表示するため問題無ければ[Create Task]をクリックします。

タスクが作成し、自動で構築＆転送が開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/fdd48fe8-1f28-2d4b-d759-443061e5ec41.png)
構築については、裏でCloudFormationにてS3 Pluginのスタック作成が行われます。
[Status]が[In Progress]になると構築が完了し、データ転送が継続して行われる状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/7208d87b-3122-c1c0-1864-85ff5cca9da4.png)

以降、AアカウントのS3へファイルを新規に配置すると、自動[^auto]でBアカウントのS3へ転送されるようになります。

[^auto]: デフォルトで1時間毎の転送となります。BアカウントのCloudWatch Ruleに[DRH-S3-xxxx]というルールがあるため、そのルールのスケジュールを修正することで間隔を変更することができます。<br>データ転送元・先が同じアカウントの場合は、S3 Event機能によりオブジェクトの作成・削除のタイミングで転送が行われるようです。

転送を止めるには該当タスクを選択した上で[Task Action]-[Stop]をクリックします。Stopが成功すると[Status]が[Stopped]となります。なお、この時にタスク用のCloudFormationスタックの削除が行われるようです。
また、既存のタスクを複製[Clone Task]することもできます。

CloudWatch Metricsにも対応しており、以下のように転送に関する各種メトリクスを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276941/9a39b596-97bd-4e3d-b151-9c35af272b37.png)

# まとめ
本ツールを使用することで、簡単に環境構築とデータ転送を行うことができました。<br>(中国以外の)AWSグローバル間のデータ転送は「S3 クロスリージョン​レプリケーション」等の機能があるため、本ツールを使用することは殆ど無いと思います。一方、対AWS中国とのデータ転送は上記機能に対応していないため、本ツールを利用することで、効率的にデータ転送ができるようになると思います。

# 本環境の削除
[専用Webポータルの構築]にて作成したCloudFormationスタック(DataReplicationHub)を削除します。

# 参考
[Data Replication Hub - Amazon Web Services Solutions](https://www.amazonaws.cn/en/solutions/data-replication-hub/)
[GitHub - awslabs-aws-data-replication-hub- Seamless User Interface for replicating data into AWS-](https://github.com/awslabs/aws-data-replication-hub)
[EP34 - AWS Data Replication Hub(ft. Joe Shi) - 4K2160P - YouTube](https://www.youtube.com/watch?v=kH1vArryFpE)