リージョン、AZで使用可能なインスタンスタイプを調査する

2023/05/30に公開

背景

スポットインスタンスを使っているのですが、
不意に停止されたときのことを考えてスペアのインスタンスタイプを控えておくことにしました。

しかしそのインスタンスタイプがリージョン、AZで使用できないと意味がないため
対象のインスタンスタイプがリージョン、AZに対応しているか調査してみます。

流れ

コンソール、awscliで調べられるらしいので、それぞれで方法を探します。

環境

$ aws --version
aws-cli/2.11.2 Python/3.11.2 Linux/5.4.0-148-generic exe/x86_64.ubuntu.20 prompt/off

コンソール

手順

EC2コンソールから参照可能です。

  • ログイン
  • 探したいリージョンに移動
  • InstanceTypesを選択
  • 探したいインスタンスタイプでフィルタ
  • Networking > Availability zonesに記載があります

この図から、インスタンスタイプt3.xlargeが東京リージョンa,c,dで使用可能であることがわかります。

インスタンスタイプは複数指定可能

フィルタに必要なインスタンスタイプは複数でも可能です。
3つ指定したらこのような比較画面になりました。(はじめてみた...)

この図から、インスタンスタイプt3a.xlargeは東京リージョンcだと使用出来ないことがわかります。

awscli

awscliではdescribe-instance-type-offeringsAPIを使うことで調査することができます。
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-instance-type-offerings.html

リファレンスにあるサンプルを使って試してみたいと思います。

リージョンで有効なインスタンスタイプをすべて出力

--regionで探したいリージョンを指定すればOKです。

$ aws ec2 describe-instance-type-offerings --region ap-northeast-1
{
    "InstanceTypeOfferings": [
        {
            "InstanceType": "r5a.4xlarge",
            "LocationType": "region",
            "Location": "ap-northeast-1"
        },
        {
            "InstanceType": "r3.2xlarge",
            "LocationType": "region",
            "Location": "ap-northeast-1"
        },
...

今後の例も同様ですが、返ってくるのはjson形式かつ複数の値が返ってくるため、
適宜フィルタが必要です。

AZで有効なインスタンスタイプをすべて出力

探したいリージョン、AZをコマンドにのっける必要があります。

$ aws ec2 describe-instance-type-offerings \
>     --location-type availability-zone \
>     --filters Name=location,Values=ap-northeast-1a \
>     --region ap-northeast-1
{
    "InstanceTypeOfferings": [
        {
            "InstanceType": "r5a.2xlarge",
            "LocationType": "availability-zone",
            "Location": "ap-northeast-1a"
        },
        {
            "InstanceType": "r5dn.metal",
            "LocationType": "availability-zone",
            "Location": "ap-northeast-1a"
        },
...

リージョン内で指定したインスタンスタイプが有効か調べる

今度はリージョンとインスタンスタイプを使います。
先程のサンプルでは--filtersでAZを指定していましたが、今回はインスタンスタイプを指定します。

$ aws ec2 describe-instance-type-offerings \
>     --filters Name=instance-type,Values=c5* \
>     --query "InstanceTypeOfferings[].InstanceType" \
>     --region ap-northeast-1
[
    "c5n.18xlarge",
    "c5d.metal",
    "c5d.9xlarge",
    "c5d.12xlarge",
    "c5a.large",
    "c5.metal",
    "c5.4xlarge",
    "c5a.24xlarge",
    "c5d.4xlarge",
    "c5d.large",
    "c5a.12xlarge",
    "c5.18xlarge",
    "c5d.18xlarge",
    "c5d.2xlarge",
    "c5d.xlarge",
    "c5n.large",
    "c5.large",
    "c5n.9xlarge",
    "c5n.metal",
    "c5.12xlarge",
    "c5a.4xlarge",
    "c5a.2xlarge",
    "c5.xlarge",
    "c5a.16xlarge",
    "c5.2xlarge",
    "c5n.xlarge",
    "c5.24xlarge",
    "c5n.2xlarge",
    "c5a.xlarge",
    "c5n.4xlarge",
    "c5.9xlarge",
    "c5d.24xlarge",
    "c5a.8xlarge"
]

複数条件のフィルタは可能?

--filtersで複数指定すればOKです。
ここではAZとインスタンスタイプの2つでフィルタリングをしています。

aws ec2 describe-instance-type-offerings \
     --location-type availability-zone \
     --filters Name=location,Values=ap-northeast-1a Name=instance-type,Values=c5*\
     --region ap-northeast-1

ここまでできたらあとはjsonをわかりやすくする処理を加えればOKですね。

参考

https://dev.classmethod.jp/articles/tsnote-az-ec2-instance-types/
https://repost.aws/ja/knowledge-center/ec2-instance-type-not-supported-az-error

Discussion