Amazon EC2 スポットプレイスメントスコアがローカルゾーンに対応したので確認してみた

Amazon EC2 スポットプレイスメントスコアがローカルゾーンに対応したので確認してみた

AWS EC2のスポットプレイスメントスコアがローカルゾーン対応になったので、実際に使ってみて仕様や使い方をまとめました。
2026.09.29

はじめに

スポットプレイスメントスコアは、スポットインスタンスを起動できる見込みをスコアで返す機能です。2026 年 8 月のアップデートでローカルゾーンも対象になりました。

https://aws.amazon.com/jp/about-aws/whats-new/2026/08/spot-placement-score-local-zones/

確認結果

  • スコアを見たいローカルゾーンをオプトインしていなくても、CLI とコンソールの両方でスコアを取得できました
  • アカウントでどこでもよいので 1 つをローカルゾーンのオプトインしている必要があります

なにが嬉しいのか

従来のスコアはローカルゾーンのキャパシティを含んでいませんでした。今回のアップデートで、ローカルゾーンをアベイラビリティーゾーン(AZ)と同じように見比べられるようになりました。

出番があるのは AZ のスポットで使えるキャパが薄いときです。AZ のスコアが軒並み低くても、ローカルゾーンには容量が残っている可能性があります。スポットリクエストを投げる前に確認できますし、スコアを見たいローカルゾーンを先にオプトインする必要はありません。

ただ、結果の見方には注意が要ります。ローカルゾーンを含めたリージョンスコアはローカルゾーンの容量も足した数字です。スコアが高く出ても、その分がローカルゾーン頼みという可能性があります。ローカルゾーンを使う予定がないならこの数字は当てになりません。

https://dev.classmethod.jp/articles/ec2-spot-instance-placement-score-guide/

仕様と追加パラメータ

GetSpotPlacementScores API に任意のパラメータ IncludeLocalZones(Boolean、既定値 false)が追加されました。AWS CLI では --include-local-zones オプションで指定し、AWS CLI v2 2.36.18 以降で使えます。

スコアには 2 種類あります。--single-availability-zone を付けると AZ ごとのゾーンスコアが、付けないとリージョン単位のリージョンスコアが返ります。公式ドキュメントによると、リージョンスコアは全 AZ にまたがってフリートを組む場合の見込みです。1 つの AZ に全容量を寄せるならゾーンスコアを見ます。--include-local-zones を付けたときの挙動は種別で異なります。

リージョンスコアはローカルゾーンの容量は親リージョンに合算され、ローカルゾーン個別の値は出ないです。ゾーンスコアはスポット容量のあるローカルゾーンのスコアが、個別の値として含まれることがあります。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/how-sps-works.html

検証環境

インスタンスタイプはスポットの在庫が薄そうな GPU 系から 3 種類を選びました。最初は c5.large のような在庫の多い汎用タイプで試しました。どのゾーンもスコアが 9 でおもしろい結果になりませんでした。us-west-2 にはローカルゾーンが 7 つあり、今回はすべてオプトインしていない状態です。ただしアカウント全体では、別リージョンのヒューストン(us-east-1-iah-1)を有効化しています。

項目 値
リージョン us-west-2(オレゴン)
AWS CLI バージョン aws-cli/2.37.3
インスタンスタイプ g4dn.xlarge、g4dn.2xlarge、g5.xlarge
ターゲット容量 10、30、50(units)

オプトイン状態とゾーン ID は次のコマンドで確認できます。

aws ec2 describe-availability-zones --region us-west-2 --all-availability-zones \
  --filters Name=zone-type,Values=local-zone \
  --query 'AvailabilityZones[].[ZoneName,ZoneId,OptInStatus,ParentZoneId]' --output table
