AWS Application Migration Serviceによるサーバー移行とCloudEndureとの比較

## はじめに
2021/5/18 に新しい移行用サービスである AWS Application Migration Service (AWS MGN) がリリースされました。
東京リージョンでも利用可能です。

https://aws.amazon.com/jp/application-migration-service/

2019年に CloudEndure が AWS により買収され、CloudEndure Migration および CloudEndure Disaster Recovery が AWS サービスとして利用可能でしたが、専用のコンソールを介してアクセスする必要がありました。AWS MGN は CloudEndure Migration に基づいた後継サービスとなっており、AWS マネジメントコンソールに完全に統合されています。

## どの移行サービスを使えばいい？
AWS GovCloud または China Region へ移行するケースを除いて、現在は AWS MGN の利用が推奨されています。
 
https://aws.amazon.com/jp/application-migration-service/when-to-choose-aws-mgn/

また CloudEndure Migration はすでに EOL がスケジュールされていますのでご注意ください。

* 2022/6/30 新規ライセンスの割り当て停止
* 2022/9/30 新規 Agent のインストール停止
* 2022/12/30 既存ライセンスの期限切れ (サービス停止)

https://docs.cloudendure.com/#Configuring_and_Running_Migration/Migration_EOL/Migration_EOL.htm

## サポート OS
### AWS MGN でサポートされる OS
* Microsoft Windows Server 2003 32 bit / 64bit	
* Microsoft Windows Server 2003 R2 32 bit / 64bit
* Microsoft Windows Server 2008 32 bit / 64 bit
* Microsoft Windows Server 2008 R2 64 bit (patched) 
* Microsoft Windows Server 2012 64 bit
* Microsoft Windows Server 2012 R2 64 bit 
* Microsoft Windows Server 2016 64 bit
* Microsoft Windows Server 2019 64 bit
* Microsoft Windows Server 2022 64 bit
* Microsoft Windows 10 64 bit
* SUSE Linux (SLES) 12 and higher
* Debian Linux 9 and higher
* Ubuntu 12.04 and higher
* Red Hat Enterprise Linux (RHEL) 6.0 and higher
* Oracle Linux 6.0 and higher
* CentOS 6.0 and higher
* CentOS 5.0 - Only supported for agentless replication from vCenter

https://docs.aws.amazon.com/mgn/latest/ug/Supported-Operating-Systems.html

### AWS MGN でサポートされない OS
CloudEndure Migration ではサポートされていた一部の古い OS は、AWS MGN ではサポートされていません。


* Microsoft Windows XP / 7 / 8 / vista
* SUSE Linux 11
* Debian Linux 8
* Kali Linux (すべてのバージョン)	
* Red Hat Enterprise Linux (RHEL) 5.X

https://docs.cloudendure.com/Content/Getting_Started_with_CloudEndure/Supported_Operating_Systems/Supported_Operating_Systems.htm

## ネットワーク要件
以下は [**Service architecture and network architecture overview**](https://docs.aws.amazon.com/mgn/latest/ug/Network-Settings-Video.html) より引用したアーキテクチャ図です。CloudEndure User Consle への通信が AWS MGN のエンドポイントへに置き換わってはいますが、それ以外のネットワーク要件は CloudEndure Migration と同じであることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/490ce4d7-c263-3fa5-d1ac-c98fba83ce3a.png)

* TCP 1500 Data Transfer

AWS Replication Agent がインストールされているソースサーバーがステージングエリアサブネット内のレプリケーションサーバーに対しデータを複製する際には、TCP Port 1500を介して通信します。Direct Connect や VPN による接続も可能です。

* TCP 443 Control Protocols

ソースサーバーが TCP Port 443 (HTTPS) を介して AWS MGN のエンドポイント (`https://mgn.<region>.amazonaws.com`) と通信する必要があります。主にソースサーバーのステータスやメトリクスがサービス側に送信されます。この通信はプロキシサーバー経由とすることもできます。

* TCP 443

ステージングエリアサブネット内のレプリケーションサーバーが TCP Port 443 を介して AWS MGN, EC2, S3 のエンドポイントと通信する必要があります。AWS MGN は Private Link をサポートしているため、ステージングエリアサブネットをプライベートサブネットとするとして構成することもできます。


## 料金
CloudEndure Migration ではライセンス発行後 90 日間は無料で利用することができました。90 日を超過した場合はレプリケーションが停止されます。

AWS MGN でも引き続き 90 日間は無料で利用できます。90 日を超えた場合はレプリケーションは停止されずに、レプリケーションを続行している期間、1 サーバーあたり、1 時間ごとに 0.042 USD が課金されます。 (全リージョン同一料金)

https://aws.amazon.com/jp/application-migration-service/pricing/


## やってみる
※記事内のスクリーンショットは 2021/5/23 時点のものです。

オンプレミス環境を想定した任意の VPC のパブリックサブネットにソースサーバーとなる EC2 を起動します。ここではレプリケーション動作を確認するために WordPress をセットアップした EC2 を準備しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/ab4c35a1-ce3e-5de0-bd01-78f3d3a3ed64.png)


