EC2 Auto Scaling Instance Refresh の SkipMatching を検証してみた

EC2 Auto Scaling Instance Refresh の SkipMatching を検証してみた

2026.03.08

はじめに

テクニカルサポートの 片方 です。
EC2 Auto Scaling Instance Refresh で “スキップマッチング(SkipMatching)” を検証する機会があったのでご紹介します。
本機能は一言でまとめると、「既に最新設定になっているインスタンスは置き換えない」ための機能です。
そのため、スキップマッチング(SkipMatching)を有効にした場合は以下の利点が考えられます。

  • 古い設定のインスタンスだけ置き換える
  • すでに新しい設定のインスタンスはそのまま残す
  • 不要な再起動・再作成を防げる
  • ダウンタイム・コスト削減

例)

  • 起動テンプレート v1 → v2 に変更
  • でも一部はすでに v2 で起動している

このとき以下のようになります。

設定 結果
SkipMatching なし 全インスタンス置き換え
SkipMatching あり v1 だけ置き換え、v2 はそのまま

https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-instance-refresh-skip-matching.html

やってみた

ドキュメントを参考にやってみます。
SkipMatching はタグではなく、DesiredConfiguration(起動テンプレートやインスタンスタイプなど)の一致を基準に判定されます。本検証では視覚確認のためタグを使用しています。

実際の判定は、EC2 Auto Scaling グループの DesiredConfiguration(起動テンプレート、バージョン、MixedInstancesPolicy など)との一致に基づいて行われます。

検証環境構築

今回は、主に AWS CLI コマンドを利用して検証しました。

  1. 起動テンプレート v1 を作成します。
    こちらでは、タグで Version=v1 を付与しています。
AWS CLI コマンド例
aws ec2 create-launch-template \
  --launch-template-name skipmatch-test \
  --version-description v1 \
  --launch-template-data '{
    "ImageId":"ami-xxxxxxxx",
    "InstanceType":"t3.micro",
    "TagSpecifications":[{
      "ResourceType":"instance",
      "Tags":[{"Key":"Version","Value":"v1"}]
    }]
  }'
  1. EC2 Auto Scaling グループの作成をします。
    こちらで起動された EC2 インスタンス 3 台全部に v1 タグが付与されます。
AWS CLI コマンド例
aws autoscaling create-auto-scaling-group \
  --auto-scaling-group-name skipmatch-asg \
  --launch-template LaunchTemplateName=skipmatch-test,Version=1 \
  --min-size 3 \
  --max-size 3 \
  --desired-capacity 3 \
  --vpc-zone-identifier subnet-xxxx
  1. 起動テンプレート v2 を作成します。
    こちらでは、タグのみ Version=v2 に変更しています。
AWS CLI コマンド例
aws ec2 create-launch-template-version \
  --launch-template-name skipmatch-test \
  --version-description v2 \
  --source-version 1 \
  --launch-template-data '{
    "TagSpecifications":[{
      "ResourceType":"instance",
      "Tags":[{"Key":"Version","Value":"v2"}]
    }]
  }'

02

  1. 1 台だけ先に v2 起動テンプレートで起動します。
    MaxSize と DesiredCapacity を 4 にしてスケールアウト (新規起動) します。
AWS CLI コマンド例
aws autoscaling update-auto-scaling-group \
  --auto-scaling-group-name skipmatch-asg \
  --max-size 4 \
  --desired-capacity 4

01

これで準備は完了しました。

検証してみた

https://docs.aws.amazon.com/cli/latest/reference/autoscaling/start-instance-refresh.html

以下の挙動を確認します。

SkipMatching = false
SkipMatching = true

検証① SkipMatching = false(全置換)

まずは違いを確認するため、SkipMatching = false で実行します。
事前確認として、InstanceId といった情報を取得します。

AWS CLI コマンド例
aws ec2 describe-instances \
  --filters Name=tag:Version,Values=v1,v2 \
  --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Version`].Value|[0]]' \
  --output table
検証時の出力
~ $ aws ec2 describe-instances \
>   --filters Name=tag:Version,Values=v1,v2 \
>   --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Version`].Value|[0]]' \
>   --output table
-------------------------------
|      DescribeInstances      |
+-----------------------+-----+
|  i-05e51243ff508aa71  |  v2 |
|  i-01b40c4aff0700ea1  |  v1 |
|  i-0f4425f068e9b06c3  |  v1 |
|  i-02a873af5a2c99422  |  v1 |
+-----------------------+-----+

config.json を作成します。本検証時では CloudShell 環境で実行しています。
以下をそのまま貼り付ければ、作成されます。

config.json
cat <<EOF > config.json
{
  "AutoScalingGroupName": "skipmatch-asg",
  "DesiredConfiguration": {
    "LaunchTemplate": {
      "LaunchTemplateName": "skipmatch-test",
      "Version": "2"
    }
  },
  "Preferences": {
    "SkipMatching": false
  }
}
EOF

作成されているか確認します。

cat config.json

コマンドを実行して、
「skipmatch-asg という EC2 Auto Scaling グループに所属する EC2 インスタンスを、起動テンプレート version 2 に合わせて更新します。
こちらでは、すでに一致している EC2 インスタンスも含めて、すべて置き換えます(SkipMatching = false)。

AWS CLI コマンド例
aws autoscaling start-instance-refresh \
  --cli-input-json file://config.json

コマンド実行後、置き換えが開始されます。

03

対象 EC2 Auto Scaling グループでも進捗などを確認できます。

04

また、AWS CLI コマンドでも確認可能です。

