目次
はじめに
こんにちは、ディーネットの山田です。
長らくAWSを利用しておりますが、VM Import機能を使ってオンプレで稼働している仮想マシンをインポートしたことがなかったので、触ってみました。
VM Import機能を一言で表すと、VMware ESXやHyper-Vなどの仮想化基盤上で稼働している仮想マシンをEC2 AMIに変換するサービスとなります。
EC2 AMIに変換された後は、実際にEC2として稼働させて利用することができます。
前提条件
-
今回の検証では、VMware ESXi環境上で稼働している稼働マシンをインポートしました。
-
仮想マシンのインポートには、パワーオフが必須でしたのでパワーオフした状態でVMware ESXi環境からエクスポートしています。
-
IAMに必要なロールが無ければ、ロールを作成してください。
-
操作は、全て AWS CloudShell で実行しました。
作業の流れ
- VMware ESXi環境から仮想マシンをエクスポート
- Amazon S3へエクスポートしたデータをアップロード
- AWS CLIを利用して、イメージとして仮想マシンをインポート
- インポートタスクの状況確認
作業手順
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化することができました。
プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。
LINK
クラウドベリージャム:プロフィールページ