Server Migration Service[SMS]を使ってVMware環境からAWSへ

こんちは！
エキゾチックショートヘア(猫)を飼ってます。
加藤です。

AWS Server Migration Service(以下SMS)を検証してました。
だいたい動きが掴めてきたので、いっぺんまとめようと思います。

# 1. SMSの使用要件
以下参照
http://docs.aws.amazon.com/ja_jp/server-migration-service/latest/userguide/prereqs.html

# 2. 概要
VMware社のvSphereESXiサーバーで稼働している仮想マシンを
自動でAWSにイメージを転送し、AMIにしてくれるものです。

# 3. 前提
当たり前ですが、ESXiサーバの環境と、稼働している仮想マシン、
そしてvCenterサーバーが必要です。

以下参照
http://docs.aws.amazon.com/ja_jp/server-migration-service/latest/userguide/SMS_setup.html

## 3.1. vCenterサーバ SMS権限のユーザーを作成
以下抜粋
> vCenter で以下の権限を持つロールを作成します。
> 
> [Datastore] > [Browse datastore and Low level file operations] -
 (Datastore.Browse と Datastore.FileManagement)
> 
> [vApp] > [Export] - (VApp.Export)
> 
> [Virtual Machine] > [Snapshot management] > [Create snapshot and Remove Snapshot] - (VirtualMachine.State.CreateSnapshot と VirtualMachine.State.RemoveSnapshot)
> 
> 次のようにロールを割り当てます。
> 
> この vCenter ロールを、コネクター で vCenter へのログインに使用するサービスアカウントに割り当てます。
> 
> このロールを伝達権限と共に VM の移行元のデータセンターに割り当てます。
> 
> vCenter サービスアカウントのアクセス許可を手動で確認するには、コネクタのサービスアカウントの認証情報を使用して vSphere クライアントにログインできること、VM を OVF テンプレートとしてエクスポートできること、データストアのブラウザを使用して VM があるデータストアからファイルをダウンロードできること、および VM の ESXi ホストの概要タブでプロパティを表示できることを確認します。

今回は面倒なので、`Administrator@vsphere.local`で実施しました。

## 3.2. AWS IAMユーザーとIAMロールの作成
いちいちどの権限が必要かドキュメントみるのも面倒なので、
CloudFormation化した。
下記のスタックを作成したらいいです。

```yaml:iam.yml
AWSTemplateFormatVersion: '2010-09-09'

Resources:
  SmsUser:
    Type: AWS::IAM::User
    Properties:
      ManagedPolicyArns:
      - arn:aws:iam::aws:policy/ServerMigrationConnector
      Path: '/'
      UserName: sms-connector

  SmsUserAccessKey:
    Type: AWS::IAM::AccessKey
    Properties:
      UserName: !Ref SmsUser

  SmsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
        - Sid: ""
          Effect: "Allow"
          Principal:
            Service:
            - "sms.amazonaws.com"
          Action:
          - "sts:AssumeRole"
          Condition:
            StringEquals:
              sts:ExternalId: sms
      ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/ServerMigrationServiceRole
      Path: '/'
      RoleName: sms-connector-role

Outputs:
  AccessKeySmsUser:
    Value: !Ref SmsUserAccessKey
  SecretKeySmsUser:
    Value: !GetAtt SmsUserAccessKey.SecretAccessKey
```

# 4. 手順
流れはこんな感じ
1. [SMS Connector]をダウンロード
2. vCenterサーバから[SMS Connector]をデプロイし起動
3. 起動後、IPとか設定
4. [SMS Connector]にWebで接続

