AWS Application Migration Serviceを試してみる

## はじめに
こちらは [エーピーコミュニケーションズ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ap-com) の 11 日目の記事となります。

業務上でMigration Serviceに関わる機会があり、理解を深めるため動作検証をしてみることにしました。

今回は一台だけの移行テストでしたが、想像よりも時間がかかるため、あらかじめ時間が取れるタイミングでの検証をお勧めします。

また、作業中は複数台のインスタンスが立ち上がったままになります。
処理待ちの時間が想像以上に長く一晩跨いでしまうことになりました。
作業中断時のコストなどを考慮して一度削除し、改めて実施することになりましたので皆様はご注意ください。

また、以下の公式ドキュメントや記事を参考にさせていただきました。
[Application Migration Service](https://docs.aws.amazon.com/mgn/latest/ug/what-is-application-migration-service.html)
[AWS Skill Builder](https://explore.skillbuilder.aws/learn/course/external/view/elearning/1727/aws-application-migration-service-aws-mgn-a-technical-introduction)
[AWS MGN(application migration service)を使ってみた](https://qiita.com/nw-engineer/items/3b40b53171f5968038be)

## テスト環境の準備
### 移行元環境
移行サーバーとしてはVMware Workstationを利用して仮想環境を用意しました。
OSは次の通りです。
- Ubuntu 24.04 LTS

~~事前調査もろくにせず、手元環境にあったKaliLinuxで試したところ結果的に[サポートOS](https://docs.aws.amazon.com/mgn/latest/ug/Supported-Operating-Systems.html)ではなく移行ができませんでした。~~

### 移行先環境
ドキュメントなどを参考にしつつ、基本的なテスト用の環境はAWS CDKで作成しました。
事前の環境準備だけでも地味な操作が多く手間に感じられました。
GUI上ではあっちにいったりこっちにいったりしながら操作する必要がある際に、CDKはパッとまとめて作れるため非常に強力です。

- テスト用のIAMユーザー
- ステージング環境用のVPC
- デプロイ環境用のVPC

```
import * as cdk from 'aws-cdk-lib';
import * as iam from 'aws-cdk-lib/aws-iam';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { Construct } from 'constructs';

export class MigrationTestStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // IAMユーザーの作成
    const migrationUser = new iam.User(this, 'MigrationUser', {
      userName: 'migration-test-user',
    });

    // AWS Application Migration Service の管理ポリシーをアタッチ
    migrationUser.addManagedPolicy(
      iam.ManagedPolicy.fromAwsManagedPolicyName('AWSApplicationMigrationAgentPolicy')
    );

    // ステージング用VPCの作成
    const stagingVpc = new ec2.Vpc(this, 'StagingVpc', {
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
      maxAzs: 1,
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'Public',
          subnetType: ec2.SubnetType.PUBLIC,
        },
      ],
    });

    // デプロイ用VPCの作成
    const deployVpc = new ec2.Vpc(this, 'DeployVpc', {
      ipAddresses: ec2.IpAddresses.cidr('10.2.0.0/16'),
      maxAzs: 1,
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'Public',
          subnetType: ec2.SubnetType.PUBLIC,
        },
      ],
    });

    // タグの追加
    cdk.Tags.of(stagingVpc).add('Environment', 'Staging');
    cdk.Tags.of(deployVpc).add('Environment', 'Deploy');
  }
} 
```
デプロイ後の状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/32094074-dcd1-3d5a-ebdb-68c8f6a847be.png)

移行VMのセットアップに利用するため、アクセスキーを作成し控えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/12e47f97-ce76-d232-12c7-914dc8657c4e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/7c932b99-035d-6a31-3979-36403e639ab7.png)

## 移行作業
### Application Migration Service初期設定
初回利用のため初期化が求められました。
サービスをセットアップをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/879e5827-eec7-80b7-e65c-eb895cf651d7.png)

デフォルトテンプレートが作成されたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/2ce5d2f7-4d32-b12c-6d58-8c56a166ec83.png)


CDKにてテスト用の環境をデプロイ後、レプリケーション用のテンプレートを編集します。
こちらの操作についても合わせてCDKでうまく編集できないかと思ったのですが、すぐには解決が難しそうだったためマネコンからの作業としました。