### AWS MGN のセットアップ
AWS MGN のコンソールから Get Started をクリックすると、AWS MGN のセットアップ画面に遷移します。最初にこのセットアップで Replication Settings template を作成する必要があります。

ソースサーバーから AWS へのレプリケーションを行なう各種設定を Replication Settings template よって管理します。テンプレートの設定はデフォルト値として動作しますが、個々のソースサーバーに対して後から個別に設定を変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/51144eee-47d2-ef59-426a-458b603c6d5a.png)

**Replication Servers**
レプリケーションサーバーの設定として以下を指定します。レプリケーションサーバーは、ソースサーバーから AWS へデータをレプリケートするために使用される EC2 インスタンスです。

* Staging area subnet (レプリケーションサーバーを起動するサブネット)
* Replication Server のインスタンスタイプ
* EBS のボリュームタイプ
* EBS の暗号化設定
* セキュリティグループ

EBS のボリュームタイプの設定は、同期するディスクのサイズが 500 GiB 以上の場合にのみ影響する設定です。500 GiB 未満の場合は常にスループット最適化 HDD (st1) が使用されます。また プロビジョンド IOPS SSD は Replication Settings template では指定できません。

セキュリティグループの設定で常に Application Migration Service のセキュリティグループを使用するようチェックすると、テータをレプリケーションするために必要な TCP port 1500 がオープンされたセキュリティグループが自動で作成され、アタッチされます。このセキュリティグループを手動で編集した場合は AWS MGN によって自動的に修正されます。

作成されるセキュリティグループ (`AWS Application Migration Service default Replication Server Security Group`) のインバウンドルールおよびアウトバウンドルールは以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c08ce428-592e-cd7c-d022-c27ce584eafe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/7b5df6fe-800a-73d5-8056-1fafc9e1e1ef.png)

ここでは Staging are subnet に検証用に作成したパブリックサブネットを指定し、その他はデフォルトのままとしました。

**Data routing and throttling**
プライベート IP を使用するかどうか、レプリケーション時の帯域制限を設定することができます。デフォルトではインターネット経由でデータがレプリケーションされますが、VPN, DirectConnect, VPC Peering 経由としたい場合はプライベート IP を使用することができます。

ここではデフォルト (パブリック IP 使用、帯域制限なし) として、テンプレートの作成を完了します。

### AWS Replication Agent のインストール
ソースサーバーに AWS Replication Agent をインストールするには CloudEndure と同様、適切な権限をもった IAM ユーザーのクレデンシャルが必要です。AWS 管理ポリシーの `AWSApplicationMigrationAgentPolicy` をアタッチした IAM ユーザーを作成し、アクセスキー/シークレットアクセスキーを控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/8818e6c7-c5db-f32c-8abe-d4dba51afb03.png)

ソースサーバー内でインストーラーをダウンロードし、実行します。リージョン、アクセスキー、シークレットアクセスキー、レプリケーションを行なうディスクを指定すると、AWS Replication Agent がインストールされます。

```shell-session
$ wget -O ./aws-replication-installer-init.py https://aws-application-migration-service-ap-northeast-1.s3.amazonaws.com/latest/linux/aws-replication-installer-init.py

$ sudo python3 aws-replication-installer-init.py
The installation of the AWS Replication Agent has started.
AWS Region Name: ap-northeast-1
AWS Access Key ID: AKIAZXXXXXXXXXXXXXXX
AWS Secret Access Key:
Identifying volumes for replication.
Choose the disks you want to replicate. Your disks are: /dev/xvda
To replicate some of the disks, type the path of the disks, separated with a comma (for example, /dev/sda,/dev/sdb). To replicate all disks, press Enter:
Identified volume for replication: /dev/xvda of size 8 GiB
All volumes for replication were successfully identified.
Downloading the AWS Replication Agent onto the source server... Finished.
Installing the AWS Replication Agent onto the source server... Finished.
Syncing the source server with the Application Migration Service Console... Finished.
The following is the source server ID: s-xxxxxxxxxxxxxxxxx.
The AWS Replication Agent was successfully installed.
```