AWS CLI コマンド ~ 出力例
aws autoscaling describe-instance-refreshes \
  --auto-scaling-group-name skipmatch-asg

{
    "InstanceRefreshes": [
        {
            "InstanceRefreshId": "616de2ef-12ae-4116-8a37-99b65ba10d0f",
            "AutoScalingGroupName": "skipmatch-asg",
            "Status": "InProgress",
            "StatusReason": "Waiting for remaining instances to be available. For example: i-06c47aa5ea19f4780 has insufficient data to evaluate its health with Amazon EC2.",
            "StartTime": "2026-03-08T01:53:04+00:00",
            "PercentageComplete": 63,
            "InstancesToUpdate": 2,
            "Preferences": {
                "MinHealthyPercentage": 90,
                "InstanceWarmup": 0,
                "SkipMatching": false,
                "AutoRollback": false,
                "AlarmSpecification": {}
            },
            "DesiredConfiguration": {
                "LaunchTemplate": {
                    "LaunchTemplateId": "lt-01b635e80f2601cdb",
                    "LaunchTemplateName": "skipmatch-test",
                    "Version": "2"
                }
            },
            "Strategy": "Rolling"
        }
    ]
}
(END)

完了したので、確認します。

05

結果、既に v2 起動テンプレートおよび v2 タグだった EC2 インスタンスも含めて全部更新されていることを確認できました。

検証② SkipMatching = true

目的

  • 既に v2 起動テンプレートの EC2 インスタンスは置き換わらない
  • v1 起動テンプレートの EC2 インスタンスだけ置き換わる

この検証では以下の流れで実施します。

  1. もう一度、以下の状態を作る
  • v1 × 3
  • v2 × 1
  1. SkipMatching = true で Instance Refresh 実行
  2. v2 の1台が残ることを確認

それでは、いったん v1 起動テンプレートの EC2 インスタンスに戻します。
今は全部 v2 なので、まず EC2 Auto Scaling グループ を v1 に戻します。
そのため、起動テンプレートを v1 に変更します。

AWS CLI コマンド例
aws autoscaling update-auto-scaling-group \
  --auto-scaling-group-name skipmatch-asg \
  --launch-template LaunchTemplateName=skipmatch-test,Version=1

Instance Refresh(SkipMatching=false)

config.json
cat <<EOF > config.json
{
  "AutoScalingGroupName": "skipmatch-asg",
  "DesiredConfiguration": {
    "LaunchTemplate": {
      "LaunchTemplateName": "skipmatch-test",
      "Version": "1"
    }
  },
  "Preferences": {
    "SkipMatching": false
  }
}
EOF
AWS CLI コマンド例
aws autoscaling start-instance-refresh \
  --cli-input-json file://config.json

これで全台 v1 起動テンプレートで起動および v1 タグが付与された EC2 インスタンスに戻ります。

0113

v2 起動テンプレートで 1 台のみ起動します。
このため、EC2 Auto Scaling グループを v2 に変更します。

AWS CLI コマンド例
aws autoscaling update-auto-scaling-group \
  --auto-scaling-group-name skipmatch-asg \
  --launch-template LaunchTemplateName=skipmatch-test,Version=2

一時的にスケールアウトします。

AWS CLI コマンド例
aws autoscaling update-auto-scaling-group \
  --auto-scaling-group-name skipmatch-asg \
  --max-size 5 \
  --desired-capacity 5

新しく 1 台起動 → v2 タグが付与された状態です。

07

更に、1 台だけ残すためにスケールインします。

AWS CLI コマンド例
aws autoscaling update-auto-scaling-group \
  --auto-scaling-group-name skipmatch-asg \
  --desired-capacity 4

これで以下の状況になっているかと思います。

  • v1 × 3
  • v2 × 1

08
09

事前準備が完了したので、SkipMatching = true に設定して実行します。
スクリーンショットより、この検証時では i-0110baf964d7a7606 以外の他 EC2 インスタンスが v2 起動テンプレートに置き換えられれば成功です。
config.json を再度作成します。

config.json
cat <<EOF > config.json
{
  "AutoScalingGroupName": "skipmatch-asg",
  "DesiredConfiguration": {
    "LaunchTemplate": {
      "LaunchTemplateName": "skipmatch-test",
      "Version": "2"
    }
  },
  "Preferences": {
    "SkipMatching": true
  }
}
EOF
AWS CLI コマンド例
aws autoscaling start-instance-refresh \
  --cli-input-json file://config.json

終了したら、確認します。

10
11

結果、既に v2 起動テンプレートで起動中の i-0110baf964d7a7606 に対して置き換えは発生せず、その他の EC2 インスタンスのみ置き換えが発生することを確認できました。

注意点

ドキュメントには、「ユーザーデータの変更は検知できない」 や 「$Latest / $Default 使用時は再置換の可能性あり」 といった注意点がいくつかあります。こちらを認識の上でご利用ください。

https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-instance-refresh-skip-matching.html

まとめ

SkipMatching は差分更新を実現できる一方で、設定変更の内容によっては期待通りに検知されないケースもあるため、本番環境で利用する場合は事前検証を推奨します。
また、以前に執筆した以下のブログも参考になるかと思いますので、よろしければご覧ください。
本ブログが誰かの参考になれば幸いです。

https://dev.classmethod.jp/articles/ec2-autoscaling-instance-refresh-replace-root-volume/
https://dev.classmethod.jp/articles/ec2-autoscaling-instance-refresh-cancel-rollback/

参考資料

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

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

この記事をシェアする

FacebookHatena blogX

関連記事