はじめまして、インフラチームの 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
