AWS

VM ImportでVMwareの仮想サーバイメージをインポートしてみた

はじめに

こんにちは、ディーネットの山田です。

長らくAWSを利用しておりますが、VM Import機能を使ってオンプレで稼働している仮想マシンをインポートしたことがなかったので、触ってみました。

VM Import機能を一言で表すと、VMware ESXやHyper-Vなどの仮想化基盤上で稼働している仮想マシンをEC2 AMIに変換するサービスとなります。

EC2 AMIに変換された後は、実際にEC2として稼働させて利用することができます。

VM Import/Export

前提条件

  • 今回の検証では、VMware ESXi環境上で稼働している稼働マシンをインポートしました。

  • 仮想マシンのインポートには、パワーオフが必須でしたのでパワーオフした状態でVMware ESXi環境からエクスポートしています。

  • IAMに必要なロールが無ければ、ロールを作成してください。

    VM を Amazon にインポートするための前提条件 EC2

  • 操作は、全て AWS CloudShell で実行しました。

作業の流れ

  1. VMware ESXi環境から仮想マシンをエクスポート
  2. Amazon S3へエクスポートしたデータをアップロード
  3. AWS CLIを利用して、イメージとして仮想マシンをインポート
  4. インポートタスクの状況確認

作業手順

1. 仮想マシンをエクスポート

仮想マシンのエクスポート方法については、各仮想化基盤のマニュアルをご確認ください。

2. Amazon S3へアップロード

任意のS3バケットを作成して、エクスポートした仮想マシンのイメージをアップロードしてください。

3. IAMロールを作成

VMImportに必要なIAMロールを作成してください。

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

$ aws iam create-role --role-name vmimport --assume-role-policy-document "file://trust-policy.json"
#-----
{
    "Role": {
        "Path": "/",
        "RoleName": "vmimport",
        "RoleId": "AROAEXAMPLE123456789",
        "Arn": "arn:aws:iam::123456789012:role/vmimport",
        "CreateDate": "2024-09-04T01:02:48+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "vmie.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole",
                    "Condition": {
                        "StringEquals": {
                            "sts:Externalid": "vmimport"
                        }
                    }
                }
            ]
        }
    }
}
#-----

$ vi role-policy.json
#-----
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect": "Allow",
         "Action": [
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket" 
         ],
         "Resource": [
            "arn:aws:s3:::20240904denetvmimport",
            "arn:aws:s3:::20240904denetvmimport/*"
         ]
      },
      {
         "Effect": "Allow",
         "Action": [
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket",
            "s3:PutObject",
            "s3:GetBucketAcl"
         ],
         "Resource": [
            "arn:aws:s3:::20240904denetvmimport",
            "arn:aws:s3:::20240904denetvmimport/*"
         ]
      },
      {
         "Effect": "Allow",
         "Action": [
            "ec2:ModifySnapshotAttribute",
            "ec2:CopySnapshot",
            "ec2:RegisterImage",
            "ec2:Describe*"
         ],
         "Resource": "*"
      }
   ]
}
#-----

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

4. AWS CLIを使って、vmimportを実施

vmimportに必要な、JSONファイルを作成して、AWS CLIからインポート処理を実施してください。

ステータスが全て"completed"になれば、AWSへのインポートが完了しています。

$ vi containers.json 
#-----
[
  {
    "Description": "First disk",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "20240904denetvmimport",
        "S3Key": "YAMADA_172.16.20.125/YAMADA_172.16.20.125-1.vmdk"
    }
  }
]
#-----

$ aws ec2 import-image --description "YAMADA_172.16.20.125" --disk-containers "file://containers.json"
#-----
{
    "Description": "YAMADA_172.16.20.125",
    "ImportTaskId": "import-ami-1234567890abcdef0",
    "Progress": "1",
    "SnapshotDetails": [
        {
            "Description": "First disk",
            "DiskImageSize": 0.0,
            "Format": "VMDK",
            "UserBucket": {
                "S3Bucket": "20240904denetvmimport",
                "S3Key": "YAMADA_172.16.20.125/YAMADA_172.16.20.125-1.vmdk"
            }
        }
    ],
    "Status": "active",
    "StatusMessage": "pending"
}
#-----

5. AWS CLIを使って、vmimportの状況確認

vmimportタスクを実行した際に付与される、IDを使うことで現在のインポート状況が確認できます。

$ aws ec2 describe-import-image-tasks --import-task-ids import-ami-1234567890abcdef0
#-----
{
    "ImportImageTasks": [
        {
            "Description": "YAMADA_172.16.20.125",
            "ImportTaskId": "import-ami-1234567890abcdef0",
            "Progress": "19",
            "SnapshotDetails": [
                {
                    "DiskImageSize": 1624825856.0,
                    "Status": "completed"
                }
            ],
            "Status": "active",
            "StatusMessage": "converting",
            "Tags": []
        }
    ]
}
#-----

$ aws ec2 describe-import-image-tasks --import-task-ids import-ami-1234567890abcdef0
#-----
{
    "ImportImageTasks": [
        {
            "Description": "YAMADA_172.16.20.125",
            "ImportTaskId": "import-ami-1234567890abcdef0",
            "Progress": "20",
            "SnapshotDetails": [
                {
                    "Description": "First disk",
                    "DiskImageSize": 1624825856.0,
                    "Format": "VMDK",
                    "Status": "completed",
                    "UserBucket": {
                        "S3Bucket": "20240904denetvmimport",
                        "S3Key": "YAMADA_172.16.20.125/YAMADA_172.16.20.125-1.vmdk"
                    }
                }
            ],
            "Status": "active",
            "StatusMessage": "updating",
            "Tags": []
        }
    ]
}
#-----

$ aws ec2 describe-import-image-tasks --import-task-ids import-ami-1234567890abcdef0
#-----
{
    "ImportImageTasks": [
        {
            "Architecture": "x86_64",
            "Description": "YAMADA_172.16.20.125",
            "ImageId": "ami-1234567890abcdef0",
            "ImportTaskId": "import-ami-1234567890abcdef0",
            "LicenseType": "BYOL",
            "Platform": "Linux",
            "SnapshotDetails": [
                {
                    "Description": "First disk",
                    "DeviceName": "/dev/sda1",
                    "DiskImageSize": 1624825856.0,
                    "Format": "VMDK",
                    "SnapshotId": "snap-1234567890abcdef0",
                    "Status": "completed",
                    "UserBucket": {
                        "S3Bucket": "20240904denetvmimport",
                        "S3Key": "YAMADA_172.16.20.125/YAMADA_172.16.20.125-1.vmdk"
                    }
                }
            ],
            "Status": "completed",
            "Tags": []
        }
    ]
}
#-----

6. AWS マネジメントコンソールを使って、スナップショットとAMIの確認

AWSマネジメントコンソール上から、スナップショットとAMIが作成されていることを確認します。

  • スナップショットが作成されたことを確認

  • AMIが作成されたことを確認

まとめ

  • VM Import機能を使って、VMware ESXi の仮想マシンをEC2 AMI化することができました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA