【小ネタ】 EC2 Auto Scaling で Auto Scaling グループ配下の EC2 インスタンスを最大 100 台一括終了できるようになったので確認してみた

【小ネタ】 EC2 Auto Scaling で Auto Scaling グループ配下の EC2 インスタンスを最大 100 台一括終了できるようになったので確認してみた

Amazon EC2 Auto Scaling で複数のインスタンスを一度に終了できる新機能が登場しました。今回は、この一括終了機能の基本動作と、異なる Auto Scaling グループに属するインスタンスを混在させた場合の検証結果をお伝えします。
2026.09.01

はじめに

テクニカルサポートの 片方 です。
少し前の 2026 年 8 月 17 日に、Amazon EC2 Auto Scaling で Auto Scaling グループ配下の EC2 インスタンスの終了を一括でリクエストできるようになりました。

https://aws.amazon.com/jp/about-aws/whats-new/2026/08/amazon-ec2-auto-scaling-batch-termination/?utm_source=openai

既存の TerminateInstanceInAutoScalingGroup API では、これまで InstanceId により 1 台ずつインスタンスを指定して終了していました。今回のアップデートにより、InstanceIds に最大 100 台のインスタンス ID を指定して、一度に終了リクエストを実行できるようになりました。
今回は、一括終了の基本動作に加えて、対象の Auto Scaling グループに属さない Instance ID を含めた場合に、同じリクエストに指定した正しいインスタンスまで終了されないか確認してみます。

アップデート概要

従来は、--instance-id オプションで終了対象のインスタンスを 1 台指定していました。

aws autoscaling terminate-instance-in-auto-scaling-group \
  --instance-id i-0123456789abcdef0 \
  --should-decrement-desired-capacity

今回のアップデートでは、--instance-ids オプションに複数のインスタンス ID を指定できます。

複数のインスタンスを指定する場合は、対象の Auto Scaling グループを --auto-scaling-group-name オプションで指定する必要があります。

aws autoscaling terminate-instance-in-auto-scaling-group \
  --instance-ids \
    i-0123456789abcdef0 \
    i-0fedcba9876543210 \
  --auto-scaling-group-name batch-termination-test-asg \
  --should-decrement-desired-capacity

主な仕様は以下のとおりです。

  • 1 回のリクエストで最大 100 台のインスタンスを指定できる
  • --instance-ids を使用する場合は、--auto-scaling-group-name の指定が必要
  • 指定するすべてのインスタンスは、指定した Auto Scaling グループに属している必要がある
  • いずれかのインスタンスが検証に失敗した場合、リクエスト全体が拒否され、インスタンスは終了されない
  • --instance-id--instance-ids は同時に指定できない
  • 終了処理は非同期で実行されるため、API の成功レスポンスはインスタンスの終了完了を意味しない
  • 一括終了でも、ライフサイクルフックは対象インスタンスごとに実行される
  • 一括終了は AWS マネジメントコンソールからは実行できず、AWS CLI、SDK、または API を使用する

なお、--should-decrement-desired-capacity を指定すると、終了したインスタンス数に応じて希望するキャパシティも減少します。一方、--no-should-decrement-desired-capacity を指定した場合、Amazon EC2 Auto Scaling は希望するキャパシティを維持するために置換インスタンスを起動します。

https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-scaling-manually.html

https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_TerminateInstanceInAutoScalingGroup.html

検証環境

CloudShell から AWS CLI を実行して検証します。

  • リージョン: ap-northeast-1
  • AWS CLI: 2.36.32
  • 実行環境: AWS CloudShell
  • OS: Amazon Linux 2023
  • インスタンスタイプ: t3.micro
  • Auto Scaling グループのスケーリングポリシー: 未設定
  • スケジュールされたアクション: 未設定

まず、AWS CLI が一括終了用の --instance-ids オプションと、対象の Auto Scaling グループを指定する --auto-scaling-group-name オプションに対応していることを確認します。

aws --version
aws autoscaling terminate-instance-in-auto-scaling-group help \
  | grep -E "instance-id|instance-ids|auto-scaling-group-name"
実行結果
~ $ aws --version
aws-cli/2.36.32 Python/3.14.6 Linux/6.1.180-225.360.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023
~ $ aws autoscaling terminate-instance-in-auto-scaling-group help | grep -E "instance-id|instance-ids|auto-scaling-group-name"
          [--instance-id <value>]
          [--instance-ids <value>]
          [--auto-scaling-group-name <value>]
       --instance-id (string)
       --instance-ids (list)
       --auto-scaling-group-name (string)
              --instance-id i-061c63c5eb45f0416 \

