AWS Consoleでスナップショットをアップロードして自前のVMDKを移行する
EC2のimage-importが上手くいかないとき、import-snapshotを使うとAWS上にimportできます。
既存の仮想サーバ(vmdk)の移行をスナップショットを介して移行する方法をご紹介します。AMIを作る際にエラーが出てしまうvmdkファイルを、無理やりAMIにする方法として、スナップショットをベースに作ることができます。
エラー処理を回避し、ローカルなvmdkファイルをベースにEC2サーバを立てることができます。
・vmdkファイルをS3にアップロードする
・M1 macでaws consoleを利用できるようにする
・vmimportのロールとしてIAMの設定を行う
・S3のvmdkファイルをスナップショットの領域へコンバートする
・スナップショットからイメージを作り自分のAMIを作る
vmdkファイルをS3にアップロードする
AWSのストレージサービスS3にvmdkをアップロードします。
vmdkは既に手元にあることを前提とします。ESXiでは対象の仮想サーバ上で右クリックしてエクスポートすればvmdkファイルを入手できます。
S3には、Web画面でドラッグ&ドロップでアップロードできますので、GUIで操作できます。
アップロードをクリックし、ファイルを選択してアップロードボタンを押してアップロードします。
「s3://backet/test.vmdk」のような、s3のURIを控えておきます。
コマンドで、S3のURIを指定してスナップショットへ移行するためです。
M1 macでaws consoleを利用できるようにする
Macでは、以下のようにterminalに入力し、aws consoleを使えるようにインストールします。
brew install awscli
aws configure
AWS Access Key ID とAWS Secret Access KeyやDefault region nameを設定します。
Access Key IDとSecret Access Keyの入手方法は、AWSのWeb画面にて、IAMの画面でユーザを選択し、認証情報タブで、アクセスキーの作成をクリックすると作成できます。
vmimportロールとしてIAMの設定を行う
AWSにvmdkをインポートできるロールを作成します。
trust-policy.jsonファイルを作成し、aws conwoleコマンドでポリシーを作成します。
trust-policy.jsonファイルをviコマンドで作成します。
vi trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "vmie.amazonaws.com" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals":{
"sts:Externalid": "vmimport"
}
}
}
]
}
vmimportというロールを作ります。
aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json
ポリシーを作り、ロールをアタッチします。
viコマンドでrole-policy.jsonを作成します。
vi role-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::[自身のバケット名]"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::[自身のバケット名]/*"
]
},
{
"Effect": "Allow",
"Action":[
"ec2:ModifySnapshotAttribute",
"ec2:CopySnapshot",
"ec2:RegisterImage",
"ec2:Describe*"
],
"Resource": "*"
}
]
}
AWS Consoleのコマンドでロールにvmimportポリシーに紐づけます。
aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json
S3のvmdkファイルをスナップショットの領域へコンバートする
asw consoleコマンドに持たせるjsonファイルを作成します。containers.jsonファイルを作成します。
vi containers.json
{
"Description": "test.vmdk",
"Format": "VMDK",
"UserBucket": {
"S3Bucket": "[自身のバケット名]",
"S3Key": "[指定するファイル名].vmdk"
}
}
containers.jsonを読み込むaws consoleコマンドを実行します。
aws ec2 import-snapshot --description "test.vmdk" --disk-container "file://containers.json"
以下のような実行結果が出ます。
{
"Description": "test.vmdk",
"ImportTaskId": "import-snap-xxxxxxxx",
"SnapshotTaskDetail": {
"Description": "test.vmdk",
"DiskImageSize": 0.0,
"Progress": "0",
"Status": "active",
"StatusMessage": "pending",
"UserBucket": {
"S3Bucket": "[自身のバケット名]",
"S3Key": "[指定するファイル名].vmdk"
}
},
"Tags": []
}
describe-import-snapshot-tasksコマンドで、タスクの進行状況を確認でき、Statusが「completed」になれば成功です。
aws ec2 describe-import-snapshot-tasks --import-task-ids import-snap-xxxxxxxx
{
"ImportSnapshotTasks": [
{
"Description": "test.vmdk",
"ImportTaskId": "import-snap-xxxxxxxx",
"SnapshotTaskDetail": {
"Description": "test.vmdk",
"DiskImageSize": 1069001216.0,
"Format": "VMDK",
"SnapshotId": "snap-xxxxxxxx",
"Status": "completed",
"UserBucket": {
"S3Bucket": "[自身のバケット名]",
"S3Key": "[指定するファイル名].vmdk"
}
},
"Tags": []
}
]
}
スナップショットからイメージを作り自分のAMIを作る
スナップショットとして、AWSに取り込めれば、残りはGUI環境で操作して対応できます。
Elastic Block Storeのスナップショットを開くと、登録したスナップショットがあります。
選択して確認しましょう。
[スナップショットからイメージを作成]を選択します。
イメージ名やアーキテクチャを選択して、イメージを作成します。
今回はtestというイメージ名で作成しました。
ここまでで自分のAMIを作成できました。
EC2の起動は通常通りですので、「自分のAMI」より作成したAMIイメージを選択して、インスタンスタイプ等選択して、ご自由にサーバを立てられますね。
終わりに
この記事では自前のVMDKファイルをスナップショットへコンバートし、自身のAMIイメージを作成してEC2サーバを建てる方法をご紹介しました。これでvmdkファイルをAWS上に移行することも試せます。他の方法でエラーが発生していて上手くいかない方は、是非スナップショットから自身のAMIイメージを作成する方法をお試しください。