月別アーカイブ: 2016年4月

VM Import/ExportにてAMIイメージ作成

花粉のシーズンも過ぎだいぶ楽になってきました。こんにちはhatです。
VMWareのESXi上で作成された仮想マシンをAWSに移行する機会があり、その際に利用したVM Import/Exportの内容について備忘録を兼ねてまとめてみました。

注意事項

一部対応していないOSのバージョンがありますので、対象のバージョンがありますので作業前に公式サイトにて確認の上実施してください。

作業準備

作業するにあたり、下記の準備が終わっていることを前提として話をしていきます。

  • AWS CLIがインストール済みであること
  • インポート用のvmdkファイルの準備できていること

S3バケットの作成とファイルアップロード

まずは準備したvmdkファイルのアップロード先のバケットを作成します。

aws s3 mb s3://<任意のバケット名>

コマンド例) aws s3 mb s3://vm-import-tmp

 

続いて作成したバケットにファイルをアップロードします。
標準出力でアップロードの進捗が表示されるので完了するまで待ちます。

aws s3 cp <vmdk名> s3://<作成したバケット名>

コマンド例) aws s3 cp /tmp/CentOS6.1_disk1.vmdk s3://vm-import-tmp

 

VMImport用にサービスロールの作成

続いてインポート実行できるようにするためにポリシーを作成し権限を与えます。
詳しくは公式のサイト(http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/VMImportPrerequisites.html)の中盤くらいに記述がありますので、ご確認いただければと思います。

VM Import では、実行に AWS アカウントのロールが使用されます。
vmimport という名前のロールを作成する必要があります。
ポリシーを定義した trust-policy.json という名前のファイルを作成していきます。
以下準備するtrust-policy.jsonファイルの内容は、変更箇所はないのでそのまま記述します。

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

 

上記のファイルを利用し、vmimportに権限を与えます。

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

 

続いてrole-policy.json という名前のファイルを作成します。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource":[
            "arn:aws:s3:::<ディスクイメージを配置したS3のバケット名>"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObject"
         ],
         "Resource":[
            "arn:aws:s3:::<ディスクイメージを配置したS3のバケット名>/*"
         ]
      },
      {
         "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

 

IAMユーザーとしてログインしている場合、IAM ポリシーに下記のアクセス許可が必要となるため設定をします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:CreateBucket",
        "s3:DeleteBucket",
        "s3:DeleteObject",
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Resource": ["arn:aws:s3:::<ディスクイメージを配置したS3のバケット名>","arn:aws:s3:::<ディスクイメージを配置したS3のバケット名>/*"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CancelConversionTask",
        "ec2:CancelExportTask",
        "ec2:CreateImage",
        "ec2:CreateInstanceExportTask",
        "ec2:CreateTags",
        "ec2:DeleteTags",
        "ec2:DescribeConversionTasks",
        "ec2:DescribeExportTasks",
        "ec2:DescribeInstanceAttribute",
        "ec2:DescribeInstanceStatus",
        "ec2:DescribeInstances",
        "ec2:DescribeTags",
        "ec2:ImportInstance",
        "ec2:ImportVolume",
        "ec2:StartInstances",
        "ec2:StopInstances",
        "ec2:TerminateInstances",
        "ec2:ImportImage",
        "ec2:ImportSnapshot",
        "ec2:DescribeImportImageTasks",
        "ec2:DescribeImportSnapshotTasks",
        "ec2:CancelImportTask"
      ],
      "Resource": "*"
    }
  ]
}

Import-Imageの実行

イメージをインポートするための設定ファイルを作成します。
ここでは、params.jsonという名でファイルを準備します。
必要最低限の設定のみ記載しています。

{
    "Description": "vm-import",
    "DiskContainers": [
        {
            "Description": "vm-import",
            "UserBucket": {
                "S3Bucket": "<ディスクイメージを配置したS3のバケット名>",
                "S3Key": "<vmdk名>"
            }
        }
    ]
}

 

下記コマンドにてインポート実施します。

aws ec2 import-image --cli-input-json file://./params.json

すると下記のような出力が表示されます。

{
    "Status": "active",
    "Description": "vm-import",
    "Progress": "2",
    "SnapshotDetails": [
        {
            "UserBucket": {
                "S3Bucket": "<ディスクイメージを配置したS3のバケット名>",
                "S3Key": "<vmdk名>"
            },
            "DiskImageSize": 0.0
        }
    ],
    "StatusMessage": "pending",
    "ImportTaskId": "<払い出されたID>"
}

 

コマンド実施後標準出力には進捗状況がわかりませんので、
逐次以下のコマンドにて状況を確認してください。

aws ec2 describe-import-image-tasks --import-task-ids <払い出されたID>
{
    "ImportImageTasks": [
        {
            "Status": "completed",   ---->★完了するとこの状態に
            "LicenseType": "BYOL",
            "Description": "vm-import",
            "ImageId": "ami-******",
            "Platform": "Linux",
            "Architecture": "x86_64",
            "SnapshotDetails": [
                {
                    "DeviceName": "/dev/sda1",
                    "Description": "",
                    "Format": "VMDK",
                    "DiskImageSize": 5251216896.0,
                    "SnapshotId": "******",
                    "UserBucket": {
                        "S3Bucket": "<ディスクイメージを配置したS3のバケット名>",
                        "S3Key": "<vmdk名>"
                    }
                }
            ],
            "ImportTaskId": "<払い出されたID>"
        }
    ]
}

AWSコンソールにログインし、EC2->イメージ->AMIを確認してみてください。
イメージが作成されていることが確認できます。
現状ではAMIイメージを作成し終わった状態ですので、実際に利用する場合は
イメージからEC2インスタンス作成してください。

まとめ

以上が作業の流れとなります。事前準備について時間がかかりましたが、
準備後に実施するコマンドはそう多くありません。比較的簡単にできますので、
触れたことない方は実践してみてはいかがでしょうか。