--instance-ids および --auto-scaling-group-name が表示されました。今回使用した AWS CLI では、一括インスタンス終了に必要なオプションを利用できることを確認しました。

今回は、以下の 2 つの Auto Scaling グループを作成しました。

Auto Scaling グループ 最小キャパシティ 希望するキャパシティ 最大キャパシティ 用途
batch-termination-test-asg 0 2 2 一括終了の対象。EC2 インスタンスを 2 台起動する
other-asg 0 1 1 異常系の検証用。batch-termination-test-asg に属さない EC2 インスタンスを 1 台起動する

検証を単純にするため、各 Auto Scaling グループにはスケーリングポリシーおよびスケジュールされたアクションを設定していません。
今回の異常系では、batch-termination-test-asg に属するインスタンスと、other-asg に属するインスタンスを同時に指定します。
batch-termination-test-asg に対して一括終了を実行する際、other-asg に属するインスタンス ID を含めることで、対象 Auto Scaling グループに属さないインスタンスが指定された場合の挙動を確認します。

0001

batch-termination-test-asg
├─ i-07992e944cafdb703
└─ i-09b0038e04b64209b

other-asg
└─ i-03a3822dbbb3cea72

まずは 2 台を一括終了してみる

まず、batch-termination-test-asg に属する 2 台の EC2 インスタンスを一括終了してみます。
対象のインスタンス ID を取得します。

aws autoscaling describe-auto-scaling-groups \
  --auto-scaling-group-names batch-termination-test-asg \
  --query 'AutoScalingGroups[0].Instances[?LifecycleState==`InService`].InstanceId' \
  --output text \
  --region ap-northeast-1
実行結果
i-07992e9...db703    i-09b0038e...4209b

取得した 2 台のインスタンス ID を --instance-ids に指定して、一括終了します。

今回は、終了したインスタンス数に応じて希望するキャパシティも減少することを確認するため、--should-decrement-desired-capacity を指定します。

aws autoscaling terminate-instance-in-auto-scaling-group \
  --auto-scaling-group-name batch-termination-test-asg \
  --instance-ids \
    i-07992e944cafdb703 \
    i-09b0038e04b64209b \
  --should-decrement-desired-capacity \
  --region ap-northeast-1

実行結果です。Activities に、指定した 2 台それぞれのスケーリングアクティビティが返されました。

実行結果
{
    "Activities": [
        {
            "ActivityId": "72b68147-...-49387ed216e6",
            "AutoScalingGroupName": "batch-termination-test-asg",
            "Description": "Terminating EC2 instance: i-09b0038e...4209b",
            "Cause": "At 2026-08-30T09:05:28Z instance i-07992e9...db703, i-09b0038e...4209b was taken out of service in response to a user request, shrinking the capacity from 2 to 0.",
            "StartTime": "2026-08-30T09:05:28.898000+00:00",
            "StatusCode": "InProgress",
            "Progress": 0,
            "Details": "{\"Availability Zone ID\":\"apne1-az4\",\"Subnet ID\":\"subnet-xxxxxxxxxxxxxxxxx\",\"Availability Zone\":\"ap-northeast-1a\"}"
        },
        {
            "ActivityId": "4ad68147-...-29285301079b",
            "AutoScalingGroupName": "batch-termination-test-asg",
            "Description": "Terminating EC2 instance: i-07992e9...db703",
            "Cause": "At 2026-08-30T09:05:28Z instance i-07992e9...db703, i-09b0038e...4209b was taken out of service in response to a user request, shrinking the capacity from 2 to 0.",
            "StartTime": "2026-08-30T09:05:28.898000+00:00",
            "StatusCode": "InProgress",
            "Progress": 0,
            "Details": "{\"Availability Zone ID\":\"apne1-az1\",\"Subnet ID\":\"subnet-xxxxxxxxxxxxxxxxx\",\"Availability Zone\":\"ap-northeast-1c\"}"
        }
    ]
}

Activities は 2 件返されました。一括終了は 1 回の API リクエストで実行しますが、終了処理はインスタンスごとのスケーリングアクティビティとして管理されることが分かります。
API のレスポンス時点では StatusCodeInProgress でした。終了処理は非同期で実行されるため、Auto Scaling グループのアクティビティ履歴を確認します。
しばらく待つと、2 台の終了アクティビティが Successful になりました。また、希望するキャパシティは 2 から 0 に減少しており、置換インスタンスは起動されませんでした。

