

# AMI で許可されるインスタンスタイプ
<a name="ami-allowed-instance-types"></a>

AMI 所有者として、AMI がサポートするインスタンスタイプとサポートしないインスタンスタイプを指定できます。指定することで、互換性のないインスタンスタイプでの起動を防ぎます。Amazon EC2 は、起動時に許可されるインスタンスタイプを適用します。

例えば、AMI に GPU ハードウェアが必要な場合は、GPU インスタンスタイプのみに制限できます。AMI に特定のインスタンスファミリーとの互換性がない場合は、許可されるインスタンスタイプからそのファミリーを除外できます。

**Topics**
+ [許可されるインスタンスタイプの仕組み](#ami-allowed-instance-types-how-it-works)
+ [AMI で許可されるインスタンスタイプを設定する](#ami-allowed-instance-types-set)
+ [AMI で許可されるインスタンスタイプを表示する](#ami-allowed-instance-types-view)
+ [許可されるインスタンスタイプでの起動動作](#ami-allowed-instance-types-launch-behavior)
+ [考慮事項](#ami-allowed-instance-types-considerations)

## 許可されるインスタンスタイプの仕組み
<a name="ami-allowed-instance-types-how-it-works"></a>

許可されるインスタンスタイプの制御には、AMI の `InstanceTypeSpecification` 属性を使用します。この属性には次の 2 つのリストが含まれます。
+ `SupportedInstanceTypes` – AMI がサポートするインスタンスタイプ。これらのインスタンスタイプのみを AMI で起動できます。
+ `UnsupportedInstanceTypes` – AMI がサポートしないインスタンスタイプ。これらのインスタンスタイプ以外を AMI で起動できます。

Amazon EC2 は、次のロジックを使用して仕様を評価します。
+ `InstanceTypeSpecification` が設定されていない場合、Amazon EC2 はすべてのインスタンスタイプを許可します。これがデフォルトの動作です。
+ `SupportedInstanceTypes` のみが設定されている場合は、指定されたインスタンスタイプのみが許可されます。Amazon EC2 は、これら以外のすべてのインスタンスタイプをブロックします。
+ `UnsupportedInstanceTypes` のみが設定されている場合、Amazon EC2 は、指定されたインスタンスタイプを除くすべてのインスタンスタイプを許可します。
+ 両方のリストが設定されている場合のインスタンスタイプは、`SupportedInstanceTypes` に含まれており、かつ `UnsupportedInstanceTypes` に含まれていない必要があります。

### ワイルドカードのサポート
<a name="ami-allowed-instance-types-wildcards"></a>

どちらのリストも、`*` 文字を使用したワイルドカードパターンをサポートしています。ワイルドカードを使用すると、複数のインスタンスタイプをそれぞれ個別にリストしなくても一致させることができます。

次の表は、ワイルドカードパターンの例を示しています。


| パターン | マッチ | 
| --- | --- | 
| t3.\* | t3 インスタンスファミリー内のすべてのサイズ (t3.micro、t3.small、t3.large など) | 
| p4d.\* | p4d インスタンスファミリー内のすべてのサイズ | 
| g5.\* | g5 インスタンスファミリー内のすべてのサイズ | 
| \*xlarge | すべてのインスタンスファミリー内の任意の xlarge 以上のインスタンスタイプ | 
| \*.12xlarge | すべてのインスタンスファミリー内の任意の 12xlarge インスタンスタイプ | 

## AMI で許可されるインスタンスタイプを設定する
<a name="ami-allowed-instance-types-set"></a>

AMI で許可されるインスタンスタイプは、Amazon EC2 コンソールまたは AWS Command Line Interface (AWS CLI) を使用して設定または変更できます。この手順を実行するには、AMI の所有者である必要があります。

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

**AMI で許可されるインスタンスタイプを設定する**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

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

1. AMI を選択してから、**[アクション]**、**[インスタンスタイプの仕様を管理する]** の順に選択します。

1. **[サポートされるインスタンスタイプ]** または **[サポートされていないインスタンスタイプ]** で **[追加]** を選択します。

1. インスタンスタイプを選択します。

1. **‬[保存‭]** を選択します。

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

**AMI でサポートされるインスタンスタイプを設定する**  
[replace-image-instance-type-specification](https://docs.aws.amazon.com/cli/latest/reference/ec2/replace-image-instance-type-specification.html) コマンドを実行します。以下の例は、`t3.micro` を除くすべての `t3` および `a2` インスタンスタイプを許可します。

```
aws ec2 replace-image-instance-type-specification \
    --image-id {{ami-1234567890abcdef0}} \
    --instance-type-specification '{"SupportedInstanceTypes": ["t3.*", "a2.*"], "UnsupportedInstanceTypes": ["t3.micro"]}'
```

**AMI でサポートされないインスタンスタイプのみを設定する**  
次のコマンドを使用して、特定のインスタンスタイプをブロックすると同時に、ブロックされたもの以外のすべてのインスタンスタイプを許可します。

```
aws ec2 replace-image-instance-type-specification \
    --image-id {{ami-1234567890abcdef0}} \
    --instance-type-specification '{"UnsupportedInstanceTypes": ["t3.micro", "t3.nano"]}'
```

**AMI からインスタンスタイプの仕様を削除する**  
次のコマンドを `--instance-type-specification` を指定せずに使用することで、制限を削除し、すべてのインスタンスタイプを許可します。

```
aws ec2 replace-image-instance-type-specification \
    --image-id {{ami-1234567890abcdef0}}
```

------

## AMI で許可されるインスタンスタイプを表示する
<a name="ami-allowed-instance-types-view"></a>

Amazon EC2 コンソールまたは AWS CLI を使用して、AMI のインスタンスタイプの仕様を表示できます。

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

**AMI で許可されるインスタンスタイプを表示する**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

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

1. AMI を選択します。

1. **[詳細]** タブで、サポートされているインスタンスタイプとサポートされていないインスタンスタイプを確認します。

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

**AMI のインスタンスタイプの仕様を確認する**  
[describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) コマンドを実行します。AMI にインスタンスタイプの仕様がある場合は、レスポンスに `InstanceTypeSpecification` フィールドが含まれます。

```
aws ec2 describe-images \
    --image-ids {{ami-1234567890abcdef0}}
```

以下は、インスタンスタイプの仕様がある AMI の出力例です。

```
{
    "Images": [
        {
            "ImageId": "ami-1234567890abcdef0",
            ...
            "InstanceTypeSpecification": {
                "SupportedInstanceTypes": [
                    {
                        "InstanceType": "t3.*"
                    },
                    {
                        "InstanceType": "a2.*"
                    }
                ],
                "UnsupportedInstanceTypes": [
                    {
                        "InstanceType": "t3.micro"
                    }
                ]
            }
        }
    ]
}
```

------

## 許可されるインスタンスタイプでの起動動作
<a name="ami-allowed-instance-types-launch-behavior"></a>

インスタンスを起動するときは、指定されたインスタンスタイプに AMI のインスタンスタイプの仕様との互換性があるかどうかを Amazon EC2 がチェックします。インスタンスタイプが許可されていない場合、Amazon EC2 は起動をブロックしてエラーを返します。

**例: ブロックされた起動**  
以下のコマンドは、`t3.micro` をサポートしない AMI を使用して `t3.micro` インスタンスの起動を試みます。

```
aws ec2 run-instances \
    --image-id {{ami-1234567890abcdef0}} \
    --instance-type t3.micro
```

Amazon EC2 が以下のエラーを返します。

```
An error occurred (InvalidParameterCombination) when calling the RunInstances operation: This AMI does not support the specified instance type. Check DescribeImages for InstanceTypeSpecification, and try again.
```

このエラーを解決するには、AMI がサポートするインスタンスタイプを選択します。`describe-images` コマンドを使用して、AMI のインスタンスタイプの仕様を表示します。

## 考慮事項
<a name="ami-allowed-instance-types-considerations"></a>

許可されるインスタンスタイプを使用するときは、以下の点に留意してください。
+ デフォルトで、AMI にはインスタンスタイプの仕様が設定されていません。仕様が明示的に設定されるまで、Amazon EC2 はすべてのインスタンスタイプを許可します。
+ インスタンスタイプの仕様を設定または変更できるのは、AMI の所有者のみです。
+ `CopyImage` を使用して AMI をコピーする場合、Amazon EC2 は新しい AMI にインスタンスタイプの仕様を保持します。
+ Amazon EC2 は、インスタンスタイプの仕様をハードブロックとして適用します。インスタンスタイプが許可されていない場合、起動は `InvalidParameterCombination` エラーで失敗します。
+ 仕様は既存のインスタンスには影響せず、新しい起動のみに適用されます。
+ 設定したインスタンスタイプが許可されていない場合は、インスタンスタイプの仕様が設定された AMI を参照する起動テンプレートと Auto Scaling グループが失敗する可能性があります。共有 AMI で仕様を設定する前に、互換性を確認することをお勧めします。
+ `ReplaceImageInstanceTypeSpecification` アクションは仕様全体を置き換えます。個々のインスタンスタイプを追加または削除するには、更新された完全な仕様をリクエストに含める必要があります。