

# Amazon EC2 インスタンスへのブロックデバイスマッピングの追加
<a name="instance-block-device-mapping"></a>

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

**制限事項**
+ ルートボリュームの場合、変更できるのはボリュームサイズ、ボリュームタイプ、および [**合わせて削除**] フラグのみです。
+ EBS ボリュームを変更する場合、そのサイズを小さくすることはできません。そのため、指定するスナップショットのサイズはAMI のブロックデバイスマッピングで指定されたスナップショットのサイズ以上であることが必要です。

**Topics**
+ [

## インスタンス起動時のブロックデバイスマッピングの更新
](#Using_OverridingAMIBDM)
+ [

## 実行中のインスタンスのブロックデバイスマッピングの更新
](#update-instance-bdm)
+ [

## インスタンスブロックデバイスマッピングの EBS ボリュームの表示
](#view-instance-bdm)
+ [

## インスタンスストアボリュームのインスタンスブロックデバイスマッピングの表示
](#bdm-instance-metadata)

## インスタンス起動時のブロックデバイスマッピングの更新
<a name="Using_OverridingAMIBDM"></a>

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

------
#### [ Console ]

**起動時にインスタンスのボリュームを更新するには**

1. 手順に沿って[インスタンスを起動](ec2-launch-instance-wizard.md)しますが、次のステップが完了しボリュームが更新されるまで、インスタンスを起動しないでください。

1. (オプション) ボリュームを追加するには、**[ストレージを設定]**、**[新しいボリュームの追加]** を選択します。ボリュームサイズとボリュームタイプを選択します。

1. (オプション) AMI のブロックデバイスマッピングで指定されたボリュームを抑制するには、**[ストレージを設定]**、**[削除]** を選択します。

1. (オプション) EBS ボリュームの設定を変更するには、**[ストレージを設定]** ペインで **[アドバンスト]** を選択します。ボリュームの情報を展開し、必要な変更を加えます。

1. **[Summary]** (概要) パネルでインスタンスの設定を確認し、**[Launch instance]** (インスタンスを起動) を選択してください。詳細については、「[コンソールのインスタンス起動ウィザードを使用して EC2 インスタンスを起動する](ec2-launch-instance-wizard.md)」を参照してください。

------
#### [ AWS CLI ]

**起動時にインスタンスのボリュームを更新するには**  
`--block-device-mappings` オプションで [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) コマンドを使用します。

```
--block-device-mappings file://mapping.json
```

例えば、AMI ブロックデバイスマッピングが以下のように指定しているとします。
+ `/dev/xvda` - EBS ルートボリューム
+ `/dev/sdh` - `snap-1234567890abcdef0` から作成された EBS ボリューム
+ `/dev/sdj` - サイズが `100` の空の EBS ボリューム
+ `/dev/sdb` - インスタンスストアボリューム `ephemeral0`

こちらが、`mapping.json` にあるインスタンスのブロックデバイスマッピングだとします。

```
[
    {
        "DeviceName": "/dev/xvda",
        "Ebs": {
            "VolumeSize": 100
        }
    },
    {
        "DeviceName": "/dev/sdj",
        "NoDevice": ""
    },
    {
        "DeviceName": "/dev/sdh",
        "Ebs": {
            "VolumeSize": 300
        }
    },
    {
        "DeviceName": "/dev/sdc",
        "VirtualName": "ephemeral1"
    }
]
```

このインスタンスブロックデバイスマッピングは、次の操作を行います。
+ ルートボリューム `/dev/xvda` のサイズを上書きして 100 GiB まで増やす。
+ `/dev/sdj` がインスタンスにアタッチされることを防ぐ。
+ `/dev/sdh` のサイズを上書きし、300 GiB に増やす。スナップショットの ID は、再度指定する必要はありません。
+ エフェメラルボリューム、`/dev/sdc` を追加する。インスタンスタイプが複数のインスタンスストアボリュームをサポートしていない場合、これには効果がありません。インスタンスタイプが NVMe インスタンスストアボリュームをサポートしている場合、それらは自動で列挙され、インスタンスブロックデバイスマッピングに追加されて、上書きできなくなります。

------
#### [ PowerShell ]

**起動時にインスタンスのボリュームを更新するには**  
`-BlockDeviceMapping` パラメータと、[New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) コマンドレットと `-BlockDeviceMapping` パラメータを使用します。

```
-BlockDeviceMapping $bdm
```

こちらが、`$bdm` にあるインスタンスのブロックデバイスマッピングだとします。

```
$bdm = @()

$root = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$root.DeviceName = "/dev/xvda"
$ebs1 = New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice
$ebs1.VolumeSize = 100
$root.Ebs = $ebs1
$bdm += $root

$sdj = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$sdj.DeviceName = "/dev/sdj"
$sdj.NoDevice = ""
$bdm += $sdj

$sdh = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$sdh.DeviceName = "/dev/sdh"
$ebs2 = New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice
$ebs2.VolumeSize = 300
$sdh.Ebs = $ebs2
$bdm += $sdh

$sdc = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$sdc.DeviceName = "/dev/sdc"
$sdc.VirtualName = "ephemeral1"
$bdm += $sdc
```

このインスタンスブロックデバイスマッピングは、次の操作を行います。
+ ルートボリューム `/dev/xvda` のサイズを上書きして 100 GiB まで増やす。
+ `/dev/sdj` がインスタンスにアタッチされることを防ぐ。
+ `/dev/sdh` のサイズを上書きし、300 GiB に増やす。スナップショットの ID は、再度指定する必要はありません。
+ エフェメラルボリューム、`/dev/sdc` を追加する。インスタンスタイプが複数のインスタンスストアボリュームをサポートしていない場合、これには効果がありません。インスタンスタイプが NVMe インスタンスストアボリュームをサポートしている場合、それらは自動で列挙され、インスタンスブロックデバイスマッピングに追加されて、上書きできなくなります。

------

## 実行中のインスタンスのブロックデバイスマッピングの更新
<a name="update-instance-bdm"></a>

この属性を変更する前に、インスタンスを停止する必要はありません。

------
#### [ AWS CLI ]

**実行中のインスタンスのブロックデバイスマッピングを更新するには**  
[modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html) コマンドを使用します。

`--block-device-mappings` オプションを追加します。

```
--block-device-mappings file://mapping.json
```

`mapping.json` で、更新を指定します。例えば、次の更新では、ルートボリュームが存続するように変更されます。

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

------
#### [ PowerShell ]

**実行中のインスタンスのブロックデバイスマッピングを更新するには**  
[Edit-EC2InstanceAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceAttribute.html) コマンドレットを使用します。

`-BlockDeviceMapping` オプションを追加します。

```
-BlockDeviceMapping $bdm
```

`bdm` で、更新を指定します。例えば、次の更新では、ルートボリュームが存続するように変更されます。

```
$ebd = New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice
$ebd.DeleteOnTermination = false
$bdm = New-Object -TypeName Amazon.EC2.Model.BlockDeviceMapping
$bdm.DeviceName = "/dev/sda1"
$bdm.Ebs = $ebd
```

------

## インスタンスブロックデバイスマッピングの EBS ボリュームの表示
<a name="view-instance-bdm"></a>

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

------
#### [ Console ]

**インスタンスの EBS ボリュームを表示するには**

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

1. ナビゲーションペインで、[**インスタンス**] を選択してください。

1. インスタンスを選択し、**[ストレージ]** タブに表示された詳細を確認します。少なくとも、ルートボリューム (**ルートデバイス**という用語が**ルートボリューム**と同等である場合) には、次の情報を使用できます。
   + **ルートデバイスタイプ ** (例: **EBS**)
   + [**ルートデバイス名**] (例: `/dev/xvda`)
   + **[ブロックデバイス]** (例: `/dev/xvda`、`/dev/sdf`、`/dev/sdj`)

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

1. EBS ボリュームに関する追加情報を表示するにはそのボリューム ID を選択して [ボリューム] ページに移動します。

------
#### [ AWS CLI ]

**インスタンスの EBS ボリュームを表示するには**  
[describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) コマンドを使用します。

```
aws ec2 describe-instances \
    --instance-ids i-1234567890abcdef0 \
    --query Reservations[*].Instances[0].BlockDeviceMappings
```

------
#### [ PowerShell ]

**インスタンスの EBS ボリュームを表示するには**  
[Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) コマンドレットを使用します。

```
(Get-EC2Instance -InstanceId i-0bac57d7472c89bac).Instances.BlockDeviceMappings
```

------

## インスタンスストアボリュームのインスタンスブロックデバイスマッピングの表示
<a name="bdm-instance-metadata"></a>

インスタンスタイプはインスタンスに利用できるインスタンスストアボリュームの数とタイプを決定します。ブロックデバイスマッピングのインスタンスストアボリュームの数が、インスタンスに利用できるインスタンスストアボリュームの数を超える場合は追加のボリュームは無視されます。インスタンスのインスタンスストアボリュームを表示するには**lsblk** コマンド (Linux インスタンス) を実行するか、**Windows ディスク管理** (Windows インスタンス を開いてください。各インスタンスタイプでサポートされるインスタンスストアボリュームの数については「[Amazon EC2 インスタンスタイプの仕様](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-instance-type-specifications.html)」を参照してください。

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



### NVMe インスタンスストアボリューム
<a name="nvme-instance-store"></a>

#### Linux インスタンス
<a name="nvme-instance-store-linux"></a>

ブロックデバイスマッピング内の NVMe インスタンスストアボリュームをクエリするにはNVMe コマンドラインパッケージ ([nvme-cli](https://github.com/linux-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         ...
```

#### Windows インスタンス
<a name="nvme-instance-store-windows"></a>

Disk Management または PowerShell を使用して、EBS とインスタンスストアの NVMe ボリュームの両方を一覧表示できます。詳細については「[Amazon EC2 Windows インスタンスの NVMe ディスクをボリュームにマッピングする](windows-list-disks-nvme.md)」を参照してください。

### HDD もしくは SSD のインスタンスストアボリューム
<a name="hdd-ssd-instance-store"></a>

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

インスタンスメタデータのすべてのリクエストの基本 URI は `http://169.254.169.254/latest/` です。詳細については「[インスタンスメタデータを使用して EC2 インスタンスを管理する](ec2-instance-metadata.md)」を参照してください。

#### Linux インスタンス
<a name="hdd-ssd-instance-store-linux"></a>

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

------
#### [ 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" 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/
```

------

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

```
ami
ephemeral0
root
swap
```

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

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

------
#### [ 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" 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
```

------

#### Windows インスタンス
<a name="hdd-ssd-instance-store-windows"></a>

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

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/block-device-mapping/
```

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

```
ami
ephemeral0
root
swap
```

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

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

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral0
```