レプリケーション用テンプレートを編集し、用意したステージング環境用のサブネットを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/96b58b79-0ee6-fd56-e419-a86a44d4b1c5.png)

### 移行対象マシン準備
以下を参考にしました。
[Installing the AWS Replication Agent on Linux servers](https://docs.aws.amazon.com/mgn/latest/ug/linux-agent.html)

端的には`wget`コマンドでインストールモジュールをダウンロードして実行する形となります。
リージョンごとに取得元が違うのですが、`ap-northeast-1`の場合は以下の様なコマンドになりました。
```
wget -O ./aws-replication-installer-init https://aws-application-migration-service-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/linux/aws-replication-installer-init
```

こちら実行方法で少し迷うことがありましたが、以下のようなコマンドを実行するとインストーラーが動作します。
```
sudo chmod +x aws-replication-installer-init; sudo ./aws-replication-installer-init --region ap-northeast-1 --aws-access-key-id ******** --aws-secret-access-key ********
```

```
ubuntu@ubuntu2404:~$ wget -O ./aws-replication-installer-init https://aws-application-migration-service-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/linux/aws-replication-installer-init
--2024-11-27 01:09:31--  https://aws-application-migration-service-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/linux/aws-replication-installer-init
Resolving aws-application-migration-service-ap-northeast-1.s3.ap-northeast-1.amazonaws.com (aws-application-migration-service-ap-northeast-1.s3.ap-northeast-1.amazonaws.com)... 52.219.162.122, 52.219.8.222, 52.219.151.30, ...
Connecting to aws-application-migration-service-ap-northeast-1.s3.ap-northeast-1.amazonaws.com (aws-application-migration-service-ap-northeast-1.s3.ap-northeast-1.amazonaws.com)|52.219.162.122|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11595224 (11M) [binary/octet-stream]
Saving to: ‘./aws-replication-installer-init’

./aws-replication-installer-i 100%[=================================================>]  11.06M  30.4MB/s    in 0.4s

2024-11-27 01:09:32 (30.4 MB/s) - ‘./aws-replication-installer-init’ saved [11595224/11595224]

ubuntu@ubuntu2404:~$
sudo chmod +x aws-replication-installer-init; sudo ./aws-replication-installer-init --region ap-northeast-1 --aws-access-key-id <AccessKey> --aws-secret-access-key <SecretKey>
The installation of the AWS Replication Agent has started.
Identifying volumes for replication.
Choose the disks you want to replicate. Your disks are: /dev/sda
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/sda of size 124 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-657e319eca07e282f.
You now have 1 active source server out of a total quota of 150.
Learn more about increasing source servers limit at https://docs.aws.amazon.com/mgn/latest/ug/MGN-service-limits.html
The AWS Replication Agent was successfully installed.
ubuntu@ubuntu2404:~$
```
このインストール処理内でも同期処理の様なものがいるようで完了までしばらく時間がかかります。
セットアップ完了後、AWS画面を確認すると画面表示が変わりました。

### Application Migration Service側状態確認
ソースサーバーの欄に移行元サーバーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/85ffe6d6-7da2-144e-9369-54d553468131.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/28a76570-1ffd-7dc1-edcc-1b77bcfd331e.png)

サーバーをクリックし詳細画面を表示すると、`準備ができていません`とのステータスとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/98bbbc71-f65f-1731-d028-57db22cc146a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/621f6dd7-79c0-79f2-f7cf-1b0d604ab1e5.png)

しばらくすると同期処理とスナップショットの作成処理が始まります。

初回実行時は同期後のスナップショット作成が想像以上に長く感じられたため、前述した通り一度中断してしまいました。(アーカイブ化)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/b78d5673-48ea-b3fb-5c9a-ebcc79c0e4f2.png)

裏では移行用にEC2インスタンスが立ち上がっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/ea5532be-de35-18fd-b3a2-3009ad37a734.png)

初期同期の完了後、スナップショットの作成が始まります。
こちらスナップショット自体の作成がされていることを確認しましたが、ステータスの遷移が非常に遅かったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/56991b3e-12b4-969c-23e8-193382683894.png)