実行結果
-------------------------------------------------------------------
|                    DescribeAvailabilityZones                    |
+-------------------+-----------------+---------------+-----------+
|  us-west-2-den-1a |  usw2-den1-az1  |  not-opted-in |  usw2-az4 |
|  us-west-2-hnl-1a |  usw2-hnl1-az1  |  not-opted-in |  usw2-az3 |
|  us-west-2-las-2a |  usw2-las2-az1  |  not-opted-in |  usw2-az1 |
|  us-west-2-lax-1a |  usw2-lax1-az1  |  not-opted-in |  usw2-az2 |
|  us-west-2-lax-1b |  usw2-lax1-az2  |  not-opted-in |  usw2-az4 |
|  us-west-2-phx-2a |  usw2-phx2-az1  |  not-opted-in |  usw2-az2 |
|  us-west-2-sea-1a |  usw2-sea1-az1  |  not-opted-in |  usw2-az1 |
+-------------------+-----------------+---------------+-----------+

ゾーンスコアではローカルゾーンの行がゾーン ID で加わる

まず --include-local-zones を付けずにゾーンスコアを取得します。見比べやすいよう、出力はゾーン ID、リージョン、スコアの 3 列に絞って並べ替えています。usw2-az4 はこの 3 種類を提供しておらず、行が出ませんでした。

aws ec2 get-spot-placement-scores --region us-west-2 \
  --instance-types g4dn.xlarge g4dn.2xlarge g5.xlarge \
  --target-capacity 10 --region-names us-west-2 \
  --single-availability-zone \
  --query 'SpotPlacementScores[].[AvailabilityZoneId,Region,Score]' --output text | sort
実行結果
usw2-az1	us-west-2	9
usw2-az2	us-west-2	1
usw2-az3	us-west-2	7

ここで今回追加された --include-local-zones を付けてみます。ロサンゼルスのローカルゾーン 2 つの行が加わりました。Region は親リージョンの us-west-2 で、ゾーン名は含まれません。

aws ec2 get-spot-placement-scores --region us-west-2 \
  --instance-types g4dn.xlarge g4dn.2xlarge g5.xlarge \
  --target-capacity 10 --region-names us-west-2 \
  --single-availability-zone --include-local-zones \
  --query 'SpotPlacementScores[].[AvailabilityZoneId,Region,Score]' --output text | sort
実行結果
 usw2-az1	us-west-2	9
 usw2-az2	us-west-2	1
 usw2-az3	us-west-2	7
+usw2-lax1-az1	us-west-2	9
+usw2-lax1-az2	us-west-2	6

どの行がローカルゾーンかを示すフィールドは無かったので、ID の lax1 のような部分で見分けます。未オプトインのローカルゾーンもスコアの対象として返りました。AZ の行のスコアはフラグを付けても変わりません。

us-west-2 にはローカルゾーンが 7 つあるのに、返ったのは lax-1 の 2 つだけです。インスタンスタイプを T 系など 13 種類に広げるとusw2-phx2-az1 なども返りました。つまり、そこのゾーンに該当のインスタンスタイプがあれば表示されるということですね。

リージョンスコアではローカルゾーンの行が出ない

--single-availability-zone を外してリージョンスコアを取得します。--include-local-zones を付けても us-west-2 の 1 行だけが返り、ローカルゾーン個別の行は出ませんでした。

aws ec2 get-spot-placement-scores --region us-west-2 \
  --instance-types g4dn.xlarge g4dn.2xlarge g5.xlarge \
  --target-capacity 10 --region-names us-west-2 --include-local-zones
実行結果
{
    "SpotPlacementScores": [
        {
            "Region": "us-west-2",
            "Score": 9
        }
    ]
}

ローカルゾーンを含めるとリージョンスコアが上がる

ここまではターゲット容量 10 で試しました。要求を 30、50 と増やすとどうなるかを見ます。

容量 10 の行は先ほどの結果です。最下行だけは容量 50 をおよそ 20 分後に取り直したものです。

ターゲット容量 usw2-az1 usw2-az2 usw2-az3 usw2-lax1-az1 usw2-lax1-az2
10 9 1 7 9 6
30 5 1 2 9 2
50 3 1 1 8 1
50(約 20 分後) 9 1 9 8 1

AZ のスコアは容量を上げるほど確保が厳しくなるのでスコアは落ちていきます。一方で usw2-lax1-az1 は容量 50 でも 8 のままでした。ローカルゾーンは逆に狙い目なのか!?

