ブロックデバイスマッピング - Amazon Elastic Compute Cloud

ブロックデバイスマッピング

起動する各インスタンスには、Amazon EBS ボリューム、またはインスタンスストアボリュームのどちらかのルートデバイスボリュームが関連付けられています。ブロックデバイスマッピングを使用すると、インスタンスの起動時にそのインスタンスにアタッチする追加の EBS ボリュームまたはインスタンスストアボリュームを指定できます。追加する EBS ボリュームは、実行中のインスタンスにアタッチすることもできます。「インスタンスへの Amazon EBS ボリュームのアタッチ」をご参照ください。ただし、インスタンスストアボリュームについては、ブロックデバイスマッピングを使用して、インスタンスの起動時にアタッチする以外方法はありません。

ルートデバイスボリュームの詳細については、「永続的ルートボリュームへの変更」を参照してください。

ブロックデバイスマッピングの概念

ブロックデバイスは、一連のバイトまたはビット (ブロック) でデータを移動するストレージデバイスです。これらのデバイスはランダムアクセスをサポートし、バッファ付き I/O を使用します。例にはハードディスク、CD-ROM ドライブ、フラッシュドライブが含まれます。ブロックデバイスは物理的にコンピュータにアタッチできます。また、コンピュータに物理的にアタッチされているかのように、リモートでアクセスすることもできます。

Amazon EC2 は、2 種類のブロックデバイスをサポートしています。

  • インスタンスストアボリューム (基盤となるハードウェアがインスタンスのホストコンピュータに物理的にアタッチされている仮想デバイス)

  • EBS ボリューム (リモートストレージデバイス)

ブロックデバイスマッピングでは、インスタンスにアタッチするブロックデバイス (インスタンスストアボリュームと EBS ボリューム) を定義します。ブロックデバイスマッピングは、AMI 作成プロセスの一環として、AMI から起動されるすべてのインスタンスによって使用されるように指定できます。また、インスタンスの起動時にブロックデバイスマッピングを指定することもできます。起動したインスタンスの AMI ですでに指定されているマッピングは、このマッピングによって上書きされます。インスタンスタイプによってサポートされるすべての NVMe インスタンスストアボリュームが自動的に列挙され、インスタンスの起動時にデバイス名が割り当てられることに注意してください。それらをブロックデバイスマッピングに含めます。含めないとインスタンスは効果がありません。

ブロックデバイスマッピングのエントリ

ブロックデバイスマッピングを作成するとき、インスタンスにアタッチする必要があるブロックデバイスごとに以下の情報を指定します。

  • Amazon EC2 内で使用されるデバイス名。インスタンスのブロックデバイスドライバーは、ボリュームをマウントするときに実際のボリューム名を割り当てます。この割り当てられた名前は、Amazon EC2 が推奨する名前とは異なる可能性があります。詳細については、「Linux インスタンス上のデバイス名」を参照してください。

インスタンスストアボリュームの場合は、次の情報も指定します。

  • 仮想デバイスの名前: ephemeral[0-23]。インスタンスで使用できるインスタンスストアボリュームの数とサイズは、インスタンスタイプによって異なります。

NVMe インスタンスストアボリュームの場合は、次の情報も適用されます。

  • これらのボリュームが自動的に列挙され、デバイス名が割り当てられます。それらをブロックデバイスマッピングに含めます。含めないとインスタンスは効果がありません。

EBS ボリュームの場合は、次の情報も指定します。

  • ブロックデバイスを作成するときに使用するスナップショットの ID (snap-xxxxxxxx)。ボリュームサイズを指定する場合、この値はオプションです。

  • ボリュームのサイズ(GiB 単位). 指定されたサイズは、指定されたスナップショットのサイズ以上である必要があります。

  • インスタンス終了時にボリュームを削除するかどうか (true または false) デフォルト値は、ルートデバイスボリュームでは true、アタッチされたボリュームでは false です。AMI を作成するときは、そのブロックデバイスマッピングがインスタンスからこの設定を継承します。インスタンスを起動するときに、AMI からこの設定を継承します。

  • ボリュームタイプ。汎用 SSD の場合は gp2 および gp3、プロビジョンド IOPS SSD の場合は io1 および io2、スループット最適化 HDD の場合は st1、Cold HDD の場合は sc1、磁気の場合は standard です。デフォルト値は gp2 です。

  • ボリュームがサポートする 1 秒あたりの入力/出力オペレーションの数 (IOPS) (io1 および io2 ボリュームでのみ使用)

