AWS Amazon EC2 VM Import(VMインポート)/VM Export(VMエクスポート)のAWS CLIを用いた実行方法・実行手順・実行例・実践例・コマンド例・サンプル

4月 6, 2017AWS,AWS CLI,EC2,IAM

AWSにおいてAmazon EC2を利用する場合、オンプレミスの仮想環境のVMをそのままAmazon EC2で移行して利用したいというニーズは多く発生すると思います。
最近のAmazon EC2ではWindowsだけではなくLinuxもVMインポート、VMエクスポートが可能になりオンプレミスからAWSへの移行やオンプレミスとAWSの双方を使用するハイブリッドクラウドにも柔軟に対応できるようになってきています。

Amazon EC2でVMインポート、VMエクスポートが可能なOS、プラットフォームや前提条件、制限事項については下記公式サイトを参考にしてください。
インスタンスのインポートとエクスポート

今回はVMインポート、VMエクスポートを実際にAWS CLIで行う方法の例を備忘録として記載しておきたいと思います。

AWS Amazon EC2 VM Import(VMインポート)/VM Export(VMエクスポート)のAWS CLIを用いた実行方法・実行手順・実行例・実践例・コマンド例・サンプル

VM Importの実行手順

VM Importの実行はおおまかに「VM Importを行うRoleの作成」「VM Importを行うRoleにポリシーを適用する」「VM ImportのAWS CLIコマンドを実行するユーザにポリシーを適用する」「VM ImportのAWS CLIコマンドを実行する」の手順で行います。

VM Importを行うRoleの作成

VM Importを行うRoleを設定するJSONファイルを作成します。

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

VM Importを行うRoleを設定するJSONファイルをAWS CLIコマンドで適用します。

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

VM Importを行うRoleにポリシーを適用する

VM Importを行うRoleにポリシーを適用するJSONファイルを作成します。

vim role-policy.json
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource":[
            "arn:aws:s3:::<インポートするVMイメージを配置したS3バケット名>"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObject"
         ],
         "Resource":[
            "arn:aws:s3:::<インポートするVMイメージを配置したS3バケット名>/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "ec2:ModifySnapshotAttribute",
            "ec2:CopySnapshot",
            "ec2:RegisterImage",
            "ec2:Describe*"
         ],
         "Resource":"*"
      }
   ]
}

VM Importを行うRoleにポリシーを適用するJSONファイルをAWS CLIコマンドで適用します。

aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json

VM ImportのAWS CLIコマンドを実行するユーザにポリシーを適用する

VM ImportのAWS CLIコマンドを実行するユーザにポリシーを適用するJSONファイルを作成し、このポリシーをaws ec2 import-imageコマンドを実行する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:::<インポートするVMイメージを配置したS3バケット名>","arn:aws:s3:::<インポートするVMイメージを配置した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": "*"
    }
  ]
}

VM ImportのAWS CLIコマンドを実行する

VM Importで用いるAWS CLIコマンドのJSONフォーマット
vim import-image.json
{
    "Description": "<VMイメージの詳細記述欄>", 
    "DiskContainers": [ 
        {
            "Description": "<ディスクコンテナタスクの詳細記述欄>", 
            "UserBucket": { 
                "S3Bucket": "<インポートするVMイメージを配置したS3バケット名>", 
                "S3Key" : "<インポートするVMイメージを配置したプレフィックス>" 
            }
        } 
    ]
}
VM Importで用いるAWS CLIコマンドのJSON例

s3://my-centos-image-import/CentOS.vmdk
S3バケットにインポートするVMイメージを上記のように配置した場合のJSONの例は下記のようになります。

{
    "Description": "CentOS VMDK", 
    "DiskContainers": [ 
        {
            "Description": "CentOS VM Import", 
            "UserBucket": { 
                "S3Bucket": "my-centos-image-import", 
                "S3Key" : "CentOS.vmdk" 
            }
        } 
    ]
}
VM Importで用いるAWS CLIコマンドの実行

上記で作成したJSONファイルを引数にAWS CLIコマンドを実行します。

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

※実行するIAMユーザにIP制限を付けているとエラーが発生します。
もしエラーが出て実行できない場合にはIAMユーザのポリシーからIP制限を解除して試して下さい。

VM Importの実行結果・インポート状況の進捗を確認する

aws ec2 import-imageコマンドのインポートの進捗状況は下記コマンドにて確認することができます。

aws ec2 describe-import-image-tasks

VM Exportの実行手順

VM Exportの実行はおおまかに「VM Exportでエクスポートしたイメージを保存するS3バケットのアクセス許可を追加する」「VM ExportのAWS CLIコマンドを実行する」の手順で行います。

VM Exportでエクスポートしたイメージを保存するS3バケットのアクセス許可を追加する

AWSマネジメントコンソールでVM Exportでエクスポートしたイメージを保存するS3バケットのアクセス許可を下記の内容で追加する
被付与者:vm-import-export@amazon.com
権限:「リスト」、「アップロード/削除」、「アクセス許可の表示」

VM ExportのAWS CLIコマンドを実行する

下記のフォーマットの要領でエクスポートするパラメタを指定してAWS CLIコマンドを実行します。

VM Exportで用いるAWS CLIコマンドのフォーマット
aws ec2 create-instance-export-task \
--description "<タスクの詳細記述欄>" \
--instance-id <エクスポートするインスタンスID> \
--target-environment <エクスポートする形式> \
--export-to-s3-task DiskImageFormat=<エクスポートするディスクフォーマット>,ContainerFormat=<エクスポートするコンテナフォーマット>,S3Bucket=<エクスポートするS3バケット名>,S3Prefix=<エクスポートするプレフィックス>
VM Exportで用いるAWS CLIコマンド例
aws ec2 create-instance-export-task \
--description "CentOS VM Export" \
--instance-id i-12345678 \
--target-environment vmware \
--export-to-s3-task DiskImageFormat=vmdk,ContainerFormat=ova,S3Bucket=my-centos-image-export,S3Prefix=CentOS

上記コマンドで実行されたエクスポートタスクIDがexport-i-abcdefghである場合出力ファイル名は下記のようになります。
出力ファイル名:CentOSexport-i-abcdefgh.ova
出力されるS3パス:s3://my-centos-image-export/CentOSexport-i-abcdefgh.ova

VM Exportの実行結果・エクスポート状況の進捗を確認する

aws ec2 create-instance-export-taskコマンドのエクスポートの進捗状況は下記コマンドにて確認することができます。

aws ec2 describe-export-tasks --output json
Reference: Tech Blog citing related sources