これらのパラメーターは対話的な入力だけではなく、インストーラー実行時の引数として渡すこともできます。

https://docs.aws.amazon.com/mgn/latest/ug/linux-agent.html

### 参考: プライベート IP で同期を行う場合の設定
事前準備として 3点あります。

* レプリケーション設定で プライベート IP の使用を有効にする
* MGN の Interface 型 VPC エンドポイントを作成する
* S3 の Interface 型 VPC エンドポイントを作成する (ゲートウェイ型では無いことに注意)

インストーラーは MGN および S3 のエンドポイントにアクセスするため、インターフェース型 VPC エンドポイントが必要です。インストーラー実行時のパラメーターで `--endpoint` および `--s3-endpoint` を指定します。


```shell-session
$ sudo python3 aws-replication-installer-init.py \
  --region ap-northeast-1 \
  --aws-access-key-id AKIAIOSFODNN7EXAMPLE \
  --aws-secret-access-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \
  --endpoint https://vpce-xxxxxxxxxxxxxxxxx-yyyyyyyy.mgn.ap-northeast-1.vpce.amazonaws.com \
  --s3-endpoint https://vpce-zzzzzzzzzzzzzzzzz-yyyyyyyy.s3.ap-northeast-1.vpce.amazonaws.com
```

### レプリケーション
エージェントのインストールが完了すると、初回の同期プロセスが自動的に実行されます。コンソールを確認すると移行元の対象サーバーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/def391f0-9186-32b9-1c03-a666d5643222.png)

EC2 コンソール確認すると、Replication Settings template の設定に従って、Replicatoin Sever が起動していることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/2eabfd08-c321-e2de-3cc9-1083890d1a14.png)

前述のとおり、ソースサーバーごとに Replication Settings から個別にレプリケーション設定を変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/ec838c82-eb6b-8cc6-711c-3d3b8fd64b24.png)

また個々のソースサーバー内の Disk settings からレプリケーションするディスクごとに EBS のボリュームタイプをカスタマイズすることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/ff64b7b8-f9fc-166b-47fa-576fc1f4a461.png)

この設定では st1/gp2 以外のボリュームタイプも選択できます。
2022/2/28 の アップデートで gp3 も選択できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f64a0e25-a3f1-b6ef-4090-f02f40dc053d.png)

初回の同期プロセスが完了して EBS スナップショットが作成されると、ソースサーバーのライフサイクルが `Ready for testing` に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/b25f0391-84d7-e616-0094-d86539b3691a.png)

### Launch settings の変更
ソースサーバーの Launch settings からテストインスタンス、カットオーバーインスタンス起動時の一般的な起動設定および、EC2 の起動テンプレートを編集できます。起動テンプレートは AWS MGN によりソースサーバーごとに自動的に作成されます。今回の環境ではインスタンスタイプが c4.large, EBS のボリュームタイプが io1 が指定されており、オーバースペックなため、編集していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/53d83d8e-a573-d285-0624-3f06bff1ea96.png)


一般的な起動設定では `Instance type right sizing` がデフォルトで有効化されています。これはソースサーバーのハードウェア構成から適切なインスタンスタイプを自動で選択する機能です。この機能により起動テンプレートのインスタンスタイプで c4.large が選択されています。Basic (On) → None (Off) に変更して機能を無効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1965fa7d-510f-805f-e5e6-1ccee875b755.png)

続いて起動テンプレートの Modify をクリックすると、ポップアップで警告ができます。AWS MGN は起動テンプレートの "Default" version を常に参照するため、起動テンプレートの新しいバージョンを作成したら、Default の向き先バージョンを変えるように警告がでます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/eb843729-5df7-8aba-866c-1a669c62eab9.png)

ここでは以下の 6 点を変更しました。Instance type right sizing が有効である場合、インスタンスタイプを変更しても AWS MGN によって強制的に推奨のインスタンスタイプ (今回の場合は c4.large)で上書きされてしまうため、ご注意ください。

* インスタンスタイプを t3.micro に変更
* EBS のボリュームタイプを gp2 に変更
* IAM インスタンスプロファイルを設定
* サブネット (Migrated Resources Subnet) を設定
* セキュリティグループを設定
* パブリック IP を有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/b778b3a0-46d2-570c-afbe-bd2865f0669e.png)