ブロックデバイスマッピングのインスタンスストアの注意事項

ブロックデバイスマッピングでインスタンスストアボリュームがある場合は、インスタンスを AMIs から起動すると、いくつかの警告が表示されます。

  • インスタンスタイプによって中に含まれるインスタンスストアボリューム数が異なり、インスタンスストアボリュームがまったく含まれないインスタンスタイプもあります。単一インスタンスストアボリュームのみをサポートするインスタンスタイプで、AMI が 2 つのインスタンスストアボリュームにマッピングされている場合、インスタンスは単一のインスタンスストアボリュームのみで起動します。

  • インスタンスストアボリュームをマッピングできるのは、起動時のみに限られます。インスタンスストアボリュームのないインスタンスを停止することはできません (t2.micro など)。インスタンスストアボリュームをサポートするインスタンスに変更し、インスタンスストアボリュームを含めて再起動します。ただし、AMI をインスタンスから作成し、インスタンスストアボリュームをサポートするインスタンスタイプで起動して、インスタンスストアボリュームをインスタンスにマッピングすることは可能です。

  • インスタンスストアボリュームをマッピングしたインスタンスを起動し、インスタンスを停止して、インスタンスストアボリュームの少ないインスタンスタイプに変更して再開すれば、最初の起動からマッピングしたインスタンスストアボリュームもインスタンスのメタデータに表示されます。ただし、インスタンスに使用できるのは、そのインスタンスタイプでサポートされているインスタンスストアボリュームの最大数までです。

    注記

    インスタンスが停止されると、インスタンスストアボリュームのデータはすべて失われます。

  • 起動時のインスタンスストア容量によっては、M3 インスタンスが AMI インスタンスストアブロックデバイスのマッピングを (起動時に指定されていない限り) 無視します。インスタンスの起動時にインスタンスストアボリュームを使用するには、起動する AMI ボリュームに AMI でインスタンスストアボリュームがマッピングされていたとしても、起動時にインスタンスストアブロックデバイスのマッピングを指定する必要があります。

ブロックデバイスマッピングの例

この図は、EBS-backed インスタンスのブロックデバイスマッピングの例を示しています。この例では、/dev/sdbephemeral0 にマッピングし、2 つの EBS ボリュームを 1 つは /dev/sdh に、もう 1 つは /dev/sdj にマッピングします。また、ルートデバイスボリュームである EBS ボリューム、/dev/sda1 も示しています。


           インスタンス、インスタンスストアボリューム、および EBS ボリュームの間の関係。

このブロックデバイスマッピングの例は、このトピックのコマンドおよび API の例で使用されています。ブロックデバイスマッピングを作成するコマンドおよび API の例については、「AMI 用のブロックデバイスマッピングの指定」および「インスタンス起動時のブロックデバイスマッピングの更新」を参照してください。

オペレーティングシステムでデバイスを使用できるようにする方法

Amazon EC2 では、ブロックデバイスの記述に、/dev/sdhxvdh などのデバイス名が使われます。また、Amazon EC2 では、EC2 インスタンスにアタッチするブロックデバイスを、ブロックデバイスマッピングで指定します。ストレージデバイスにアクセスするには、インスタンスにアタッチしたブロックデバイスが、オペレーティングシステムによって事前にマウントされていなければなりません。ブロックデバイスがインスタンスからデタッチされると、そのデバイスはオペレーティングシステムによってアンマウントされ、ストレージデバイスにアクセスできなくなります。

