Posted at

OVAファイルをAMIとして取り込む

More than 1 year has passed since last update.

ステップ 3: イメージとして VM をインポートする - VM Import/Export」に基づいて OVA ファイルをアップロードして AMI にする手順をまとめた。


S3 バケットの作成

OVA ファイルをいったん S3 バケットにアップロードする必要があるため、バケットを作成する。


① 名前とリージョンで以下の指定を実施


  • 「バケット名」に任意の文字列を入力

  • 「リージョン」に適切なリージョン(通常は「アジアパシフィック(東京)」を指定

  • 「次へ」ボタンを押下


② プロパティの設定


  • 必要に応じて設定

  • 「次へ」ボタンを押下


③ アクセス許可の設定


  • (「パブリックアクセス許可を管理」を開き「認証済みの AWS ユーザー」の「読み込み」をチェック)

  • 「次へ」ボタンを押下


④ 確認


  • 「バケットを作成」ボタンを押下


awscli のインストール

brew install awscli

aws configure

今回は Mac で作業したので Homebrew でインストール。環境に応じて適宜対応。


サービスロールの作成


ポリシーの作成

cat << "_EOF_" > trust-policy.json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "vmie.amazonaws.com" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals":{
"sts:Externalid": "vmimport"
}
}
}
]
}
_EOF_
aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json

create-role コマンドで vmimport というロールを作成する。


ロールへのポリシーのアタッチ

cat << "_EOF_" > role-policy.json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::disk-image-file-bucket"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::disk-image-file-bucket/*"
]
},
{
"Effect": "Allow",
"Action":[
"ec2:ModifySnapshotAttribute",
"ec2:CopySnapshot",
"ec2:RegisterImage",
"ec2:Describe*"
],
"Resource": "*"
}
]
}
_EOF_
aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json

disk-image-file-bucket (2箇所) は適宜変更のこと。

put-role-policy コマンドで上記で作成したロールにポリシーをアタッチする。


OVA ファイルのアップロード

aws s3 cp disk-image-file.ova s3://disk-image-file-bucket/

カレントディレクトリーにある disk-image-file.ova ファイルを disk-image-file-bucket バケットにアップロードする。


OVA ファイルのインポート

cat << "_EOF_" > containers.json

[
{
"Description": "OVA Disk Image",
"Format": "ova",
"UserBucket": {
"S3Bucket": "disk-image-file-bucket",
"S3Key": "disk-image-file.ova"
}
}
]
_EOF_
aws ec2 import-image --description "OVA Disk Image" --disk-containers file://containers.json

JSON ファイル内に "Description": があるが、オプションでも --description を指定しないと以下のエラーが出る。

A client error (InvalidParameter) occurred when calling the ImportImage operation: The service role <vmimport> does not exist or does not have sufficient permissions for the service to continue


ステータスの確認

aws ec2 describe-import-image-tasks --import-task-ids import-ami-XXXXXXXX

IMPORTIMAGETASKS    OVA Disk Image  import-ami-XXXXXXXX 2   active  pending

SNAPSHOTDETAILS 0.0 OVA
USERBUCKET disk-image-file-bucket disk-image-file.ova

IMPORTIMAGETASKS    OVA Disk Image  import-ami-XXXXXXXX 28  active  converting

SNAPSHOTDETAILS 771973632.0 VMDK
USERBUCKET disk-image-file-bucket disk-image-file.ova

IMPORTIMAGETASKS    OVA Disk Image  import-ami-XXXXXXXX 30  active  updating

SNAPSHOTDETAILS 771973632.0 VMDK
USERBUCKET disk-image-file-bucket disk-image-file.ova

IMPORTIMAGETASKS    OVA Disk Image  import-ami-XXXXXXXX 37  active  updating

SNAPSHOTDETAILS 771973632.0 VMDK
USERBUCKET disk-image-file-bucket disk-image-file.ova

IMPORTIMAGETASKS    x86_64  OVA Disk Image  import-ami-XXXXXXXX BYOL    Linux   59  active  booting

SNAPSHOTDETAILS /dev/sda1 771973632.0 VMDK
USERBUCKET disk-image-file-bucket disk-image-file.ova

IMPORTIMAGETASKS    x86_64  OVA Disk Image  ami-XXXXXXXX    import-ami-XXXXXXXX BYOL    Linux   completed

SNAPSHOTDETAILS /dev/sda1 771973632.0 VMDK snap-XXXXXXXXXXXXXXXXX
USERBUCKET disk-image-file-bucket disk-image-file.ova

watch コマンドを使ってもいいかもしれない。