やっとのことで初期レプリケーション完了です。
概ね1時間〜1.5時間ほどの時間がかかったと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/eda4da19-8863-6f45-ae7c-08d68bc1c034.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/3bb88815-7173-009f-1fde-cae883451187.png)

### 起動テンプレートの修正
起動テンプレートが作成されているため、テンプレートを開いて新しいバージョンを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/d22e272f-18aa-fd07-ac9e-74a365be2050.png)

デプロイ環境用のサブネットを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/731d39cd-4479-f8e6-f786-acc86b1449ba.png)

デフォルトバージョンを作成したテンプレートに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/28355b4d-f4a5-93d2-2c34-2d530cc43d72.png)

### テスト環境の起動・接続確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/93662e10-7910-1e6c-3b11-df7397879c10.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/5ecc96b8-6975-5fda-38ad-2971577cf0f5.png)

しばらくここでも起動待ちになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/b725ce81-5024-dff5-4276-20690877c798.png)

まず`AWS Application Migration Service Conversion Server`が上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/84da3a6b-d0ec-3831-f30e-a8dc03463e6d.png)

`AWS Application Migration Service Conversion Server`が停止済みとなり、移行対象のインスタンスが作成され起動されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/8559219d-cdec-847c-c2af-d3c2b256e71e.png)

しばらくすると移行元ホストと同名のインスタンスが作成され、またしばらくすると起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/25477ba4-16c2-d684-a59b-495761614f0e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/ffcc6ea2-6347-0e93-e8ab-996ad7ae129d.png)

アクセステストを試みようとしたところEIPが作成されていなかったため、EIPの作成と関連付けをし、セキュリティグループで22番ポートも許可しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/e27570b8-7502-7179-5921-263ec7fc80a6.png)

以下のように問題なく接続の確認ができました。
```
@ssh ubuntu@54.65.162.68
ubuntu@54.65.162.68's password:
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-49-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

Expanded Security Maintenance for Applications is not enabled.

213 updates can be applied immediately.
3 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

Last login: Wed Nov 27
```

### カットオーバーフェーズ
AMSを進めるためには一度カットオーバーの準備完了ステータスにする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/f6c1466e-cb40-796d-dcee-624f443e2a73.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/30f7cd3a-0cd3-aed1-cc09-44bd20edf3eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/2e025977-32f8-e6c4-86ff-cc74b01f201b.png)

カットオーバー準備完了となったら、カットオーバーインスタンスを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/11ddf169-5a67-ac9f-4aa3-6c68f88e3923.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/a8f7b0b4-59aa-f76b-4cb1-9614352828c2.png)

新しくカットオーバーインスタンスが立ち上がりました。
これで本番用のインスタンスが完成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/1e677718-2713-3ed3-b407-f7df7f33e587.png)

起動確認ができたら、カットオーバーを最終処理として不要なインスタンスなどの削除となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/c6ee5ef6-3cbd-0ad0-b00e-1ef7bf712dd0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/1876177a-0176-390f-6c2a-37ff9afc37ba.png)

カットオーバー完了のステータスとなり、これで移行が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/457221dd-8e2a-fb3c-ac6c-3cdc2dc492b3.png)

完了後`AWS Application Migration Service Replication Server`が自動で終了しませんでした。
アーカイブ済みとすることでインスタンスが終了するようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/f73814ca-7618-86ea-88af-dfb22cc6c563.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939906/9523e95e-41ed-4e2b-4e82-f306372e9244.png)

## おわりに
面倒な移行の手間を考えずに単純なクラウドリフトするだけであれば、とても有効に利用できるサービスです。
個人的には1台の移行でも思ったよりも時間がかかること、操作が少しだけ煩雑なことを感じました。

もちろんインスタンスを立ち上げてから中身を個別に移行していく場合などに比べると手間は非常に少ないものの、コマンドを有効活用することでさらに効率的な方法を模索したいと感じました。

今回は1台だけの移行での話でしたが、台数の多い大規模サービスなどでひとまずクラウドリフトだけするようなケースではとても強力に働き、手間もかからないと思いました。