Linux インスタンスの場合、ブロックデバイスマッピングで指定されたデバイス名は、インスタンスの初回起動時に対応するブロックデバイスにマッピングされます。デフォルトでフォーマットおよびマウントされるインスタンスストアボリュームは、インスタンスタイプによって決まります。インスタンスタイプで使用できるインスタンスストアボリューム数を超えていない場合は、起動時に追加のインスタンスストアボリュームをマウントできます。詳細については、「Amazon EC2 インスタンスストア」を参照してください。ボリュームがフォーマットおよびマウントされるときに使用されるデバイスは、インスタンスのブロックデバイスドライバーによって決まります。詳細については、「インスタンスへの Amazon EBS ボリュームのアタッチ」を参照してください。

AMI ブロックデバイスマッピング

各 AMI にブロックデバイスマッピングがあります。このブロックデバイスマッピングは、AMI からのインスタンスの起動時にそのインスタンスにアタッチするブロックデバイスを指定します。Amazon が提供する AMI には、ルートデバイスのみが含まれます。追加のブロックデバイスを AMI に追加するには、独自の AMI を作成する必要があります。

AMI 用のブロックデバイスマッピングの指定

AMI を作成する場合に、ルートボリュームに加えて、ボリュームを指定するには、2 つの方法があります。インスタンスから AMI を作成する前に、実行中のインスタンスにすでにボリュームをアタッチしている場合、AMI のブロックデバイスマッピングにそれらの同じボリュームが含まれます。EBS ボリュームの場合、既存のデータが新しいスナップショットに保存され、それがブロックデバイスマッピングで指定される新しいスナップショットになります。インスタンスストアボリュームの場合、データは維持されません。

EBS-backed AMI の場合、ブロックデバイスマッピングを使用して、EBS ボリュームとインスタンスストアボリュームを追加できます。instance store-backed AMI の場合、イメージの登録時にイメージマニフェストファイルでブロックデバイスマッピングエントリを変更して、インスタンスストアボリュームのみを追加できます。

注記

M3 インスタンスの場合、インスタンスのブロックデバイスマッピングで起動時にインスタンスストアボリュームを指定する必要があります。AMI のブロックデバイスマッピングで指定したインスタンスストアボリュームは、インスタンスブロックデバイスマッピングの一部として指定されていない場合、M3 インスタンスを起動した際に無視される可能性があります。

コンソールを使用してボリュームを AMI に追加するには

  1. Amazon EC2 コンソールを開きます。

  2. ナビゲーションペインで、[インスタンス] を選択します。

  3. インスタンスを選択し、[アクション]、[イメージとテンプレート]、[イメージの作成] の順に選択します。

  4. イメージの名前と説明を入力します。

  5. インスタンスボリュームが [インスタンスボリューム] の下に表示されます。別のボリュームを追加するには、[ボリュームの追加] を選択します。

  6. [Volume type] で、ボリュームタイプを選択します。[Device] で、デバイス名を選択します。EBS ボリュームでは、スナップショット、ボリュームサイズ、ボリュームタイプ、IOPS、暗号化状態などの追加の詳細を指定できます。

  7. [イメージを作成] を選択します。

コマンドラインを使用して AMI にボリュームを追加するには

EBS-Backed AMI のブロックデバイスマッピングを指定するには、create-image AWS CLI コマンドを使用します。Instance Store-Backed AMI のブロックデバイスマッピングを指定するには、register-image AWS CLI コマンドを使用します。

--block-device-mappings パラメータを使用してブロックデバイスマッピングを指定します。JSON でエンコードされた引数は、コマンドラインで直接指定することも、ファイルを参照して指定することもできます。

