
VMware 仮想マシンを Amazon EC2 にインポートした話
-
2021年1月26日
はじめまして、インフラチームの 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