AWS Consoleでスナップショットをアップロードして自前のVMDKを移行する

EC2のimage-importが上手くいかないとき、import-snapshotを使うとAWS上にimportできます。
既存の仮想サーバ(vmdk)の移行をスナップショットを介して移行する方法をご紹介します。AMIを作る際にエラーが出てしまうvmdkファイルを、無理やりAMIにする方法として、スナップショットをベースに作ることができます。
エラー処理を回避し、ローカルなvmdkファイルをベースにEC2サーバを立てることができます。

内容

・vmdkファイルをS3にアップロードする
・M1 macでaws consoleを利用できるようにする
・vmimportのロールとしてIAMの設定を行う
・S3のvmdkファイルをスナップショットの領域へコンバートする
・スナップショットからイメージを作り自分のAMIを作る

vmdkファイルをS3にアップロードする

AWSのストレージサービスS3にvmdkをアップロードします。
vmdkは既に手元にあることを前提とします。ESXiでは対象の仮想サーバ上で右クリックしてエクスポートすればvmdkファイルを入手できます。
S3には、Web画面でドラッグ&ドロップでアップロードできますので、GUIで操作できます。
アップロードをクリックし、ファイルを選択してアップロードボタンを押してアップロードします。

「s3://backet/test.vmdk」のような、s3のURIを控えておきます。
コマンドで、S3のURIを指定してスナップショットへ移行するためです。

M1 macでaws consoleを利用できるようにする

Macでは、以下のようにterminalに入力し、aws consoleを使えるようにインストールします。

brew install awscli
aws configure

AWS Access Key ID とAWS Secret Access KeyやDefault region nameを設定します。
Access Key IDとSecret Access Keyの入手方法は、AWSのWeb画面にて、IAMの画面でユーザを選択し、認証情報タブで、アクセスキーの作成をクリックすると作成できます。

vmimportロールとしてIAMの設定を行う

AWSにvmdkをインポートできるロールを作成します。
trust-policy.jsonファイルを作成し、aws conwoleコマンドでポリシーを作成します。

trust-policy.jsonファイルをviコマンドで作成します。

vi trust-policy.json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}

vmimportというロールを作ります。

aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json

ポリシーを作り、ロールをアタッチします。

viコマンドでrole-policy.jsonを作成します。

vi role-policy.json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource": [
            "arn:aws:s3:::[自身のバケット名]"
         ]
      },
      {
         "Effect": "Allow",
         "Action": [
            "s3:GetObject"
         ],
         "Resource": [
            "arn:aws:s3:::[自身のバケット名]/*"
         ]
      },
      {
         "Effect": "Allow",
         "Action":[
            "ec2:ModifySnapshotAttribute",
            "ec2:CopySnapshot",
            "ec2:RegisterImage",
            "ec2:Describe*"
         ],
         "Resource": "*"
      }
   ]
}

AWS Consoleのコマンドでロールにvmimportポリシーに紐づけます。

aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json

S3のvmdkファイルをスナップショットの領域へコンバートする

asw consoleコマンドに持たせるjsonファイルを作成します。containers.jsonファイルを作成します。

vi containers.json
{
    "Description": "test.vmdk",
    "Format": "VMDK",
    "UserBucket": {
        "S3Bucket": "[自身のバケット名]",
        "S3Key": "[指定するファイル名].vmdk"
    }
}

containers.jsonを読み込むaws consoleコマンドを実行します。

aws ec2 import-snapshot --description "test.vmdk" --disk-container "file://containers.json"

以下のような実行結果が出ます。

{
    "Description": "test.vmdk",
    "ImportTaskId": "import-snap-xxxxxxxx",
    "SnapshotTaskDetail": {
        "Description": "test.vmdk",
        "DiskImageSize": 0.0,
        "Progress": "0",
        "Status": "active",
        "StatusMessage": "pending",
        "UserBucket": {
            "S3Bucket": "[自身のバケット名]",
            "S3Key": "[指定するファイル名].vmdk"
        }
    },
    "Tags": []
}

describe-import-snapshot-tasksコマンドで、タスクの進行状況を確認でき、Statusが「completed」になれば成功です。

aws ec2 describe-import-snapshot-tasks --import-task-ids import-snap-xxxxxxxx
{
    "ImportSnapshotTasks": [
        {
            "Description": "test.vmdk",
            "ImportTaskId": "import-snap-xxxxxxxx",
            "SnapshotTaskDetail": {
                "Description": "test.vmdk",
                "DiskImageSize": 1069001216.0,
                "Format": "VMDK",
                "SnapshotId": "snap-xxxxxxxx",
                "Status": "completed",
                "UserBucket": {
                    "S3Bucket": "[自身のバケット名]",
                    "S3Key": "[指定するファイル名].vmdk"
                }
            },
            "Tags": []
        }
    ]
}

スナップショットからイメージを作り自分のAMIを作る

スナップショットとして、AWSに取り込めれば、残りはGUI環境で操作して対応できます。

Elastic Block Storeのスナップショットを開くと、登録したスナップショットがあります。
選択して確認しましょう。

[スナップショットからイメージを作成]を選択します。

イメージ名やアーキテクチャを選択して、イメージを作成します。
今回はtestというイメージ名で作成しました。

ここまでで自分のAMIを作成できました。
EC2の起動は通常通りですので、「自分のAMI」より作成したAMIイメージを選択して、インスタンスタイプ等選択して、ご自由にサーバを立てられますね。

終わりに

この記事では自前のVMDKファイルをスナップショットへコンバートし、自身のAMIイメージを作成してEC2サーバを建てる方法をご紹介しました。これでvmdkファイルをAWS上に移行することも試せます。他の方法でエラーが発生していて上手くいかない方は、是非スナップショットから自身のAMIイメージを作成する方法をお試しください。