--block-device-mappings [mapping, ...] --block-device-mappings [file://mapping.json]

インスタンスストアボリュームを追加するには、次のマッピングを使用します。

{ "DeviceName": "/dev/sdf", "VirtualName": "ephemeral0" }

空の 100 GiB gp2 ボリュームを追加するには、次のマッピングを使用します。

{ "DeviceName": "/dev/sdg", "Ebs": { "VolumeSize": 100 } }

スナップショットに基づいた EBS ボリュームを追加するには、次のマッピングを使用します。

{ "DeviceName": "/dev/sdh", "Ebs": { "SnapshotId": "snap-xxxxxxxx" } }

デバイスのマッピングを省略するには、次のマッピングを使用します。

{ "DeviceName": "/dev/sdj", "NoDevice": "" }

または、次のコマンド (-BlockDeviceMapping) で AWS Tools for Windows PowerShell パラメータを使用することもできます。

AMI ブロックデバイスマッピングの EBS ボリュームの表示

AMI のブロックデバイスマッピングの EBS ボリュームを簡単に列挙できます。

コンソールを使用して AMI の EBS ボリュームを表示するには

  1. Amazon EC2 コンソールを開きます。

  2. ナビゲーションペインで [AMIs] を選択します。

  3. [Filter] リストから [EBS images] を選択して、EBS-Backed AMI のリストを取得します。

  4. ご希望の AMI を選択し、[Details] タブを確認します。少なくとも、ルートデバイスでは次の情報を使用できます。

    • ルートデバイスタイプ (ebs)

    • [ルートデバイス名] (例: /dev/sda1)

    • [Block Devices] (例: /dev/sda1=snap-1234567890abcdef0:8:true)

    AMI がブロックデバイスマッピングを使用して追加の EBS ボリュームで作成された場合、[Block Devices] フィールドには、その追加の EBS ボリュームのマッピングも表示されます。(この画面には、インスタンスストアボリュームは表示されません。)

コマンドラインを使用して AMI の EBS ボリュームを表示するには

describe-images (AWS CLI) コマンドまたは Get-EC2Image (AWS Tools for Windows PowerShell) コマンドを使用して、AMI のブロックデバイスマッピング内の EBS ボリュームを列挙します。

インスタンスブロックデバイスマッピング

デフォルトでは、起動するインスタンスには、そのインスタンスを起動した AMI のブロックデバイスマッピングで指定されたストレージデバイスが含まれます。インスタンスを起動するときに、インスタンスのブロックデバイスマッピングへの変更を指定できます。この変更は AMI のブロックデバイスマッピングを上書きするか、このブロックデバイスマッピングに統合されます。

Limitations

  • ルートボリュームの場合、変更できるのはボリュームサイズ、ボリュームタイプ、および [合わせて削除] フラグのみです。

  • EBS ボリュームを変更する場合、そのサイズを小さくすることはできません。そのため、指定するスナップショットのサイズは、AMI のブロックデバイスマッピングで指定されたスナップショットのサイズ以上であることが必要です。

インスタンス起動時のブロックデバイスマッピングの更新

インスタンスの起動時に、EBS ボリュームとインスタンスストアボリュームをインスタンスに追加できます。インスタンスのブロックデバイスマッピングを更新しても、そのインスタンスが起動された AMI のブロックデバイスマッピングは完全には変更されないことに注意してください。

コンソールを使用してボリュームをインスタンスに追加するには

  1. Amazon EC2 コンソールを開きます。

  2. ダッシュボードから、[Launch Instance] を選択します。

  3. [Choose an Amazon Machine Image (AMI)] ページで、使用する AMI を選択し、[Select] を選択します。

  4. ウィザードにしたがって [Choose an Instance Type] ページと [Configure Instance Details] ページを設定します。

  5. [Add Storage] ページで、以下のようにルートボリューム、EBS ボリューム、およびインスタンスストアボリュームを変更できます。

    • ルートボリュームのサイズを変更するには、[Type] 列で [Root] ボリュームを見つけて、[Size] フィールドを変更します。

    • インスタンスの起動に使用された AMI のブロックデバイスマッピングで指定された EBS ボリュームを削除するには、ボリュームを見つけて、[Delete] アイコンをクリックします。

    • EBS ボリュームを追加するには、[新しいボリュームの追加] を選択し、[タイプ] リストから [EBS] を選択して、各フィールド ([デバイス]、[スナップショット] など) に入力します。

    • インスタンスの起動に使用された AMI のブロックデバイスマッピングで指定されたインスタンスストアボリュームを削除するには、ボリュームを見つけて、[Delete] アイコンを選択します。

    • インスタンスストアボリュームを追加するには、[新しいボリュームの追加] を選択し、[Type] リストから [インスタンスストア] を選択して、[Device] からデバイス名を選択します。

  6. ウィザードの残りのページを完了した後、[起動] を選択します。

AWS CLI を使用してボリュームをインスタンスに追加するには

起動時に run-instances AWS CLI コマンドを --block-device-mappings オプションと共に使用し、インスタンスのブロックデバイスマッピングを指定します。

たとえば、EBS-backed AMI が、次のブロックデバイスマッピングを指定するとします。

  • /dev/sdb=ephemeral0

  • /dev/sdh=snap-1234567890abcdef0

  • /dev/sdj=:100

この AMI から起動したインスタンスに /dev/sdj がアタッチされないようにするには、次のマッピングを使用します。

{ "DeviceName": "/dev/sdj", "NoDevice": "" }

/dev/sdh のサイズを 300 GiB に増やすには、次のマッピングを指定します。デバイス名を指定することでボリュームを特定できるため、/dev/sdh のスナップショット ID を指定する必要はありません。

{ "DeviceName": "/dev/sdh", "Ebs": { "VolumeSize": 300 } }

インスタンスの起動時にルートボリュームのサイズを増やすには、最初に AMI の ID を指定して describe-images を呼び出し、ルートボリュームのデバイス名を確認します。たとえば、"RootDeviceName": "/dev/xvda" と指定します。ルートボリュームのサイズを上書きするには、AMI が使用しているルートデバイスのデバイス名と、新しいボリュームサイズを指定します。

{ "DeviceName": "/dev/xvda", "Ebs": { "VolumeSize": 100 } }

追加インスタンスストアボリューム /dev/sdc をアタッチするには、次のマッピングを指定します。インスタンスタイプが複数のインスタンスストアボリュームをサポートしていない場合、このマッピングは効果がありません。インスタンスが NVMe インスタンスストアボリュームをサポートしている場合、これらのボリュームは自動的に列挙され、NVMe デバイス名が割り当てられます。

{ "DeviceName": "/dev/sdc", "VirtualName": "ephemeral1" }

AWS Tools for Windows PowerShell を使用してボリュームをインスタンスに追加するには

New-EC2Instance コマンド (-BlockDeviceMapping) で AWS Tools for Windows PowerShell パラメータを使用します。

実行中のインスタンスのブロックデバイスマッピングの更新

modify-instance-attribute AWS CLI コマンドを使用して、実行中のインスタンスのブロックデバイスマッピングを更新できます。この属性を変更する前に、インスタンスを停止する必要はありません。

aws ec2 modify-instance-attribute --instance-id i-1a2b3c4d --block-device-mappings file://mapping.json

たとえば、インスタンスの終了時にルートボリュームを保持するには、mapping.json で以下を指定します。

[ { "DeviceName": "/dev/sda1", "Ebs": { "DeleteOnTermination": false } } ]

または、Edit-EC2InstanceAttribute コマンド (-BlockDeviceMapping) で AWS Tools for Windows PowerShell パラメータを使用することもできます。

インスタンスブロックデバイスマッピングの EBS ボリュームの表示

インスタンスにマッピングされた EBS ボリュームを簡単に列挙できます。

注記

2009 年 10 月 31 日 API のリリースよりも前に起動されたインスタンスについては、AWS では、ブロックデバイスマッピングを表示できません。AWS がブロックデバイスマッピングを表示できるようにするには、ボリュームをデタッチしてから再アタッチする必要があります。

コンソールを使用してインスタンスの EBS ボリュームを表示するには

  1. Amazon EC2 コンソールを開きます。

  2. ナビゲーションペインで、[インスタンス] を選択します。

  3. 検索ボックスに「ルートデバイスタイプ」と入力し、[EBS] を選択します。これにより、EBS-backed インスタンスのリストが表示されます。

  4. 目的のインスタンスを選択し、[ストレージ] タブに表示された詳細を確認します。少なくとも、ルートデバイスでは次の情報を使用できます。

    • ルートデバイスタイプ (例: EBS)

    • [ルートデバイス名] (例: /dev/xvda)

    • [ブロックデバイス] (例: /dev/xvda/dev/sdf/dev/sdj)

    インスタンスがブロックデバイスマッピングを使用して追加の EBS ボリュームで起動した場合は、[ブロックデバイス] の下に表示されます。このタブには、インスタンスストアボリュームは表示されません。

  5. EBS ボリュームに関する追加情報を表示するには、そのボリューム ID を選択して [ボリューム] ページに移動します。詳細については、「Amazon EBS ボリュームに関する情報の表示」を参照してください。

コマンドラインを使用してインスタンスの EBS ボリュームを表示するには

describe-instances (AWS CLI) コマンドまたは Get-EC2Instance (AWS Tools for Windows PowerShell) コマンドを使用して、インスタンスのブロックデバイスマッピングで EBS ボリュームを列挙します。

インスタンスストアボリュームのインスタンスブロックデバイスマッピングの表示

インスタンスのブロックデバイスマッピングを表示した場合、EBS ボリュームのみが表示され、インスタンスストアボリュームは表示されません。インスタンスのインスタンスストアボリュームを表示する方法は、ボリュームタイプによって異なります。

NVMe インスタンスストアボリューム

ブロックデバイスマッピング内の NVMe インスタンスストアボリュームをクエリするには、NVMe コマンドラインパッケージ (nvme-cli) を使用します。パッケージをダウンロードし、インスタンスにインストールした上で、次のコマンドを実行します。

[ec2-user ~]$ sudo nvme list

インスタンスに関する出力例を次に示します。Model 列のテキストは、このボリュームが EBS ボリュームであるか、インスタンスストアボリュームであるかを示します。この例では、/dev/nvme1n1 および /dev/nvme2n1 がインスタンスストアボリュームです。

Node SN Model Namespace ---------------- -------------------- ---------------------------------------- --------- /dev/nvme0n1 vol06afc3f8715b7a597 Amazon Elastic Block Store 1 /dev/nvme1n1 AWS2C1436F5159EB6614 Amazon EC2 NVMe Instance Storage 1 /dev/nvme2n1 AWSB1F4FF0C0A6C281EA Amazon EC2 NVMe Instance Storage 1 ...

HDD もしくは SSD のインスタンスストアボリューム

ブロックデバイスマッピングで HDD もしくは SSD のインスタンスストアボリュームをクエリするには、インスタンスメタデータを使用します。NVMe インスタンスストアボリュームは含まれていません。

インスタンスメタデータのすべてのリクエストの基本 URI は http://169.254.169.254/latest/ です。詳細については、「インスタンスメタデータとユーザーデータ」を参照してください。

まず、実行中にインスタンスに接続します。インスタンスからこのクエリを使用して、そのブロックデバイスマッピングを取得します。

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" –v http://169.254.169.254/latest/meta-data/block-device-mapping/
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/

レスポンスには、インスタンスのブロックデバイスの名前が含まれます。たとえば、instance store Backed m1.small インスタンスの出力は次のようになります。

ami ephemeral0 root swap

ami デバイスは、インスタンスによって判断されるルートデバイスです。インスタンスストアボリュームの名前は ephemeral[0-23] です。swap デバイスはページファイル用です。EBS ボリュームもマップした場合、そのボリュームは、ebs1ebs2 のように表示されます。

ブロックデバイスマッピングの個別のブロックデバイスの詳細を確認するには、ここで示すように、前のクエリにブロックデバイスの名前を追加します。

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" –v http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral0
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral0

インスタンスタイプは、インスタンスに利用できるインスタンスストアボリュームの数を決定します。ブロックデバイスマッピングのインスタンスストアボリュームの数が、インスタンスに利用できるインスタンスストアボリュームの数を超える場合は、追加のボリュームは無視されます。インスタンスにインスタンスストアボリュームを表示するには、lsblk コマンド を実行します。各インスタンスタイプがサポートするインスタンスストアボリュームの数は、「インスタンスストアボリューム」を参照してください。