Amazon EC2では最近、仮想マシンイメージとディスクをインポートするAPIのアップデートを提供しました。これらのあたらしいAPI、ImportImageとImportSnapshotはオリジナルのインポートAPIよりも高速かつ柔軟で、AWS Tools for Windows PowerShell(2.3.43.0以降)のImport-EC2ImageとImport-EC2Snapshotのふたつのコマンドレットから利用可能です。あたらしいコマンドレットをつかってインポートを実行する手順についてみていきましょう。
VMイメージをインポートする
イメージのEC2へのインポートは単にいくつかのステップで完了します。はじめに、ディスクイメージをAmazon S3にアップロードする必要があり、そして起動できるAmazon Machine Image(AMI)を生成するためのインポートのコマンドレットを実行します。Identity and Access Managementロールにくわえて、S3へのEC2アクセスを付与するために関連するロールポリシーを作成する必要があります。これは一回だけの操作になります。
インポートの前提条件
詳細はEC2 user guide topicにありますが、あたらしいインポートサービスAPIはIdentity and Access Managementロールとそれに関連付られたロールポリシーを、インポート中にAmazon S3にアップロードするイメージファイルにアクセスするために使用します。これらの設定は1回きりのオペレーション(同じバケットにそれぞれのインポート用のイメージファイルを保存すると仮定して)でPowerShellから以下のようにとても簡単におこなえます。
はじめに、ロールを作成します。EC2 import APIはインポートコマンドを実行するときにカスタムのロール名を指定しなければデフォルトで"vmimport"というロール名となります。シンプルさのため、このブログでは例としてその名前を使用します:
PS C:\> $importPolicyDocument = @"
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"",
"Effect":"Allow",
"Principal":{
"Service":"vmie.amazonaws.com"
},
"Action":"sts:AssumeRole",
"Condition":{
"StringEquals":{
"sts:ExternalId":"vmimport"
}
}
}
]
}
"@
PS C:\> New-IAMRole -RoleName vmimport -AssumeRolePolicyDocument $importPolicyDocument
これでロールが作成されたので、EC2がイメージをふくむバケットにアクセスできるようなポリシーを追加します:
PS C:\> $bucketName = "myvmimportimages"
PS C:\> $rolePolicyDocument = @"
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource":[
"arn:aws:s3:::$bucketName"
]
},
{
"Effect":"Allow",
"Action":[
"s3:GetObject"
],
"Resource":[
"arn:aws:s3:::$bucketName/*"
]
},
{
"Effect":"Allow",
"Action":[
"ec2:ModifySnapshotAttribute",
"ec2:CopySnapshot",
"ec2:RegisterImage",
"ec2:Describe*"
],
"Resource":"*"
}
]
}
"@
PS C:\> Write-IAMRolePolicy -RoleName vmimport -PolicyName vmimport -PolicyDocument $rolePolicyDocument
これで前提条件は完了です。将来的に異なるバケット(または追加のバケット)をつかいたい場合は、上記の名前を新規または追加のバケットの名前としてポリシーのヒア文字列を再構築してWrite-IAMRolePolicy
コマンドレットを再実行します。
イメージをアップロードする
VMまたはディスクイメージはS3にアップロードされる必要があります。そのためには、Write-S3Object
コマンドレットを使用します。インポートしたいWindows Server 2012 R2イメージが単一のディスクで構成されているとします。このイメージはディスク上のC:\CustomWindows2012R2.vhdファイルに配置されています。変数からキャプチャして前提条件で利用したのとおなじバケット、"myvmimportimages"を使用しています:
PS C:\> Write-S3Object -BucketName $bucketName -File .\CustomWindows2012R2.vhd
コマンドレットにバケット内のオブジェクトを特定するための-Keyパラメータを指定していないため、デフォルトのファイル名が使用されます。インポートするVMイメージが複数のディスクイメージから構成されている場合は、すべてのイメージをアップロードするためにWrite-S3Object
を繰り返します。
これでイメージをインポートする準備ができました。
イメージをインポートする
VMイメージをインポートするコマンドレット、Import-EC2Image
はさまざまなパラメータでインポートの参考になる情報やS3のどのオブジェクトにEC2が操作するイメージをふくむかの詳細を表示することができます。カスタムのロール名(-RoleName
パラメータによって)を指定してEC2にS3オブジェクトへのアクセスを許可することもできます。この記事の前のほうではカスタムロールが指定されていない場合にEC2がデフォルト名を使用するロールとポリシーのセットアップのやりかたについて解説しましたので、このパラメータはここでは使用しません。
はじめに、ひとつ以上のImageDiskContainerインスタンスを作成する必要があります。複数のディスクイメージ(そして複数のS3オブジェクト)から構成されるVMをインポートする場合、複数のコンテナインスタンスを作成してそれらをコマンドレットに配列として渡します。この記事のサンプルイメージはひとつのイメージファイルだけをふくんでいます:
PS C:\> $windowsContainer = New-Object Amazon.EC2.Model.ImageDiskContainer
PS C:\> $windowsContainer.Format="VHD"
イメージファイルのS3ロケーションの詳細をネストされたオブジェクトで指定します:
PS C:\> $userBucket = New-Object Amazon.EC2.Model.UserBucket
PS C:\> $userBucket.S3Bucket = $bucketName
PS C:\> $userBucket.S3Key = "CustomWindows2012R2.vhd"
PS C:\> $windowsContainer.UserBucket = $userBucket
ディスクコンテナオブジェクトを構成して、インポートコマンドレットへのパラメータをセットアップすることができます。パラメータのひとつとして、ClientToken
は冪等性をもつトークンを渡すことができます - これは障害が発生してコマンドを再実行が必要な場合、EC2が新規インポートをスタートしないことを保証します:
PS C:\> $params = @{
"ClientToken"="CustomWindows2012R2_" + (Get-Date)
"Description"="My custom Windows 2012R2 image import"
"Platform"="Windows"
"LicenseType"="AWS"
}
これでインポートコマンドレットを実行できる準備ができました:
PS C:\> Import-EC2Image -DiskContainer $windowsContainer @params
Architecture :
Description : My custom Windows 2012R2 image import
Hypervisor :
ImageId :
ImportTaskId : import-ami-abcdefgh
LicenseType : AWS
Platform : Windows
Progress : 2
SnapshotDetails : {}
Status : active
StatusMessage : pending
それぞれのインポートタスクに上のように同じ情報をアウトプットするGet-EC2ImportImageTask
コマンドレットをつかって、インポート(またはインポート群)の進行状況を確認することができます。オプションで、ImportTaskIdパラメータの値を指定して特定のインポートをクエリすることができます。PowerShellパイプラインからのアウトプットを切り刻みたくない場合はフィルターのセットを指定することもできます。
インポートをやめるためには、Stop-EC2ImportTask
コマンドレットを使用します。このコマンドレットはVMイメージとディスクスナップショットのインポートの両方に使用できます。ストップするインポートのインポートタスクIDを受け付けます。
ディスクスナップショットをインポートする
追加のEBSボリュームをEC2インスタンスにアタッチするディスクスナップショットのインポートは常に単一のイメージをインポートするという以外はVMイメージのインポートにとてもよく似ています:
PS C:\> Write-S3Object -BucketName $bucketName -File .\DataDisk.vhd
PS C:\> $params = @{
"ClientToken"="MySnapshotImport_" + (Get-Date)
"Description"="My Data Disk Image"
"DiskContainer_Description" = "Data disk import"
"DiskContainer_Format" = "VHD"
"DiskContainer_S3Bucket" = $bucketName
"DiskContainer_S3Key" = "DataDisk.vhd"
}
PS C:\> Import-EC2Snapshot @params | fl
Description : My Data Disk Image
ImportTaskId : import-snap-abcdefg
SnapshotTaskDetail : Amazon.EC2.Model.SnapshotTaskDetail
スナップショットのインポートの進行状況をチェックするためには、 Get-EC2ImportSnapshotTask
コマンドレットを使用しますが、これはGet-EC2ImportImageTask
にとてもよく似ています。前に述べたとおりスナップショットのインポートはStop-EC2ImportTask
を使用してストップできます。
廃止予定:オリジナルのImport Cmdlets
オリジナルのImport Cmdlets(Import-EC2Instance
, Import-EC2Volume
, Get-EC2ConversionTask
および Stop-EC2ConversionTask
)は廃止予定としてマークされています。これは将来のリリースで削除される予定です。
追加情報
あたらしいコマンドレットがつかいやすいと思っていただくことを期待しています!VMイメージとディスクスナップショットのAmazon EC2へのインポートについての追加情報は、オフィシャルAWSブログのこの記事を見てください。機能についてはEC2 documentationにアクセスしていただくこともできます。
(翻訳はSA渡邉が担当しました。原文はUsing the New Import Cmdlets for Amazon EC2)