0002
0003

別の Auto Scaling グループに属する Instance ID を混ぜて実行してみる

続いて、ドキュメントに記載されている「指定したすべてのインスタンスは、指定した Auto Scaling グループに属している必要がある」という仕様を確認します。
先ほどの正常系で batch-termination-test-asg の希望するキャパシティを 0 にしたため、異常系の検証前に希望するキャパシティを 2 に戻しました。2 台のインスタンスが InService になるまで待機しています。

aws autoscaling set-desired-capacity \
  --auto-scaling-group-name batch-termination-test-asg \
  --desired-capacity 2 \
  --region ap-northeast-1

0004

異常系では、以下の 2 台を指定します。

  • batch-termination-test-asg に属するインスタンス: i-0a11cde8...5e18d
  • other-asg に属するインスタンス: i-03a3822d...cea72

batch-termination-test-asg--auto-scaling-group-name に指定したうえで、other-asg に属するインスタンス ID を含めて実行します。

aws autoscaling terminate-instance-in-auto-scaling-group \
  --auto-scaling-group-name batch-termination-test-asg \
  --instance-ids \
    i-0a11cde8c34b5e18d \
    i-03a3822dbbb3cea72 \
  --should-decrement-desired-capacity \
  --region ap-northeast-1

実行結果です。

実行結果
aws: [ERROR]: An error occurred (ValidationError) when calling the TerminateInstanceInAutoScalingGroup operation: The instance i-03a3822d...cea72 is not part of Auto Scaling group batch-termination-test-asg.

other-asg に属するインスタンスが batch-termination-test-asg に属していないため、ValidationError となり、リクエスト全体が拒否されました。

0005

続いて、batch-termination-test-asg に属する正しいインスタンスに終了処理が開始されていないことを確認します。

aws autoscaling describe-auto-scaling-groups \
  --auto-scaling-group-names batch-termination-test-asg \
  --query 'AutoScalingGroups[0].{DesiredCapacity:DesiredCapacity,Instances:Instances[].[InstanceId,LifecycleState,HealthStatus]}' \
  --output json \
  --region ap-northeast-1
実行結果
{
    "DesiredCapacity": 2,
    "Instances": [
        [
            "i-0a11cde8...5e18d",
            "InService",
            "Healthy"
        ],
        [
            "i-0da858e1...7923",
            "InService",
            "Healthy"
        ]
    ]
}

batch-termination-test-asg の希望するキャパシティは 2 のままであり、同じリクエストに指定した正しいインスタンスも InService のままでした。
また、異常系のリクエストを実行した時刻以降に、batch-termination-test-asg の終了アクティビティは追加されていませんでした。

0006

この結果から、別の Auto Scaling グループに属するインスタンス ID を 1 台含めた場合、リクエスト全体が拒否され、同時に指定した正しいインスタンスに対する終了処理も開始されないことを確認できました。

まとめ

Amazon EC2 Auto Scaling の既存 TerminateInstanceInAutoScalingGroup API が、複数の EC2 インスタンスを一度に終了するバッチ終了に対応しました。
今回、--instance-ids に 2 台のインスタンス ID を指定して実行したところ、1 回のリクエストで各インスタンスに対する終了アクティビティが作成されました。

また、指定した Auto Scaling グループに属さない Instance ID を含めて実行したところ、リクエスト全体が拒否されました。同じリクエストに含めた対象 Auto Scaling グループ配下のインスタンスも InService のままであり、終了アクティビティは開始されませんでした。
複数インスタンスを終了する独自のスケールイン処理では、1 台ずつ API を呼び出すと、途中で失敗した場合に一部のインスタンスだけが終了する可能性があります。バッチ終了を利用することで、対象インスタンスがすべて指定した Auto Scaling グループに属することを確認したうえで、終了処理を開始できます。

一方で、バッチ終了の API レスポンスは終了処理の受付結果です。インスタンスの終了は非同期で進むため、実際の完了確認には Auto Scaling グループのアクティビティ履歴や EC2 インスタンスの状態を確認する必要があります。
ジョブ完了後に複数のワーカーインスタンスをまとめて縮退する場合や、不調な複数インスタンスを置き換える場合に活用できそうです。
本ブログが誰かの参考になれば幸いです。

参考資料

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

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

関連記事