EC2 Auto Scaling Instance Refresh の SkipMatching を検証してみた
はじめに
テクニカルサポートの 片方 です。
EC2 Auto Scaling Instance Refresh で “スキップマッチング(SkipMatching)” を検証する機会があったのでご紹介します。
本機能は一言でまとめると、「既に最新設定になっているインスタンスは置き換えない」ための機能です。
そのため、スキップマッチング(SkipMatching)を有効にした場合は以下の利点が考えられます。
- 古い設定のインスタンスだけ置き換える
- すでに新しい設定のインスタンスはそのまま残す
- 不要な再起動・再作成を防げる
- ダウンタイム・コスト削減
例)
- 起動テンプレート v1 → v2 に変更
- でも一部はすでに v2 で起動している
このとき以下のようになります。
| 設定 | 結果 |
|---|---|
| SkipMatching なし | 全インスタンス置き換え |
| SkipMatching あり | v1 だけ置き換え、v2 はそのまま |
やってみた
ドキュメントを参考にやってみます。
SkipMatching はタグではなく、DesiredConfiguration(起動テンプレートやインスタンスタイプなど)の一致を基準に判定されます。本検証では視覚確認のためタグを使用しています。
実際の判定は、EC2 Auto Scaling グループの DesiredConfiguration(起動テンプレート、バージョン、MixedInstancesPolicy など)との一致に基づいて行われます。
検証環境構築
今回は、主に AWS CLI コマンドを利用して検証しました。
- 起動テンプレート v1 を作成します。
こちらでは、タグで Version=v1 を付与しています。
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"}]
}]
}'
- EC2 Auto Scaling グループの作成をします。
こちらで起動された EC2 インスタンス 3 台全部に v1 タグが付与されます。
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
- 起動テンプレート v2 を作成します。
こちらでは、タグのみ Version=v2 に変更しています。
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"}]
}]
}'

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

これで準備は完了しました。
検証してみた
以下の挙動を確認します。
SkipMatching = false
SkipMatching = true
検証① SkipMatching = false(全置換)
まずは違いを確認するため、SkipMatching = false で実行します。
事前確認として、InstanceId といった情報を取得します。
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 環境で実行しています。
以下をそのまま貼り付ければ、作成されます。
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 autoscaling start-instance-refresh \
--cli-input-json file://config.json
コマンド実行後、置き換えが開始されます。

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

また、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)
完了したので、確認します。

結果、既に v2 起動テンプレートおよび v2 タグだった EC2 インスタンスも含めて全部更新されていることを確認できました。
検証② SkipMatching = true
目的
- 既に v2 起動テンプレートの EC2 インスタンスは置き換わらない
- v1 起動テンプレートの EC2 インスタンスだけ置き換わる
この検証では以下の流れで実施します。
- もう一度、以下の状態を作る
- v1 × 3
- v2 × 1
- SkipMatching = true で Instance Refresh 実行
- v2 の1台が残ることを確認
それでは、いったん v1 起動テンプレートの EC2 インスタンスに戻します。
今は全部 v2 なので、まず EC2 Auto Scaling グループ を v1 に戻します。
そのため、起動テンプレートを v1 に変更します。
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name skipmatch-asg \
--launch-template LaunchTemplateName=skipmatch-test,Version=1
Instance Refresh(SkipMatching=false)
cat <<EOF > config.json
{
"AutoScalingGroupName": "skipmatch-asg",
"DesiredConfiguration": {
"LaunchTemplate": {
"LaunchTemplateName": "skipmatch-test",
"Version": "1"
}
},
"Preferences": {
"SkipMatching": false
}
}
EOF
aws autoscaling start-instance-refresh \
--cli-input-json file://config.json
これで全台 v1 起動テンプレートで起動および v1 タグが付与された EC2 インスタンスに戻ります。

v2 起動テンプレートで 1 台のみ起動します。
このため、EC2 Auto Scaling グループを v2 に変更します。
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name skipmatch-asg \
--launch-template LaunchTemplateName=skipmatch-test,Version=2
一時的にスケールアウトします。
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name skipmatch-asg \
--max-size 5 \
--desired-capacity 5
新しく 1 台起動 → v2 タグが付与された状態です。

更に、1 台だけ残すためにスケールインします。
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name skipmatch-asg \
--desired-capacity 4
これで以下の状況になっているかと思います。
- v1 × 3
- v2 × 1


事前準備が完了したので、SkipMatching = true に設定して実行します。
スクリーンショットより、この検証時では i-0110baf964d7a7606 以外の他 EC2 インスタンスが v2 起動テンプレートに置き換えられれば成功です。
config.json を再度作成します。
cat <<EOF > config.json
{
"AutoScalingGroupName": "skipmatch-asg",
"DesiredConfiguration": {
"LaunchTemplate": {
"LaunchTemplateName": "skipmatch-test",
"Version": "2"
}
},
"Preferences": {
"SkipMatching": true
}
}
EOF
aws autoscaling start-instance-refresh \
--cli-input-json file://config.json
終了したら、確認します。


結果、既に v2 起動テンプレートで起動中の i-0110baf964d7a7606 に対して置き換えは発生せず、その他の EC2 インスタンスのみ置き換えが発生することを確認できました。
注意点
ドキュメントには、「ユーザーデータの変更は検知できない」 や 「$Latest / $Default 使用時は再置換の可能性あり」 といった注意点がいくつかあります。こちらを認識の上でご利用ください。
まとめ
SkipMatching は差分更新を実現できる一方で、設定変更の内容によっては期待通りに検知されないケースもあるため、本番環境で利用する場合は事前検証を推奨します。
また、以前に執筆した以下のブログも参考になるかと思いますので、よろしければご覧ください。
本ブログが誰かの参考になれば幸いです。
参考資料
- Use an instance refresh to update instances in an Auto Scaling group - Amazon EC2 Auto Scaling
- Use an instance refresh with skip matching - Amazon EC2 Auto Scaling
- start-instance-refresh — AWS CLI 2.34.4 Command Reference
- EC2 Auto Scaling の Instance Refresh 新機能 「Replace Root Volume」を試してみた | DevelopersIO
- EC2 Auto Scaling Instance Refresh のキャンセルとロールバックの違いを確認しつつ試してみた | DevelopersIO
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました






