VirtualBoxの仮想マシンをAWSに移行してみた


はじめに

本記事では、VirtualBoxで稼働中の仮想マシンをAWSに移行したので、その備忘録として書いたものです。
AWSの移行には、AWSサービス「VM Import」を使用する。
※今回の手順は、イメージをAMIに変換する手順です(import-image)。

VMimportの前提条件

・VMimportのサポート対象のOSであること。 ※今回は、「CentOS7.6」で実施するので、サポート対象である。
・VMimportの対象ファイルが、VMimportでサポートされていること。 ※今回は、VirtualBoxのイメージファイルの「OVAファイル」なのでサポート対象である。
・aws-cliの環境構築が完了していること。
※AWS-CLIは、これを参考にすれば構築できると思います。
・aws-cliの実行環境は、VirtualBoxで稼働中の「CentOS7.6」である。
・VMimportの対象OSで、Firewallが無効化されていること。
・(VMware VM の場合は、 VMware Toolsをアンインストールする必要がある )

参考までに、以下のキャプチャがわかりやすくまとまっているので、貼っときます。
※出典元:https://dev.classmethod.jp/cloud/aws/vm-import-image-import/

(1)VMimport実施用の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:::test-20191103",
                "arn:aws:s3:::test-20191103/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateRole",
                "iam:PutRolePolicy"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:ImportImage",
                "ec2:DescribeImportImageTasks",
                "ec2:CancelImportTask"
            ],
            "Resource": "*"
        }
    ]
}

※今回、テスト用で使用するS3バケットは「test-20191103」とする。

②AWS-CLI用のユーザに、ポリシーのアタッチをする。
③以下、コマンドを実施してS3バケットの一覧が表示されればOK

$ aws s3 ls

備考

今回、適用するIAMユーザのポリシーは以下の通りです。

項目 説明 許可範囲
s3:ListAllMyBuckets S3バケットの表示 全許可
s3:CreateBucket S3バケットの作成 S3バケット「test-20191103」のみ
s3:DeleteBucket S3バケットの削除 S3バケット「test-20191103」のみ
s3:DeleteObject S3バケット内のオブジェクトを削除 S3バケット「test-20191103」のみ
s3:GetBucketLocation S3バケットの置かれているリージョンを取得する S3バケット「test-20191103」のみ
s3:GetObject S3バケット内のオブジェクトを取得する S3バケット「test-20191103」のみ
s3:ListBucket S3バケットの中身の一覧を取得する S3バケット「test-20191103」のみ
s3:PutObject S3バケットにオブジェクトを追加する S3バケット「test-20191103」のみ
iam:CreateRole IAMロールの作成 全許可
iam:PutRolePolicy IAMロールのインラインアクセスの許可 全許可
ec2:ImportImage ボリュームのディスクイメージまたはEBSスナップショットをAmazon Machine Image(AMI)にインポートする 全許可
ec2:DescribeImportImageTasks インポートスナップショットのタスクを表示する 全許可
ec2:CancelImportTask インプロセス仮想マシンまたはスナップショットのインポートをキャンセルする 全許可

(2)テスト用のS3バケットを作成・仮想マシンのアップロード

(2.1)S3バケット作成

①S3バケット「test-20191103」を作成

$ aws s3 mb s3://test-20191103

②バケット作成後の確認

$ aws s3 ls

※バケットが作成されていればOK

(2.2)S3バケットに仮想マシンのイメージファイルをアップロード

①仮想マシンのイメージファイルをアップロード

$ aws s3 cp  /tmp/vmimpot/data/CentOS7.ova s3://test-20191103

※今回は、「/tmp/vmimpot/data/」に仮想マシンのイメージファイルがあることを前提に実施。

②アップロード後の確認

$ aws s3 ls s3://test-20191103

※データがアップロードされていればOK

(3)IAMロール作成・適用

(3.1)IAMロール作成

①作業ディレクトリを作成

$  sudo mkdir -p /tmp/vmimpot/json

②VMImportのIAMロールを定義

$ sudo vi /tmp/vmimpot/json/trust-policy.json
↓以下、項目を入力
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": { "Service": "vmie.amazonaws.com" },
         "Action": "sts:AssumeRole",
         "Condition": {
            "StringEquals":{
               "sts:Externalid": "vmimport"
            }
         }
      }
   ]
}

③VMImportのIAMロールを作成

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

(3.1)IAMロール インラインポリシーの適用

①IAMロール インラインポリシーを定義

$ sudo vi /tmp/vmimpot/json/role-policy.json
↓以下、項目を入力
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket" 
         ],
         "Resource":[
                "arn:aws:s3:::test-20191103",
                "arn:aws:s3:::test-20191103/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "ec2:ModifySnapshotAttribute",
            "ec2:CopySnapshot",
            "ec2:RegisterImage",
            "ec2:Describe*"
         ],
         "Resource":"*"
      }
   ]
}

②IAMロール インラインポリシーの適用

$ aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file:///tmp/vmimpot/json/role-policy.json"

VMimportの実施

①VMimportの定義ファイルを作成

$ sudo vi /tmp/vmimpot/json/containers.json
↓以下、項目を入力
[
  {
    "Description": "My Server OVA",
    "Format": "ova",
    "UserBucket": {
        "S3Bucket": "test-20191103",
        "S3Key": "CentOS7.ova"
    }
}]

②VMImport実施

$ aws ec2 import-image --description "My server VM" --disk-containers "file:///tmp/vmimpot/json/containers.json"

※上記コマンドの出力結果で「 "ImportTaskId": "import-ami-aaaaaaaaaaaaaaaaa"」のような項目が出力されるのでメモする。
★S3バケット「test-20191103」にあるOSイメージ「CentOS7.ova」をもとにAMIを生成する。

③VMimportの進捗確認

$ aws ec2 describe-import-image-tasks --import-task-ids import-ami-aaaaaaaaaaaaaaaaa

※「--import-task-ids」で、手順②で出力されたImportIDを指定

stautsで「completed」になれば、アップロードが完了する。(15~25分ぐらいかかる)

以下、stautsに表示される項目

出力項目 説明
active インポートタスクは進行中です。
deleting インポートタスクはキャンセルされています。
deleted インポートタスクはキャンセルされました。
updating インポートのステータスを更新しています。
validating インポートしたイメージを検証中です。
validated インポートしたイメージが検証されました。
converting インポートしたイメージを AMI に変換しています。
completed インポートタスクは完了し、AMI はすぐに使用できます。

④VMimportの事後処理
使用しないS3バケットを以下のコマンドで削除

$ aws s3 rb s3://test-20191103 --force

※イメージファイルをAMIに変換後、S3バケットとその中身を同時に削除する。※もういらないため
※検証用のS3バケットは、使い終わったらすぐ削除することを心掛ける!!(←自分に言い聞かせてる)

参考URL

https://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/vmie_prereqs.html
https://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/vmimport-image-import.html
https://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/vmimport-troubleshooting.html
http://iga-ninja.hatenablog.com/entry/2015/06/07/202208
https://dev.classmethod.jp/cloud/aws/vm-import-image-import/
http://blog.serverworks.co.jp/tech/2014/02/07/iam-ec2/
https://www.kabegiwablog.com/entry/2017/08/29/213104
https://www.kabegiwablog.com/entry/2017/08/30/192854

最後に

VirtualBoxの仮想マシンをAWSに移行できるのは、個人的には凄いと感じた。
昔、検証用で作ったやつとかをAWSにどんどんあげていこうと思う。