# 5. 構成図
![sms構成.png](https://qiita-image-store.s3.amazonaws.com/0/191445/f12162ea-90cc-1b77-22f6-f10e6b0f9af8.png)

SMSはAMI作成までで、インスタンスの作成はAMI選んでインスタンス起動です。

# 6. sms-connectorダウンロード → デプロイ手順
【AWS環境】
1. AWSマネージメントコンソールから[Server Migration Service]を選択
2. [今すぐ始める]
3. AWS Server Migration Connectorのセットアップ画面から[Download OVA]をクリックし、ダウンロード

【オンプレミス環境】
4. ダウンロードしたovaファイルをvCenterからデプロイする

# 7. sms-connector設定手順
【オンプレミス環境】
vCenterサーバから[SMS Connector]をデプロイし起動後、以下の手順を実施

1.WebUIで接続
[Get Started now]をクリック
<img width="1277" alt="sms-connector01.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/1eec8e0a-c754-063c-ab28-d4b771c71d07.png">

2.Lincense Agreement画面
<img width="1272" alt="sms-connector02.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/8b6e1fe9-0924-3c52-a996-d85db8ad456e.png">

一番下までスクロールし、
[I have read and agree to the AWS License Agreement]をチェックし、[Next]
<img width="1207" alt="sms-connector03.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/b9103082-64b8-0735-aea9-4779b17e0f41.png">

3.Create a Password画面
sms-connectorのパスワードを入力し、[Next]
<img width="1240" alt="sms-connector04.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/6ee0c381-2799-e785-4344-31bf568dcafc.png">

4.Network Info画面
デプロイ後はDHCP環境下ではIPアドレスが自動で設定されるため、固定化したい場合は下記の手順を実施する
(sms-connectorデプロイ時に固定のIPを入力したんですが、なぜかDHCPで振られたIPになっとりました。なので改めてここで静的IPを設定)
<img width="1239" alt="sms-connector05_edit.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/c3b91d47-69b7-6d10-d5f1-8363d04d7126.png">

コンソールから設定
ユーザー名：ec2-user
パスワード：ec2pass
ログインできたら、`sudo setup.rb`を入力
<img width="718" alt="sms-connector06.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/dba67a9c-9433-6f67-18e9-3177a4357e29.png">

IP設定の場合は2を選択
<img width="721" alt="sms-connector07.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/a1fea87f-5fd3-571a-a77b-fba557a14d9f.png">

コンソールにて変更後、設定したIPアドレスにWebUIから接続する
パスワードを聞かれるので、設定したパスワードでログイン
<img width="1192" alt="sms-connector08.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/2d1d20ed-2853-e9ab-b8d3-5a731b1e98ad.png">

[Next]
<img width="1190" alt="sms-connector09.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/a1a050c4-166b-bd9e-8347-54974e76c2ca.png">

5.Log Uploads and Upgrades画面
[Next]
<img width="1193" alt="sms-connector10.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/1a91564a-3862-7d7b-b6fe-64d633098431.png">

6.Server Migration Service画面
SMSで転送先のリージョンを選択する
事前に作成した[IAM User]のAccess Key、Secret Keyを入力する
(最初の手順のCloudFormationで作成した方は[CloudFormation]→[IAMスタック]→[出力]タブにキーがでてるはず)
[Next]
<img width="1242" alt="sms-connector11.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/904fbcad-dded-2aa8-ea5f-6a2a42586db9.png">

vCenterサーバの情報を入力する
<img width="1230" alt="sms-connector12.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/a2aeb761-9b30-20b7-b4e6-118665c83dd3.png">

vCenter Host Name：[DNS名 or IPアドレス]
Username：権限のあるユーザー情報を入力
Password：パスワード
「I gnore hostname mismatch and expiration errors for vCenter and ESXi Certificates.」にチェック
[Next]
<img width="885" alt="sms-connector13.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/cbd4251a-787d-7235-f628-7ebf04cfea79.png">

AWSとの接続が成功すると下記のような状態になる
<img width="1277" alt="sms-connector14_edit.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/35bf6108-8a3e-6163-41ff-8edf6861d201.png">

ちょー簡単っすねw

# 8. Server Migration Service
## 8.1. Connector
【AWS環境】
Connectorタブをクリックする。
接続が成功していると下記のうようにステータスが「HEALTHY」になってるはず。
<img width="1256" alt="aws_sms01_edit.png" src="https://qiita-image-store.s3.amazonaws.com/0/191445/d89227a6-6a6c-c6e1-3048-7081adcb8ab3.png">

VMware環境の仮想マシン情報を取得する必要があるため、
[サーバーカタログのインポート]をクリックする。

## 8.2. サーバー
サーバータブ画面が表示される
vSphere環境の仮想マシン一覧情報が表示されているはずなので、移行対象の仮想マシンを選択し、
[レプリケーションジョブの作成]をクリックする。

## 8.3. レプリケーションジョブ
レプリケーションジョブ作成画面にて、事前に作成したIAMサービスロールを入力する必要がある。

あとは時間どおりジョブが動くはずです。

# 9. SMSの動作について
ここから細かい動作観察してみたので説明します。(間違ってるかもしれません)

1. AWS SMSのジョブが開始
2. VMware環境の仮想マシンでスナップショットが作成される
3. 対象の仮想マシンからovfファイルが作成され、選択したリージョンのS3バケットへVMDKファイルが転送される
4. VMDKファイルをEBSスナップショットへ変換
5. S3バケットの中身を削除
6. AMIが作成される

## 9.1. 注意事項
### 9.1.1. 一点目
SMSのスケジュールジョブは12〜24時間単位で定期的に差分データをAWSヘ送り続けることになるが、
初回転送からジョブを削除するまで、VMware側の仮想マシンスナップショットは残り続ける。
(正確には直近のSMSジョブ時のスナップショットが作られ、古いスナップショットは統合される)

シンプロディスクとかであればあまり問題になりにくいが、シックディスクの場合に大量の変更データが発生するとVMFSストレージを圧迫する可能性があるので、ご注意を

### 9.1.2. 二点目
SMSの要件に
> vCenter バージョン 5.5 以上 (6.5 まで検証済み)
> ESXi 5.1 以上 (6.5 まで検証済み)

※ 2017年9月の話です

とあるので上記条件(vcenter6.5、ESXi6.5)でSMSを動かしたところ、初回レプリケーションは成功するが、
2回目の差分レプリケーションが失敗した。

`ServerError: Failed to upload delta disk(s) to S3. If this problem persists, please contact AWS support: java.io.FileNotFoundException: https://[vcenterのIP]/folder/win2012r2%2Fwin2012r2-000001-delta.vmdk?dcPath=Datacenter&dsName=data01`

メッセージのとおり`xxxxx-delta.vmdk`がねえぞ！ということらしい。
差分レプリケーションにdeltaファイルが必要なんですね。
そして、仮想マシンスナップショットにdeltaファイルが作成されるのは
**VMFS5**まで

VMFS6からはスナップショットを取ると、
`000001-sesparse.vmdk`という形式になっとりました。

VMFS5で稼働している仮想マシンであれば問題なく2回目以降の差分レプリケーションも動作するので、お気をつけて。