Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

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

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

2.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

ロール設定

ここからAWS CLIの出番。
手順に従いtrust-policy.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作成。

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ファイルを作成。

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

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

7.png

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

8.png

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

接続と動作確認

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

9.png

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

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

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

後始末(重要)

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

aws1.png

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

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

EC2管理画面のAMIのところから右クリックして「登録解除」を選ぶ。
aws2.png

同様にスナップショットのところで右クリックして「削除」を選ぶ。
aws3.png

以上。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?