AWS VM Import を試してみる

  • 2019.11.05
  • AWS
AWS VM Import を試してみる

はじめに

VMの仮想マシンをAWSに取り込む方法としてVM Importという機能があります。これを今回は試してみたいと思います。ライセンスがなんやかんやとうるさそうなので、CentOS7 64bitを使って試します。これならフリーですから。

テスト用CentOS7の構築

まずはESXi6.5上にテスト用のCentOS7を構築しました。確認用にテストファイルを作成しておきます。

OVFテンプレートのエクスポート

それでは構築した仮想マシンからOVFテンプレートをエクスポートします。OVFテンプレートをエクスポートするには仮想マシンをシャットダウンしておく必要があります。

しばらくすると次の4つのファイルがダウンロードされます。

S3へファイルのアップロード

先ほどダウンロードした4つのファイルの中からvmdkファイルのみS3にアップロードします。今回は専用のバケットを作成しました。

ロールの作成

S3からイメージファイルのダウンロードをしたりする必要があるためロールを作成します。

次のような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": "AROAUC6VD3XAAD52A32TI",
        "Arn": "arn:aws:iam::281230433728:role/vmimport",
        "CreateDate": "2019-11-05T07:26:59Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "vmie.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole",
                    "Condition": {
                        "StringEquals": {
                            "sts:Externalid": "vmimport"
                        }
                    }
                }
            ]
        }
    }
}

次に作成したロールにポリシーをアタッチします。次のようなJSONファイルを作成してください。ここのwaku-nagoya-vm-import-testはS3のバケット名です。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket" 
         ],
         "Resource":[
            "arn:aws:s3:::waku-nagoya-vm-import-test",
            "arn:aws:s3:::waku-nagoya-vm-import-test/*"
         ]
      },
      {
         "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

VM Import

次のコマンドでVM Importを開始します。

まずは次のようなJSONファイルを作成してください。S3BucketはS3のバケット名、S3Keyはvmdkのファイル名です。

[
  {
    "Description": "My Server OVA",
    "Format": "vmdk",
    "UserBucket": {
        "S3Bucket": "waku-nagoya-vm-import-test",
        "S3Key": "centos7-1.vmdk"
    }
}]

次のコマンドでインポートを開始します。

$ aws ec2 import-image --description "My server VM" --disk-containers file://vmimport.json
{
    "Description": "My server VM",
    "ImportTaskId": "import-ami-0a938f000edf790f6",
    "Progress": "2",
    "SnapshotDetails": [
        {
            "DiskImageSize": 0.0,
            "Format": "VMDK",
            "UserBucket": {
                "S3Bucket": "waku-nagoya-vm-import-test",
                "S3Key": "centos7-1.vmdk"
            }
        }
    ],
    "Status": "active",
    "StatusMessage": "pending"
}

次のコマンドで進行状況を確認できます。

$ aws ec2 describe-import-image-tasks --import-task-ids import-ami-0a938f000edf790f6
{
    "ImportImageTasks": [
        {
            "Description": "My server VM",
            "ImportTaskId": "import-ami-0a938f000edf790f6",
            "Progress": "28",
            "SnapshotDetails": [
                {
                    "Description": "My Server OVA",
                    "DiskImageSize": 634796032.0,
                    "Format": "VMDK",
                    "Status": "completed",
                    "UserBucket": {
                        "S3Bucket": "waku-nagoya-vm-import-test",
                        "S3Key": "centos7-1.vmdk"
                    }
                }
            ],
            "Status": "active",
            "StatusMessage": "converting"
        }
    ]
}

28%となっています。現在は変換中のようです。

$ aws ec2 describe-import-image-tasks --import-task-ids import-ami-0a938f000edf790f6
{
    "ImportImageTasks": [
        {
            "Architecture": "x86_64",
            "Description": "My server VM",
            "ImportTaskId": "import-ami-0a938f000edf790f6",
            "LicenseType": "BYOL",
            "Platform": "Linux",
            "Progress": "69",
            "SnapshotDetails": [
                {
                    "Description": "My Server OVA",
                    "DeviceName": "/dev/sda1",
                    "DiskImageSize": 634796032.0,
                    "Format": "VMDK",
                    "Status": "completed",
                    "UserBucket": {
                        "S3Bucket": "waku-nagoya-vm-import-test",
                        "S3Key": "centos7-1.vmdk"
                    }
                }
            ],
            "Status": "active",
            "StatusMessage": "booted"
        }
    ]
}

起動完了です。でもよく見るとまだ69%でした。焦らない焦らない。

$ aws ec2 describe-import-image-tasks --import-task-ids import-ami-0a938f000edf790f6
{
    "ImportImageTasks": [
        {
            "Architecture": "x86_64",
            "Description": "My server VM",
            "ImageId": "ami-0ff0cd74bae6291d6",
            "ImportTaskId": "import-ami-0a938f000edf790f6",
            "LicenseType": "BYOL",
            "Platform": "Linux",
            "SnapshotDetails": [
                {
                    "Description": "My Server OVA",
                    "DeviceName": "/dev/sda1",
                    "DiskImageSize": 634796032.0,
                    "Format": "VMDK",
                    "SnapshotId": "snap-07fe133b417fdd7f3",
                    "Status": "completed",
                    "UserBucket": {
                        "S3Bucket": "waku-nagoya-vm-import-test",
                        "S3Key": "centos7-1.vmdk"
                    }
                }
            ],
            "Status": "completed"
        }
    ]
}

これでやっと完了です。

AMIの起動

作成したAMIを起動してみます。

起動したCentOS7の動作確認

それでは起動したCentOS7の動作確認をしてみます。

$ ssh -i $key root@ec2-hoge.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-hoge.ap-northeast-1.compute.amazonaws.com (hoge)' can't be established.
ECDSA key fingerprint is SHA256:hoge.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-hoge.ap-northeast-1.compute.amazonaws.com,hoge' (ECDSA) to the list of known hosts.
root@ec2-hoge.ap-northeast-1.compute.amazonaws.com's password: 
Last login: Tue Nov  5 15:10:54 2019
[root@ip-hoge ~]# ls
anaconda-ks.cfg  test.txt
[root@ip-hoge ~]# cat test.txt
VM Import test

正常に動作しています!

念のため(お金の節約の意味も込めて)、今回作成したS3のバケットと、EC2インスタンス、IAMロールを削除しておきます。

最初、VM Importを始める前に心配だったのがVMの大きなイメージファイルをアップロードしてお金が結構かかるのでは?と思っていたのですが、今回の634MB程度のイメージファイルなら無料利用枠で十分利用できました。