IDCFの500円クラウドからAWSに移行した話


これはIDCFクラウドからAWSにVMイメージを移植した記録である。
誰かこの手の記事を書いているかと思いきや意外と見つけられなかったので書くことにした。

# 背景
私はこれまでIDCFクラウドの一番安い1か月500円（税抜）のやつでVMを1個作っていろいろと利用させていただいていた。
だが、IDCFクラウド個人ユーザの皆様にはすでに通達が来ていると思うが、IDCFクラウドは2019年3月31日をもって個人利用はできなくなってしまう。
法人もしくは個人事業主じゃないとダメとのことだ。
IDCFに何があったのかは不明だが、追い出されるものは仕方がない。
ということで、今までIDCFクラウドで使っていたVMをAWS（1年間無料枠）に移行することにした。

# 移行手順
以下の順番で作業実施。
1. AWSを使う準備
2. IDCFクラウドからVMイメージエクスポート
3. AWS上でいろいろ準備
4. S3にイメージアップロード
5. 起動と動作確認

## AWSを使う準備

### アカウント作成
まずAWSアカウントを作成する。ググればすぐ出てくるとおもうので手順は省略。
クレカと携帯がアカウント作成に必要なのであらかじめ用意しておこう。

### AWS CLI利用の準備

作業でAWS CLI使うので、アクセスキーを取得する。
アカウント作成したらAWSにログインし、右上にあるユーザ名のところクリックして「セキュリティ認証情報」を選ぶ。「アクセスキー」で「新しいアクセスキーの作成」ボタンを押して、「アクセスキーID」と「セキュリティキー」をゲットする。
IAM作れとかいろいろ言われるけど、とりあえず気にしないことにする。セキュリティ設定は別の機会に強化しよう。
AWS CLIはpythonモジュールなので、クライアントPC内でpip使ってインストールする。
pythonを入れていない御仁は「Windows python インストール」とかググって適当に入れおいてほしい。

```
C:\Users\user>pip install awscli
C:\Users\user>aws --version
aws-cli/1.16.111 Python/3.6.6 Windows/10 botocore/1.12.101
```

ちなみに私のクライアント環境はWindows10だが、pythonをすでにインストール済みなのですんなり入った。
awscliがインストールされたら、アクセスキー設定を行う。
デフォルトリージョンはap-northeast-1（東京）にした。

```
C:\Users\user>aws configure
AWS Access Key ID [None]: ＜アクセスキー＞
AWS Secret Access Key [None]: ＜シークレットキー＞
Default region name [None]: ap-northeast-1
Default output format [None]:
```


## IDCFクラウドからVMイメージエクスポート
まず、エクスポートする前にVM内のいらないゴミファイルはできるだけ削除しておくこと。
できる限り5GB以内に抑えたい。なぜならAWSのS3の無料枠が5GBまでだから。
VM内のゴミを削除してからVMを停止し、公式サイトのヘルプを参考に「テンプレートの作成」を行う。
https://www.faq.idcf.jp/app/answers/detail/a_id/945/kw/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88

こんな感じのこと書いて「作成」ボタンを押す。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/367048/0a4c2702-f156-fb91-c72d-45c97a99829e.png)

しばらくしたら「テンプレート」が出来上がるので、下記の手順に従いテンプレート画面で「エクスポート」を押して、しばらくすると下のほうにリンクができるので、OVAファイルダウンロードのリンクをクリックしてダウロードする。
https://www.faq.idcf.jp/app/answers/detail/a_id/145/c/22

![2.png](https://qiita-image-store.s3.amazonaws.com/0/367048/e37a2f8c-3b91-7441-1040-2acbe252b6da.png)


## AWS上でいろいろ準備

これが意外とめんどい。
基本的に下記の手順に従って作業を行う。
https://docs.aws.amazon.com/ja_jp/vm-import/latest/userguide/vmimport-image-import.html

### S3バケットの作成

AWSのコンソール上でS3を選択し、「バケットを作成する」を押す。
「バケット名」がS3上で唯一な名前じゃないと怒られるので、bucket+ドメイン名とかユニークになりそうな名前を付けること。
リージョンはVMたてるリージョンである「アジアパシフィック（東京）」を選択。あとはデフォルトでOKなので「作成」ボタンを押す。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/367048/613813f7-7455-fd67-8ed3-b52717908545.png)


### ロール設定

ここからAWS CLIの出番。
手順に従いtrust-policy.jsonを作成する。 

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

そんで下記コマンド実行してロール作成する。

```
C:\Users\user>aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json
{
    "Role": {
        "Path": "/",
        "RoleName": "vmimport",
        "RoleId": "xxxxxxxxxxxxxxx",
        "Arn": "arn:aws:iam::xxxxxxxxxx:role/vmimport",
        "CreateDate": "2019-02-24T12:36:50Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "vmie.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole",
                    "Condition": {
                        "StringEquals": {
                            "sts:Externalid": "vmimport"
                        }
                    }
                }
            ]
        }
    }
}
```

次に、role-policy.json作成。

```json:role-policy.json
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket" 
         ],
         "Resource":[
            "arn:aws:s3:::＜バケット名＞",
            "arn:aws:s3:::＜バケット名＞/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "ec2:ModifySnapshotAttribute",
            "ec2:CopySnapshot",
            "ec2:RegisterImage",
            "ec2:Describe*"
         ],
         "Resource":"*"
      }
   ]
}
```

これを適用。このコマンドの結果は特に何も返さない。

```
C:\Users\user>aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json
```

### S3にイメージアップロード

AWSの画面上から実施。先ほど作成したバケット名クリックして、「アップロード」ボタン押してOVAファイルをドラッグ＆ドロップすればアップロードされる。
アクセス許可やらなんやらあるが、基本デフォルトでOK。

