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

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


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

参考までに、以下のキャプチャがわかりやすくまとまっているので、貼っときます。
※出典元：https://dev.classmethod.jp/cloud/aws/vm-import-image-import/
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/515fe1a9-b423-be86-997b-0e2660c6aa11.png)


#(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にどんどんあげていこうと思う。