はじめに
ローカルにあるCenOS 6.x の VMWare の VM を AWS の EC2 にもっていく。
レガシーなローカル環境というか、サーバがぼろいので AWS に上げようという話。
AWSCLIを利用してコマンドラインでローカルにある VM を移動する。
大まかながれ
- VMWare の VM をエクスポート (OVF形式)
- エクスポートした(OVF形式)ファイルを S3 へコピー
- S3 から EC2 へコピーするロールを作成しポリシーを割り当てる
- S3へコピーしたファイルを AMI にインポート
- AMI から EC2 へ登録
準備
- AWSCLI が利用できるようになっていること
- S3でバケットが作れること
- AWSCLI でロール作成とポリシー割り当てができるようになっていること
- IAM でアクセスID、アクセスキーでアクセスするユーザーにロール作成とポリシー割り当てができるようになっていること
手順
VMWare の VM をエクスポート (OVF形式)
VM を停止させてから行う必要がある。
「ファイル」メニューの「OVFへエクスポート(E)」を選択してファイルを出力する。
これを実行すると、以下の3つのファイルが出力される。
- test.mf
- test.ovf
- test.vmdk
エクスポートした(OVF形式)ファイルを S3 へコピー
S3 でバケットを作成
「バケットを作成する」をクリック

バケット名を入力して「次へ」

特に何もないので、何もしないで「次へ」

移行したらすぐ消すのでパブリックアクセスにしてバケットを作成


バケットへ OVF形式ファイルをコピー
バケットを選択

「アップロード」をクリックして、エクスポートした VM の3つのファイルをアップロードする。

- test.mf
- test.ovf
- test.vmdk
S3 から EC2 へコピーするロールを作成しポリシーを割り当てる
ロールの作成
以下の JSONファイルを用意する
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "vmie.amazonaws.com" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals":{
"sts:Externalid": "vmimport"
}
}
}
]
}
上記のJSONファイルを利用し、以下のコマンドを実行する。
```bash
/root/.local/bin/aws iam create-role --role-name vmimport --assume-role-policy-document "file:///tmp/trust-policy.json"
もしロールを作成できる権限がなければ以下のようなエラーになる
An error occurred (AccessDenied) when calling the PutRolePolicy operation: User: arn:aws:iam::105252861779:user/cliadmin is not authorized to perform:
コマンド実行が正常に終われば以下のようなものが表示される
ROLE arn:aws:iam::105252861779:role/vmimport 2020-07-15T10:36:22Z / AROARRAMPG5J2MR35GNQ3 vmimport
ASSUMEROLEPOLICYDOCUMENT 2012-10-17
STATEMENT sts:AssumeRole Allow
STRINGEQUALS vmimport
PRINCIPAL vmie.amazonaws.com
ポリシーの割り当て
以下の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":"*"
}
]
}
上記のJSONファイルを利用して以下のコマンドを実行してロールにポリシーを割り当てる。
/root/.local/bin/aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document "file:///tmp/role-policy.json"
もしロールを作成できる権限がなければ以下のようなエラーになる
An error occurred (AccessDenied) when calling the PutRolePolicy operation: User: arn:aws:iam::105252861779:user/cliadmin is not authorized to perform:
S3へコピーしたファイルを AMI にインポート
以下のJSONファイルを用意する。
[
{
"Description": "First disk",
"Format": "vmdk",
"UserBucket": {
"S3Bucket": "バケット名",
"S3Key": "フォルダ名/インポート対象VMDK(test.vmdk)"
}
}
]
上記で用意したJSONファイルを利用し以下のコマンドを実行する
/root/.local/bin/aws ec2 import-image --description "vmec2mig" --disk-containers "file:///tmp/containers.json"
ロールがない、ロールにポリシーが割り当たっていないと以下のエラーになる
An error occurred (InvalidParameter) when calling the ImportImage operation: The service role vmimport provided does not exist or does not have sufficient permissions
実行できるとインポートが始まるのでしばらく待つ
/root/.local/bin/aws ec2 import-image --description "vmec2mig" --disk-containers "file:///tmp/containers.json"
vmec2mig import-ami-0746702dcd8ae0ba4 1 active pending
SNAPSHOTDETAILS First disk 0.0 VMDK
USERBUCKET testlink-vm TestLink_CentOS6.6_extl0104ce6-disk1.vmdk
/root/.local/bin/aws ec2 describe-import-image-tasks --import-task-ids import-ami-0746702dcd8ae0ba4
IMPORTIMAGETASKS vmec2mig import-ami-0746702dcd8ae0ba4 4 active validated
# /root/.local/bin/aws ec2 describe-import-image-tasks --import-task-ids import-ami-0746702dcd8ae0ba4
IMPORTIMAGETASKS x86_64 vmec2mig ami-019afc5f9ae98ab03 import-ami-0746702dcd8ae0ba4 BYOL Linux completed
ステータスが completed になれば AMI に使いされている
AMI から EC2 へ登録
登録した AMI を選択し「アクション」で「起動」をクリックすると EC2 で起動する。