VM Importでイメージをインポート

記事タイトルとURLをコピーする

寒風の吹く日が増え、今年も残りわずかとなりました。皆様いかがお過ごしでしょうか。
技術4課の酒井です。

今回はVMImportのimport-imageについて書いていきたいとおもいます。
import-imageは従来のAmazon EC2 API Toolsを利用したVMImportと異なりEC2インスタンスは作成されません。

代わりに正常にタスクが完了するとAMIが作成されます。
あとは作成されたAMIからEC2インスタンスを作成し利用する形になります。
また、タスクの実行もAWS CLIを利用しての実行となり実行環境の作成も少し楽になりました。

今回はその方法を紹介したいと思います。

注意点

まず、はじめに注意点の紹介です。
便利なVM Importですがいくつか注意点や制約事項があります。
例えば、LinuxならSSH、WindowsならRDPを有効にしリモートアクセス可能な状態にした上でインポートする必要があります。

また、VMware Toolsがインストールされている環境であれば事前にアンインストールする必要もあります。

他にも、ゲストOSのIPアドレスをDHPCを利用せずホストに直接設定している場合はDHCPでIPアドレスを取得するようインポート前に設定しておく必要があるなど事前準備が非常に重要になります。

前提条件や制約事項、事前準備で必要なことはドキュメント(http://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/vmimport-image-import.html)にしっかり書いてありますので事前に読んでおきましょう。

AWS CLIのインストール

前提条件や制約事項の把握、事前準備が完了したらいよいよVM Importの実行です。
まずは、実行環境のOSに合わせてAWS CLIをインストールします。
インストールの方法やWindows版のインストーラーの配布は以下のリンク先に記載されていますのでご確認ください。

https://aws.amazon.com/jp/cli/

AWS CLIのセットアップ

AWS CLIを個人の端末やオンプレミスなサーバで利用するためにはIAMのクレデンシャル情報を設定する必要があります。
事前にIAMユーザを作成しクレデンシャルを発行しておきましょう。
また、今回の作業でIAMユーザに必要な権限は以下の4つです。

  • ec2:ImportImage
  • iam:CreateRole
  • iam:PutRolePolicy
  • s3:CreateBucket
  • s3:PutObject

AWS CLIのセットアップは以下のコマンドを実行することで対話型で設定できます。

aws configure
  1. アクセスキーの入力
  2. シークレットキーの入力
  3. デフォルトリージョンの設定(東京リージョンはap-northeast-1)
  4. 出力フォーマットの設定(デフォルトではJSON)

S3バケットの作成

イメージをアップロードするためのS3バケットを作成します。
既存のバケットにアップロードする場合はこの操作は必要ありません。

aws s3 mb s3://{Backet_Name}

インポート用のIAM Roleの作成

インポートタスクの中でS3に保管されているイメージファイルを読み込んだり、
AMI作成のためのスナップショットを作成したり、スナップショットをAMIとして利用するために登録するなど内部でAPIを実行しています。
そのAPIリクエストを行うためにvmimportという名前のIAM Roleを作る必要があります。

これも今回はAWS CLIを利用して作成します。

AWSCLIに渡すJSONファイルを作成

IAM Roleの信頼するエンティティはJSONで定義します。
今回は以下のような内容でファイル名をtrust-policy.jsonとして保存します。

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

コマンドを実行してRoleを作成

以下のコマンドを実行してIAM Roleを作成します。
この時に先ほど作ったtrust-policy.jsonのパスを指定して読み込ませます。

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

作成したロールにポリシーを設定

ロールが無事作成できたら今度はポリシーを設定します。

IAM RoleのポリシーをJSONで作成

ポリシーの設定もCLIを利用して適用します。
CLIで適用する際に以下の内容のポリシーを記載したJSONファイルを作成しコマンド実行時に読み込ませます。

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

ロールにポリシーをアタッチ

以下のコマンドを実行することでIAM Roleにポリシーがアタッチされます。

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

インポート作業

イメージをS3バケットにアップロード

イメージファイルをS3バケットにアップロードします。
イメージファイルのサイズは大きくなるのでマルチパートアップロードが可能なAWS CLIでアップロードすることをお勧めします。

aws s3 cp {IMAGEFILE_PATH} s3://{Backet_Name}

インポート用のJSONを作成

インポートコマンドを実行する際にディスクイメージのファイルがどんなフォーマットでどこのS3バケットに保存してあるのかを書いたJSONを読み込ませる必要があります。
そのJSONファイルを以下のような感じで作成します。

[
  {
    "Description": "First disk",
    "Format": "vhd",
    "UserBucket": {
        "S3Bucket": "{Backet_Name}",
        "S3Key": "{IMAGE_FILE_NAME}"
    }
  },
  {
    "Description": "Second disk",
    "Format": "vhd",
    "UserBucket": {
        "S3Bucket": "{Backet_Name}",
        "S3Key": "{IMAGE_FILE_NAME}"
    }
  }
]

"Format"の部分についてはvhdやova,VMDKなどアップロードしたディスクメージのフォーマットを記載してください。
今回の場合は以降元がHyper-Vなのでvhdとなっています。

インポートタスクの作成

以下のコマンドを実行します。

aws ec2 import-image --description "{HOST_NAME}" --disk-containers file://{HOST_NAME}.json

コマンドが成功すると以下のような結果がJSONで表示されます。

{
    "Status": "active",
    "Description": "hogehoge",
    "Progress": "2",
    "SnapshotDetails": [
        {
            "UserBucket": {
                "S3Bucket": "{Backet_Name}",
                "S3Key": "{IMAGE_FILE_NAME}"
            },
            "DiskImageSize": 0.0,
            "Format": "VHD"
        }
    ],
    "StatusMessage": "pending",
    "ImportTaskId": "import-ami-fugafuga"
}

タスクIDは後で進捗を確認する時に対象のタスクを絞り込むために利用するのでメモしておきましょう。

タスクの進捗確認

aws ec2 describe-import-image-tasks --import-task-ids {TASK_ID}

引数に先ほどメモしたタスクIDを渡すことで対象のタスクのみ確認可能
Statusがcompletedになれば完了です。

万が一エラーなどが出た場合は何かしらアップロードしたイメージがVM Importの前提条件にマッチしていないことが考えられます。
より詳細な調査が必要な場合はタスクIDを添えてAWSサポートへ調査を依頼する必要があります。

インポートしたインスタンスの起動

イメージのインポートが成功すると名前がタスクIDになったAMIが作成されます。
このAMIを利用しいつも通りにインスタンスを起動します。

起動完了後ログインを行い動作に問題ないことなど確認できましたら完了となります。

まとめ

前提条件や制約事項、事前準備がクリアできればインポートは比較的簡単に行えます。
また、インポート後もAMIとして作成されるのであとはいつものEC2インスタンスを作るのと同じ作業で展開できます。

VMImportをうまく活用して素早くAWSへ移行できるといいですね。