起動テンプレートのデフォルトバージョンを更新後のバージョンに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/63508be0-ad6f-838f-adb0-f77bf3fd7318.png)

### テストインスタンスの起動
Test and Cutover から Launch test instances を実行し、テストインスタンスを起動できます。移行したサーバーが AWS 環境上で正常に動作することを確認するためにカットオーバー前にテストインスタンスを起動し、検証を行なうことが推奨されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/3f2c7a8e-7e5a-3072-d274-974772cb1762.png)

ライフサイクルが `Test in progress` に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/424a2a2c-1e12-852e-7290-04309d21e945.png)


AWS Application Migration Service Conversion Server が起動して、スナップショットを変換し、テストインスタンスが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/abdd2d2f-ffe6-5049-3f97-8d4ac0b7dc10.png)

テストインスタンスが起動したら WordPress にアクセスし、インスタンスが正常に移行されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/946bd41b-4634-415b-1e58-6071299fe141.png)

テストが完了したら、Test and Cutover から Mark as "Ready for cutover" をクリックします。もしテストに問題が発生した場合は Revert to "Ready to testing" からライフサイクルを一つ前に戻すこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/736dcea7-2f1f-55b5-8be0-fe3a0bdac32f.png)

確認メッセージで Continue を選択します。テストインスタンスを削除するチェックボックスがデフォルトで有効になっているため、同時に削除されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/eea6a78d-3c0c-9e13-fa93-9f87ac149795.png)

ライフサイクルが `Ready for cutover` に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/cee89c11-0a67-63b1-a2c9-82417c878875.png)

### カットオーバーインスタンスの起動
テストが完了したらいよいよ移行環境にカットオーバーを行います。Test and Cutover から Launch cutover instances をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/efb78369-8b1f-6001-72a0-b23a2cceccde.png)

再度 Conversion Server が起動してスナップショットを変換し、カットオーバーインスタンスが作成されます。ステータスは `Cutover in progress`　に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c89f58eb-9178-6920-1ac6-8548a79c9daf.png)

カットオーバーインスタンスが起動したら再度 WordPress にアクセスし、正しく移行されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/54456b93-acec-200a-49c5-cc3a93a5dd60.png)

移行の確認が完了したら、Test and Cutover から Finalize cutover を選択し、カットオーバーを確定することができます。カットオーバーに問題が発生した場合は Revert to "Ready for cutover" からライフサイクルを一つ前に戻すこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/961b1939-cd93-fc2f-90aa-38d5f53b1730.png)

カットオーバーを確定すると、ライフサイクルは `Cutover complete` に遷移します。これによりソースサーバーからのデータレプリケーションは自動で停止されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/8f52058d-0410-2278-fdc4-1c5d41d1ead1.png)

最後のステップはソースサーバーのアーカイブです。Actions から Mark as archived を選択します。これにより移行が完了したサーバーはソースサーバーの一覧から表示されなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/8d8883fa-fd2c-5b79-7117-f115af581f7e.png)

Preferences (歯車アイコン) から `Show only archived servers` を ON にすることでアーカイブしたサーバーのみを表示させることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1517b501-806b-655b-3abf-c0add4cd76c6.png)


### 参考: AWS Migration Hub との連携
CloudEndure 同様、AWS MGN も Migration Hub と連携してサービスやアプリケーション単位、複数リージョンの移行状況を管理することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/0368847d-7efa-fc90-9589-cb7c6af46c57.png)

AWS MGN によるサーバー移行を一通り試してみましたが、CloudEndure を使用したことがある方であれば、すんなり触ることができるかと思います。起動テンプレートの管理など若干クセはありますが、マネージドコンソールに統合され、移行ステータスを管理できるのは想像以上に使いやすかったです。API も公開されているため、SDK や CLI による自動化等も検討できそうです。


## 参考
https://aws.amazon.com/jp/blogs/aws/how-to-use-the-new-aws-application-migration-service-for-lift-and-shift-migrations/

https://docs.aws.amazon.com/mgn/latest/ug/what-is-application-migration-service.html

## 余談
なんで略称が MGN なんでしょうか。MiGratioN? 単純に考えれば AMS になるのですが、実は AMS という略称はすでに別のサービスで使用されています。[AWS Managed Services](https://aws.amazon.com/jp/managed-services/) (AMS) です。


以上です。参考になれば幸いです。