その親 AZ である usw2-az2 は 1 です。なお --include-local-zones を付けても、AZ 側の値は変わりませんでした。

20 分置いただけで usw2-az1 は 3 から 9 に、usw2-az3 は 1 から 9 に戻りました。ローカルゾーンは変化なしです。スコアが時間で変わることはドキュメントに記載のとおりです。

Because Spot capacity is constantly fluctuating, the same Spot placement score request can yield different scores when calculated at different times.

出典: How Spot placement score works - Amazon Elastic Compute Cloud

次にリージョンスコアです。--single-availability-zone を外し、フラグの有無を比べます。フラグなしとフラグありは 1 つのコマンドにつないで続けて取得しているので同じ時点の比較になります。

ターゲット容量 フラグなし フラグあり
10 9 9
30 7 9
50 4 9
50(約 20 分後) 9 9

容量 50 でフラグなしが 4、フラグありが 9 になりました。ローカルゾーンの容量が親リージョンに合算されるという公式ドキュメントの説明どおりの動きです。一方で 20 分後は両方 9 で差がなくなりました。AZ も 9 に戻っていました。

ここで注意したいのが、このスコア 9 の中身です。ターゲット容量 50 のときフラグありのリージョンスコアは 9 でした。同じときの AZ のゾーンスコアは 3、1、1 です。9 の大部分を占めていたのは usw2-lax1-az1 の 8 です。ローカルゾーンを含めたリージョンスコアは、そのローカルゾーンを使う前提の数字になります。ローカルゾーンを使わないのであれば、見るべきはフラグなしの 4 のほうです。公式ドキュメントも、リージョンスコアは全 AZ にまたがってフリートを組む前提の値だと説明しています。

マネジメントコンソールから確認

マネジメントコンソールから確認してみます。こちらはローカルゾーンを 1 つ以上有効化しているアカウントでのみ、オプションが使えます。

To include Local Zones when using the Amazon EC2 console, your account must have at least one Local Zone enabled.

出典: Calculate the Spot placement score - Amazon Elastic Compute Cloud

検証アカウントはヒューストン(us-east-1-iah-1)を有効化済みで、この条件を満たしていました。有効化するのはどのローカルゾーンでもよく、スコアを見たいローカルゾーンである必要はありません。オレゴンの lax-1 は未オプトインのままです。

EC2 コンソールのスポットリクエスト画面から「スポットプレースメントスコア」の画面を開きます。要件を入力する前の画面です。スコアオプションに「ローカルゾーンを含める」がありオフになっています。

要件入力前の画面でスコアオプションのローカルゾーンを含めるがオフの状態

「要件を入力」でターゲット容量を 50 インスタンスにします。「インスタンスタイプを手動で選択」から CLI と同じ 3 種類を選びます。「プレースメントスコアを読み込む」で要件を確定します。続く「プレースメントスコア」セクションで「評価するリージョン」に US West (Oregon) を選びます。スコアオプションの次の 2 つをオンにして「プレースメントスコアの計算」を押します。

  • アベイラビリティーゾーンごとにプレースメントスコアを指定
  • ローカルゾーンを含める

CLI と同様にローカルゾーンの表示が増えました。CLI を実行した時刻から 20 分ほど経っているため、スポットのキャパ不足の AZ は回復した後の値です。

ローカルゾーンを含めるをオンにして計算し lax1-az1 が 8 で並んだ結果画面

まとめ

--include-local-zones を付けると、ゾーンスコアにはローカルゾーンの行がゾーン ID で追加されスコアを確認できるようになりました。
ローカルゾーンの利用予定がない場合で、ローカルゾーンを含めてスコアをチェックすると高いスコアがでて利用実態とズレるのでお気をつけください。

おわりに

スポットでの起動率を上げるならローカルゾーンを活用するのもありなのかなと今回はじめてスコアを眺めていて思いました。HPC ワークロードだと海外リージョン使うことよくあるのでスポット起動するときはローカルゾーンの存在を思い出したいです。

参考

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事