DataSync エージェントで、異なるアカウント間でEFS to EFS データ転送する

# データはどこで転送できますかAWS DataSync？

- AWS アカウント内でサポートされている転送
- 異なる AWS アカウント間でサポートされている転送

などは[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/datasync/latest/userguide/working-with-locations.html)を参照


# EFS to EFSを異なるアカウント間で行いたい場合は、`DataSyncエージェント`を使う必要がある

DataSync Agentとなる仮想サーバーが必要となります。
EC2上か、オンプレ上のVMware上など設置する必要がありますが、今回はAWS内（異なるアカウント間）でのデータ転送処理となるため、EC2上にDataSync Agentを作成します。

オンプレ上のデータを対象とする場合には、オンプレのVMware上にDataSync Agentとなる仮想サーバーを建てる必要があります。


この際、`DataSyncエージェント`は、転送元（転送したいデータに近い方へ）置くべきとの事
そして、DataSyncのロケーションやタスクを作成するのは、転送先で作成・実行する

```
今回の各種配置は以下の通り

アカウントA（転送元）
　　　A.1) EFS（source）
　　　A.2) DataSyncエージェント（EC2インスタンス) ※CFで作成

アカウントB（転送先）
　　　B.1) EFS（distribution）
　　　B.2) DataSyncエージェント(アクティベーションしたエージェント---> A.2)
　　　B.3) DataSync　ロケーション(移行元：　NFS--->B.2)
　　　B.4) DataSync　ロケーション(移行先：EFS--->B.1)
　　　B.5) DataSync　タスク
```

# 手順
1. アカウントA（転送元）に、DataSyncエージェントをデプロイする
2. アカウントB（転送先）に、DataSyncエージェントを登録し、アクティベーションする
3. アカウントB（転送先）の DataSyncで転送元ロケーションを作成する
4. アカウントB（転送先）の DataSyncで転送先ロケーションを作成する
5. アカウントB（転送先）の DataSyncでタスクを作成する
6. 5.で作成したタスクを開始する


# やってみた
## 1. アカウントA（転送元）に、DataSyncエージェントをデプロイする
- DataSyncエージェント
DataSync Agent用EC2と、サービスポイント用のパブリックエンドポイントとVPCエンドポイント作成用のCloudFormationテンプレートを置いておきます。
[CloudFormationテンプレート](https://github.com/kaihei777/datasync-agent/blob/main/cf-datasync-agent.yml)

- 利用するAMI
CloudFormationテンプレートには、デフォルトでAMIを設定していますが、AMIのIDが新しくなるので、使えるAMIのIDを確認するようにします。

```
執筆時点で使えるAMI
% aws ssm get-parameter --name /aws/service/datasync/ami --region ap-northeast-1
{
    "Parameter": {
        "Name": "/aws/service/datasync/ami",
        "Type": "String",
        "Value": "ami-0fd849d47ec1ece18",
        "Version": 65,
        "LastModifiedDate": "2023-06-26T23:48:39.985000+09:00",
        "ARN": "arn:aws:ssm:ap-northeast-1::parameter/aws/service/datasync/ami",
        "DataType": "text"
    }
}
```

- インスタンスタイプ
転送処理量により、以下の2つから選択します。
m5.2xlarge:2000万未満のファイルを転送する場合
m5.4xlarge:2000万超のファイルを転送する場合

- サービスエンドポイント
DataSync AgentとなるEC2とAWSサービス間で利用されるエンドポイントとなります。
以下の種類があります。

    - パブリックエンドポイント
DataSyncエージェントからAWSへの通信が、パブリックインターネットを介して行われる
    - 連邦情報処理規格 (FIPS) エンドポイント
AWS GovCloudにて利用するエンドポイント
    - Virtual Private Cloud(VPC) エンドポイント
DataSyncエージェントからAWSへの通信が、DataSync用のVPCエンドポイントを介して行われる
Virtual Private Cloud(VPC) エンドポイントを利用する場合は、エージェントのテンプレートのパラメータで`UseVPCEndpoint`を`true`にする事で作成されます。

- ネットワーク要件
[AWS DataSyncネットワーク要件](https://docs.aws.amazon.com/ja_jp/datasync/latest/userguide/datasync-network.html)
今回は`パブリックエンドポイント`を使います。
[パブリックまたは FIPS エンドポイントのネットワーク要件
](https://docs.aws.amazon.com/ja_jp/datasync/latest/userguide/datasync-network.html#using-public-endpoints)

　☆DataSyncエージェントEC2インスタンスに付与しているセキュリティグループが、EFSのTCP 2049へアクセス出来る様にして下さい。
　　CloudFormationテンプレートでは、DataSyncエージェントEC2インスタンスに付与するセキュリティグループがありますので、そちらがアクセスできる様にします。

![](https://docs.aws.amazon.com/ja_jp/datasync/latest/userguide/images/datasync-ports.png)


## 2. アカウントB（転送先）に、DataSyncエージェントを登録し、アクティベーションする

エージェントのアドレスには、エージェントのパブリックDNS名を入力します。

アクティベーションは、1度しか行えません。80ポートが自動で閉じる様です。
その為、エージェントを停止させてしまうと、パブリックIPとパブリックDNS名が変わってしまいます。
可能であれば、Route53でドメイン名を作成したものでアクティベーションするか
Elastic IP アドレスを割り当てておきましょう


![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44351/611ca093-8708-7610-5ecd-21c3424c3408.png)

## 3. アカウントB（転送先）の DataSyncで転送元ロケーションを作成する

転送元のEFSは、エージェント経由でアクセスするため、ロケーションタイプにはネットワークファイルシステム(NFS)を選択します。

すると、エージェントの選択肢に先程作成したエージェントが選べるはずです。

NFSサーバには、移行元となるEFSのDNS名を入力します。

マウントパスは、移行要件に合わせて設定して下さい。

NSFバージョンは、自動で良いと思います。

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44351/3a6f0b01-efdc-d052-b497-f2a58ff40853.png)

## 4. アカウントB（転送先）の DataSyncで転送先ロケーションを作成する

転送先のEFSは、DataSyncと同じアカウントになるので、ロケーションタイプは`Amazon EFS ファイルシステム`となります。

アカウント内にある、EFSファイルシステムが選択肢として出てくるので、移行先となるEFSを選択します。

マウントパスは、移行要件に合わせて設定して下さい。

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44351/62b674fc-ffd1-a015-d958-57728e6dca10.png)

## 5. アカウントB（転送先）の DataSyncでタスクを作成する

転送処理のためのタスクを設定します。

具体的設定作業方法については割愛します。公式手順の[AWS DataSync転送内容の設定](https://docs.aws.amazon.com/ja_jp/datasync/latest/userguide/create-task.html)を確認ください。

## 6. 5.で作成したタスクを開始する

作成したタスクを開始させます。

タスクのステータスが「利用可能」と表示されたら、「開始」を選択します。

[既定値で開始] を選択します。

以上になります。
あとは、進捗状況を確認しつつ、実際に転送が行われているかをファイルシステムを確認しつつ見守りましょう。