VMware 仮想マシンを Amazon EC2 にインポートした話

はじめまして、インフラチームの S です。
今回は VMware 仮想マシンを Amazon EC2 にインポートして起動できた経験を紹介したいと思います。

概要

ある案件対応で、先方から開発環境の VMware 仮想マシンファイル(.ovf / .vmdk)をもらいました。社内 VMware(ESXi)環境で仮想マシンを復元する予定でしたが、ココネでは VMware 環境を持っていませんでした。

VMware 公式サイトから ESXi の iso ファイルをダウンロードして、社内の既存デスクトップ PC に構築しようとした時に、ハードウェア認識できず(ESXiのハードウェア要件に合わなかったかも)色々試しましたが、ハマりました。

一方、VMware 仮装マシンを Amazon EC2 に移行する方法を調べてみたところ、AWS VM Import サービスを見つけました。
そこで、このサービスを利用して vmdk ファイルを AWS AMI にインポートしてみることにしました。

 

構成

今回は前述の通り、AWS を利用します。

 

準備

1.利用している AWS IAM ユーザのポリシーに次のアクセス許可を設定(権限を持っている場合は設定不要)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:CreateBucket",
                "s3:DeleteBucket",
                "s3:DeleteObject",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CancelConversionTask",
                "ec2:CancelExportTask",
                "ec2:CreateImage",
                "ec2:CreateInstanceExportTask",
                "ec2:CreateTags",
                "ec2:DeleteTags",
                "ec2:DescribeConversionTasks",
                "ec2:DescribeExportTasks",
                "ec2:DescribeExportImageTasks",
                "ec2:DescribeImages",
                "ec2:DescribeInstanceAttribute",
                "ec2:DescribeInstanceStatus",
                "ec2:DescribeInstances",
                "ec2:DescribeSnapshots",
                "ec2:DescribeTags",
                "ec2:ExportImage",
                "ec2:ImportInstance",
                "ec2:ImportVolume",
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:TerminateInstances",
                "ec2:ImportImage",
                "ec2:ImportSnapshot",
                "ec2:DescribeImportImageTasks",
                "ec2:DescribeImportSnapshotTasks",
                "ec2:CancelImportTask"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:GenerateCredentialReport",
                "iam:GenerateServiceLastAccessedDetails",
                "iam:Get*",
                "iam:List*",
                "iam:CreateRole",
                "iam:CreatePolicy",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "iam:SimulateCustomPolicy",
                "iam:SimulatePrincipalPolicy"
            ],
            "Resource": "*"
        }
    ]
}

 

2.臨時用S3バケット(cocone-test01)を作成し、中にフォルダ vmware を作成

3.VMware 仮想ファイルを S3 へアップロード(バケット:cocone-test01)

$ aws s3 cp testvm-disk1.vmdk s3://cocone-test01/vmware/

vmdk は大容量のファイルですが、aws s3 cp コマンドは自動的にマルチパートアップロードを実行するため、問題なくアップロードできます。

これで準備が完了しました。

移行手順

1.VM Importに許可するサービスロール(vmimport)の作成

1. 1. ローカルPCにロール作成用JSONファイル(trust-policy.json)を用意

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

1. 2. CLIコマンドで vmimport という名前のロールを作成

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

1. 3. vmimport ロールのポリシー作成用JSONファイル(role-policy.json)を用意

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetBucketAcl"
            ],
            "Resource": [
                "arn:aws:s3:::cocone-test01",
                "arn:aws:s3:::cocone-test01/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:ModifySnapshotAttribute",
                "ec2:CopySnapshot",
                "ec2:RegisterImage",
                "ec2:Describe*",
                "kms:CreateGrant",
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:Encrypt",
                "kms:GenerateDataKey*",
                "kms:ReEncrypt*"
            ],
            "Resource": "*"
        }
    ]
}

1. 4. CLI コマンドで vmimport ロールにポリシーをアタッチ

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

2.VM 仮想ファイルを AWS マシンイメージ(AMI)にインポート

2. 1. インポートする各種パラメータを定義したファイル containers.json を作成

[
  {
    "Description": "First disk",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "cocone-test01",
        "S3Key": "vmware/testvm-disk1.vmdk"
    }
  },
  {
    "Description": "Second disk",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "cocone-test01",
        "S3Key": "vmware/testvm-disk2.vmdk"
    }
  }         
]

2. 2. CLI コマンドでイメージインポートタスクを作成

$ aws ec2 import-image --description "testvm-disks" --disk-containers "file://./containers.json"

タスクが完了するまで時間がかかりますが、describe-import-image-tasks コマンドでイメージインポートのステータスを確認できます。

$ aws ec2 describe-import-image-tasks --import-task-ids ImportTaskId

ImportTaskId は import-image 実行時に返ってきたものを使用します。

ステータスが completed になれば完了です。これで、AMI  が使えるようになります。

 

3.EC2 インスタンスの立ち上げ

AWS コンソールから上記できた AMI を使って、EC2 インスタンスを起動します。

 

最後に

VM Importを使用して、低コストで手軽に VMware 仮想マシンのファイルを AMIに インポートできるのはすごく魅力で、楽でした!

正直、今はコンテナの時代なので、Docker か Kubernetes を利用している方が多いと思います。コンテナイメージを使って、AWS に簡単に移してアプリケーションを立ち上げられますが、VMware仮想マシンをAWSに移行する場合は、ちょっと手間がかかりますね。

本記事がどこかでお役に立てれば幸いです。

 

参考
https://docs.aws.amazon.com/vm-import/latest/userguide/vmie_prereqs.html

Category

Tag