### AMIに変換する
containers.jsonファイルを作成。

```json:containers.json
[
  {
    "Description": "mytest",
    "Format": "ova",
    "UserBucket": {
        "S3Bucket": "＜バケット名＞",
        "S3Key": "＜OVAファイル名＞"
    }
}]
```

S3に上げたOVAファイルをEC2で使えるイメージ（AMI）に変換する。

```
C:\Users\user>aws ec2 import-image --description "mytest" --disk-containers file://containers.json
{
    "Description": "mytest",
    "ImportTaskId": "import-ami-xxxxxxxxxxxxxx",
    "Progress": "2",
    "SnapshotDetails": [
        {
            "DiskImageSize": 0.0,
            "Format": "OVA",
            "UserBucket": {
                "S3Bucket": "＜バケット名＞",
                "S3Key": "＜OVAファイル名＞"
            }
        }
    ],
    "Status": "active",
    "StatusMessage": "pending"
}
```

変換に10～20分ぐらい時間かかる。下記のコマンドで状況が確認できる。

```
C:\Users\user>aws ec2 describe-import-image-tasks --import-task-ids ＜ImportTaskId＞
{
    "ImportImageTasks": [
        {
            "Description": "mytest",
            "ImportTaskId": "import-ami-xxxxxxxxxxxxxx",
            "Progress": "28",
            "SnapshotDetails": [
                {
                    "DiskImageSize": 4242946048.0,
                    "Format": "VMDK",
                    "Status": "active",
                    "UserBucket": {
                        "S3Bucket": "＜バケット名＞",
                        "S3Key": "＜OVAファイル名＞"
                    }
                }
            ],
            "Status": "active",
            "StatusMessage": "converting"
        }
    ]
}
```

"Status"がcompletedになるまで気長に待つ。以下がcompleted状態の例。

```
C:\Users\user>aws ec2 describe-import-image-tasks --import-task-ids ＜ImportTaskId＞
{
    "ImportImageTasks": [
        {
            "Architecture": "x86_64",
            "Description": "mytest",
            "ImageId": "ami-xxxxxxxxxxx",
            "ImportTaskId": "import-ami-xxxxxxxxxxxxxx",
            "LicenseType": "BYOL",
            "Platform": "Linux",
            "SnapshotDetails": [
                {
                    "DeviceName": "/dev/sda1",
                    "DiskImageSize": 4242946048.0,
                    "Format": "VMDK",
                    "SnapshotId": "snap-xxxxxxxxxxxxx",
                    "Status": "completed",
                    "UserBucket": {
                        "S3Bucket": "＜S3バケット名＞",
                        "S3Key": "＜OVAファイル名＞"
                    }
                }
            ],
            "Status": "completed"
        }
    ]
}
```

## 起動と動作確認

### VM起動
EC2で「インスタンスの作成」ボタンを押す。全体的にほぼデフォルトでOK。
「マイAMI」で出来立てほやほやのイメージがあるので、それを選択する。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/367048/28f4f13b-bc05-f3d4-65ae-dae303822ac7.png)

当然のように無料枠のインスタンスタイプを選択する。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/367048/bc2a57e9-1b7d-fb15-e5b2-03c12ec43e35.png)

EBSは30GBまで無料枠なのでサイズ30GBにする。（IDCFクラウドのVMは15GBだったので後でfdiskやらresize2fsしておかないとOSが認識しないが）

![8.png](https://qiita-image-store.s3.amazonaws.com/0/367048/e9b61b86-3560-b3a1-98dd-7eaa1282c303.png)


セキュリティグループの設定でSSH TCP 22の「ソース」のところをsshクライアントのIPのみ許可するように設定する。
「確認と作成」ボタンおしたときにキーペア作成することになるが、もともとのVM接続に使っていたssh鍵使うのであまり意味なし。

### 接続と動作確認

VMが起動したら右のほうに「IPv4パブリックIP」というのがあるので、そこに対してSSHで接続する。
これまでIDCFクラウドのVMの接続に使っていたユーザ名＆ssh鍵を使ってログインする。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/367048/4f6afb96-4dc6-1a90-f27c-fb372190df28.png)

IDC Frontierとかいうロゴがデカデカと出ているが、AWSのEC2で動いているVMである。
（rootでログインするなって？IDCFクラウドにあった元のVMイメージがそういう仕様だったんだよ・・・）

## EC2ではずれを引いたと思ったら

噂によるとAWSのEC2には当たり外れがあるらしい。
なんとなくはずれを引いたと思た場合はsysbenchとかでベンチマークを測ってVMを何度か作り直すと当たりを引けるかもしれない。

# 後始末（重要）

無料枠のつもりだったのになんか課金されとる・・・

![aws1.png](https://qiita-image-store.s3.amazonaws.com/0/367048/2f35f9be-c519-645c-9622-75f89ca25ec5.png)

どうやらスナップショットが無料枠じゃなくて課金対象になってた模様。くやしい。
下記の手順でAMIとスナップショットを削除する。

1. AMI登録解除（先にこれをやらないとスナップショット削除できない）
2. スナップショット削除

EC2管理画面のAMIのところから右クリックして「登録解除」を選ぶ。
![aws2.png](https://qiita-image-store.s3.amazonaws.com/0/367048/e12c3cc3-bfd2-12a6-158c-c27b2cea91ac.png)

同様にスナップショットのところで右クリックして「削除」を選ぶ。
![aws3.png](https://qiita-image-store.s3.amazonaws.com/0/367048/8067acb1-6f92-d598-da87-1f768d435c13.png)

以上。