VM Import/Export を使用して Amazon マシンイメージ (AMI) に基づいて VM をエクスポートするにはどうすればよいですか?

最終更新日: 2021 年 3 月 3 日

Amazon マシンイメージ (AMI) のコピーを仮想マシン (VM) としてエクスポートして、オンサイトの仮想化環境にデプロイしたいと考えています。VM Import/Export での作成方法を教えてください。

簡単な説明

AWS Command Line Interface (AWS CLI) を使用して、VM Import/Export でイメージのエクスポートタスクを開始できます。次に、Amazon マシンイメージ (AMI) のコピーが VM ファイルとしてエクスポートされ、Amazon Simple Storage Service (Amazon S3) バケットに書き込まれます。エクスポートされた VM を使用して、新しい標準化されたインスタンスをオンサイト仮想化環境にデプロイできます。ほとんどの AMI は、Citrix Xen、Microsoft Hyper-V、または VMware vSphere にエクスポートできます。

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

次の解決手順を開始する前に、次の手順を実行します。

解決方法

1.    エクスポートする EC2 インスタンスから Amazon Elastic Block Store (Amazon EBS) backed AMI を作成します。

Linux の場合、「Amazon EBS-backed Linux AMI の作成」を参照してください。

Windows の場合、「カスタム Windows AMI の作成」を参照してください。

2.    クライアントマシンに AWS CLI をインストールし、IAM ユーザー用に生成された AWS 認証情報を使用して設定します。

3.    エクスポートする AMI と同じ AWS リージョンに新しい S3 バケットを作成します。

4.    必要なサービスロールを作成します。 前提条件として、VM Import/Export を使用するリージョンで AWS Security Token Service (AWS STS) を有効にしてください。

サービスロールを作成するには、まず trust-policy.json という名前のファイルをコンピュータ上に作成し、次に次のポリシーをファイルに追加します。

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

create-role コマンドを実行して、trust-policy.json ファイルを使用して vmimport という名前のロールを作成し、ロールに VM Import/Export アクセスを付与します。

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

注: 前の例では、作成した trust-policy.json ファイルの場所へのフルパスを指定してください。file:// の接頭辞を必ず含めてください。

コンピュータに role-policy.json という名前の別のファイルを作成し、ファイルに次のポリシーを追加します。my-export-bucket を S3 バケット名に置き換えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetBucketAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my-export-bucket",
                "arn:aws:s3:::my-export-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:ModifySnapshotAttribute",
                "ec2:CopySnapshot",
                "ec2:RegisterImage",
                "ec2:Describe*"
            ],
            "Resource": "*"
        }
    ]
}

put-role-policy コマンドを使用して、以前に作成した vmimport ロールに role-policy.json ポリシーをアタッチします。

aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file://C:\import\role-policy.json"

前の例では、role-policy.json ファイルの場所へのフルパスを指定してください。

注: VM Import/Export の今後の更新では、vmimport ロールに追加のアクセス許可が必要になる場合があります。必要なアクセス許可の最新の例については、必要なサービスロールのドキュメントにあるポリシーの例を参照してください。

5.    イメージのエクスポートタスクを開始するには、AWS CLI をインストールしたクライアントマシンから AWS CLI コマンド export-image を実行します

aws ec2 export-image --image-id ami-id --disk-image-format VMDK --s3-export-location S3Bucket=my-export-bucket,S3Prefix=exports/

注: 前の例では、ami-id をお客様の AMI ID に置き換えます。必要なディスクイメージ形式 (VMDK、RAW、または VHD) を選択します。my-export-bucket を S3 バケット名に置き換えます。エクスポートされたファイルは、S3 キー prefixexport-ami-id.format (例えば、my-export-bucket/exports/export-ami-1234567890abcdef0.vmdk) を使用して、指定された S3 バケットに書き込まれます。エクスポートされたファイルにプレフィックスを追加できます。

リクエストが成功すると、export-image コマンドの出力は、次の例に示すように、エクスポートイメージタスク ID を含むタスクの詳細を返します。

{
    "DiskImageFormat": "vmdk",
    "ExportImageTaskId": "export-ami-1234567890abcdef0"
    "ImageId": "ami-1234567890abcdef1",
    "RoleName": "vmimport",
    "Progress": "0",
    "S3ExportLocation": {
        "S3Bucket": "my-export-bucket",
        "S3Prefix": "exports/"
    },
    "Status": "active",
    "StatusMessage": "validating"
}

6.    イメージエクスポートタスクのステータスを確認するには、AWS CLI コマンド describe-export-image-tasks を実行します

aws ec2 describe-export-image-tasks --export-image-task-id export-ami-id

注: 前の例では、export-ami-idexport-image コマンドの出力からのエクスポートイメージタスク ID に置き換えます。

describe-export-image-tasks コマンドの出力は、タスクの進行状況と全体的なステータスに関する詳細を返します。次の出力例は、アクティブステータスで進行中のイメージエクスポートタスクの出力です。

{
    "ExportImageTasks": [
        {
            "ExportImageTaskId": "export-ami-1234567890abcdef0"
            "Progress": "21",
            "S3ExportLocation": {
                "S3Bucket": "my-export-bucket",
                "S3Prefix": "exports/"
            },
            "Status": "active",
            "StatusMessage": "updating"
        }
    ]
}

7.    エクスポートイメージタスクのステータスが [完了 (completed)] に変わると、エクスポートされたファイルは S3 バケットでオブジェクトとして準備されます。次の出力例は、完了したイメージエクスポートタスクを示しています。Amazon S3 でエクスポートされたファイルは、my-export-bucket/exports/export-ami-1234567890abcdef0.vmdk です。

{
    "ExportImageTasks": [
        {
            "ExportImageTaskId": "export-ami-1234567890abcdef0"
            "S3ExportLocation": {
                "S3Bucket": "my-export-bucket",
                "S3Prefix": "exports/"
            },
            "Status": "completed"
        }
    ]
}

8.    Amazon S3 コンソールを使用して S3 バケットにアクセスし、オブジェクトを見つけてダウンロードします。