EC2 Auto Scaling の Instance Refresh Checkpoints をやってみた

EC2 Auto Scaling の Instance Refresh Checkpoints をやってみた

2026.04.06

はじめに

テクニカルサポートの 片方 です。
今回は EC2 Auto Scaling のインスタンスの更新(Instance Refresh)で利用できる Checkpoints (チェックポイント) 機能を、検証環境で試してみました。
インスタンスの更新は、EC2 Auto Scaling グループ内のインスタンスを新しい設定に置き換える機能であり、最小正常率やインスタンスウォームアップを指定することで、サービス影響を抑えながら更新を進められます。
さらに、チェックポイントを使うと更新を途中で一時停止でき、そのタイミングで動作確認を挟めます。
段階的に置き換えを進められるため、「いきなり全台更新するのは不安」という場面で有効な機能です。
今回は AWS CLI を使ってチェックポイント付きのインスタンスの更新を実行し、進み方や停止タイミング、確認しておきたい注意点を見ていきます。

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/asg-adding-checkpoints-instance-refresh.html

インスタンスの更新を使用するとき、段階的にインスタンスを置き換え、進行しながらインスタンスに検証を実行できます。段階的な置き換えを行うには、チェックポイントを追加します。チェックポイントは、インスタンスの更新が一時停止する時点です。チェックポイントを使用すると、Auto Scaling グループの更新の選択方法をより詳細に管理できます。これにより、アプリケーションが確実かつ予測可能な方法で機能することを確認できます。

やってみた (実装してみた)

今回は、起動テンプレートのバージョンを v1 から v2 に切り替え、その差分を EC2 Auto Scaling グループに反映するために、チェックポイント付きのインスタンスの更新(Instance Refresh)を実行してみます。インスタンスの更新は、新しい AMI や User data を反映した起動テンプレートに切り替えたあとで開始でき、開始後は describe-instance-refreshes コマンドで進捗を確認できます。

挙動を分かりやすくするため、EC2 Auto Scaling グループの台数を 4 台にし、MinHealthyPercentage を 75、CheckpointPercentages を [25, 50, 100] としました。4 台構成では 25 % が 1 台に相当し、さらに MinHealthyPercentage: 75 の条件もあるため、段階的に置き換わる様子を観察しやすい構成です。
また、グループサイズに対してチェックポイントの割合が小さすぎると、条件によってはチェックポイントがスキップされることがあるため、今回はその影響を受けにくい値にしています。

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/enable-checkpoints-console-cli.html

今回の検証構成

今回の構成は、できるだけシンプルにしました。

  • 起動テンプレート v1
    User data で簡易的な HTML を配置
    画面に Version 1 と表示する

  • 起動テンプレート v2
    User data の表示内容だけ Version 2 に変更

  • EC2 Auto Scaling グループ
    希望容量: 4
    最小容量: 4
    最大容量: 4

  • インスタンスの更新設定
    InstanceWarmup: 60
    MinHealthyPercentage: 75
    CheckpointPercentages: [25, 50, 100]
    CheckpointDelay: 300

起動テンプレート v1 を作成する

まずは、初期状態として使用する起動テンプレート v1を作成します。今回は、Amazon Linux 2023 を前提に、User data で Apache HTTP Server をインストールし、Version 1 と表示するだけの簡易ページを配置しました。

User data
#!/bin/bash
dnf install -y httpd

cat > /var/www/html/index.html <<'EOF'
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>instance refresh sample</title>
</head>
<body>
  <h1>Version 1</h1>
  <p>EC2 Auto Scaling Instance Refresh Checkpoints sample</p>
</body>
</html>
EOF

systemctl enable httpd
systemctl start httpd

00002
00001

EC2 Auto Scaling グループを作成する

次に、先ほど作成した起動テンプレート v1 を使って、EC2 Auto Scaling グループを作成します。今回は 4 台固定で確認したいため、最小容量、希望容量、最大容量をすべて 4 にそろえます。

構成例は以下の通りです。

  • 起動テンプレート: sample-asg-template
  • 起動テンプレートバージョン: 1
  • 最小容量: 4
  • 希望容量: 4
  • 最大容量: 4
  • ヘルスチェック: EC2

この時点では、Auto Scaling グループ内の 4 台はすべて 起動テンプレート v1 から起動したインスタンスです。Auto Scaling グループの設定を後から変更しても、既存インスタンスは自動では入れ替わらず、新しい設定は以後の起動に反映されます。そのため、既存インスタンスにも新しい設定を適用したい場合に、インスタンスの更新を利用します。

00003
00004

起動テンプレート v2 を作成する

続いて、差分を反映した起動テンプレート v2を作成します。起動テンプレートは作成後に直接編集するのではなく、新しいバージョンを作成して差分を管理します。今回は User data の表示内容だけを Version 2 に変更しました。

00006

User data
#!/bin/bash
dnf install -y httpd

cat > /var/www/html/index.html <<'EOF'
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>instance refresh sample</title>
</head>
<body>
  <h1>Version 2</h1>
  <p>EC2 Auto Scaling Instance Refresh Checkpoints sample</p>
</body>
</html>
EOF

systemctl enable httpd
systemctl start httpd

00005

Auto Scaling グループが参照する起動テンプレートバージョンを更新する

次に、Auto Scaling グループが参照する起動テンプレートバージョンを v2 に切り替えます。これにより、今後起動される新しいインスタンスは v2 を使う状態になります。ただし、この変更だけでは既存の 4 台はそのまま残るため、続けてインスタンスの更新を実行します。

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

念のため EC2 Auto Scaling グループ sample-asg が参照している起動テンプレート名とバージョンを確認します。

AWS CLI コマンド例
aws autoscaling describe-auto-scaling-groups \
  --auto-scaling-group-names sample-asg \
  --query 'AutoScalingGroups[0].LaunchTemplate'
AWS CLI コマンド出力例
{
    "LaunchTemplateId": "lt-02facb9d17633b22d",
    "LaunchTemplateName": "sample-asg-template",
    "Version": "2"
}

確認してみた

チェックポイント付きでインスタンスの更新を開始する

準備ができたら、チェックポイント付きでインスタンスの更新を開始します。今回は以下の条件で実行しました。

  • InstanceWarmup: 60
  • MinHealthyPercentage: 75
  • CheckpointPercentages: [25, 50, 100]
  • CheckpointDelay: 300

CheckpointPercentages は、新しいインスタンスとして置き換わった割合に応じて一時停止するポイントを定義します。また、最後の値は更新完了の基準にもなるため、すべてのインスタンスを置き換えたい場合は最終値を 100 にする必要があります。最終値を 100 未満にすると、その割合に達した時点で処理は停止し、自動では 100 % まで進まないので注意してください。

本検証では、EC2 Auto Scaling グループを作成したリージョンと同じ ap-northeast-1 の CloudShell 環境で実行しました。CloudShell はリージョンごとに利用するため、リージョンの取り違えに注意ください。

config.json を作成する

CloudShell ではホームディレクトリ配下でファイルを作れます。pwd を実行すると、通常は /home/cloudshell-user が作業ディレクトリとして表示されます。
まず、以下のコマンドで config.json を作成します。

コマンド例
cat > config.json <<'EOF'
{
  "AutoScalingGroupName": "sample-asg",
  "Preferences": {
    "InstanceWarmup": 60,
    "MinHealthyPercentage": 75,
    "CheckpointPercentages": [25, 50, 100],
    "CheckpointDelay": 300
  }
}
EOF

ファイル内容を確認する

作成できたら、内容を確認します。

コマンド例
cat config.json

00007

インスタンスの更新を開始する

次に、start-instance-refresh コマンドを実行します。
AWS CLI では、--cli-input-json file://... を使って JSON ファイルを入力として渡せます。

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

成功すると、次のように InstanceRefreshId が返ります。

AWS CLI コマンド出力結果
{
  "InstanceRefreshId": "08b91cf7-8fa6-48e2-9d2e-xxxxxxxxxxxx"
}

進捗を確認する

進捗は、以下のコマンドで確認できます。

AWS CLI コマンド例
aws autoscaling describe-instance-refreshes \
  --auto-scaling-group-name sample-asg
AWS CLI コマンド出力結果例
$ aws autoscaling describe-instance-refreshes \
>   --auto-scaling-group-name sample-asg
{
    "InstanceRefreshes": [
        {
            "InstanceRefreshId": "b032f361-cd52-43dc-a057-9a5c0749afa2",
            "AutoScalingGroupName": "sample-asg",
            "Status": "InProgress",
            "StatusReason": "Waiting at 25 percent for checkpoint delay to pass before continuing. There are 236 seconds left. For example: i-050717b29041a5f91 has not been in service for long enough.",
            "StartTime": "2026-03-29T07:23:45+00:00",
            "PercentageComplete": 25,
            "InstancesToUpdate": 3,
            "Preferences": {
                "MinHealthyPercentage": 75,
                "InstanceWarmup": 60,
                "CheckpointPercentages": [
                    25,
                    50,
                    100
                ],
                "CheckpointDelay": 300,
                "SkipMatching": false,
                "AutoRollback": false,
                "AlarmSpecification": {}
            },
            "Strategy": "Rolling"
        }
    ]
}

見やすく絞るなら、例えば次のようにします。

AWS CLI コマンド例
aws autoscaling describe-instance-refreshes \
  --auto-scaling-group-name sample-asg \
  --query 'InstanceRefreshes[0].{Id:InstanceRefreshId,Status:Status,PercentageComplete:PercentageComplete,InstancesToUpdate:InstancesToUpdate}'
AWS CLI コマンド出力結果例
{
    "Id": "b032f361-cd52-43dc-a057-9a5c0749afa2",
    "Status": "InProgress",
    "PercentageComplete": 25,
    "InstancesToUpdate": 3
}

もちろん、マネジメントコンソール画面では以下のように確認できます。

00008

時間が経過したので、再度コマンドで確認します。

AWS CLI コマンド
~ $ aws autoscaling describe-instance-refreshes \
>   --auto-scaling-group-name sample-asg \
>   --query 'InstanceRefreshes[0].{Id:InstanceRefreshId,Status:Status,PercentageComplete:PercentageComplete,InstancesToUpdate:InstancesToUpdate}'
{
    "Id": "b032f361-cd52-43dc-a057-9a5c0749afa2",
    "Status": "InProgress",
    "PercentageComplete": 25,
    "InstancesToUpdate": 3
}
~ $ aws autoscaling describe-instance-refreshes \
>   --auto-scaling-group-name sample-asg \
>   --query 'InstanceRefreshes[0].{Id:InstanceRefreshId,Status:Status,PercentageComplete:PercentageComplete,InstancesToUpdate:InstancesToUpdate}'
{
    "Id": "b032f361-cd52-43dc-a057-9a5c0749afa2",
    "Status": "InProgress",
    "PercentageComplete": 50,
    "InstancesToUpdate": 2
}
~ $ 

00009

この結果より、PercentageComplete が 25 から 50 に進み、InstancesToUpdate も 3 から 2 に減少していました。マネジメントコンソール側でも同様に進捗が確認できたため、チェックポイント付きの Instance Refresh は正常に開始され、段階的に更新が進んでいることを確認できました。なお、この時点では Status は InProgress であり、最終的な成功判定は Successful になるまで継続して確認します。

AWS CLI コマンド
$ aws autoscaling describe-instance-refreshes \
>   --auto-scaling-group-name sample-asg \
>   --query 'InstanceRefreshes[0].{Id:InstanceRefreshId,Status:Status,PercentageComplete:PercentageComplete,InstancesToUpdate:InstancesToUpdate,StatusReason:StatusReason}'
{
    "Id": "b032f361-cd52-43dc-a057-9a5c0749afa2",
    "Status": "Successful",
    "PercentageComplete": 100,
    "InstancesToUpdate": 0,
    "StatusReason": null
}

Status は Successful、PercentageComplete は 100、InstancesToUpdate は 0 となっていました。これにより、チェックポイント付きで開始した Instance Refresh が正常に完了し、Auto Scaling グループ内のインスタンスがすべて新しい起動テンプレートバージョンに置き換えられたことを確認できました。

0000010
0000011

まとめ

今回は、Amazon EC2 Auto Scaling の Instance Refresh Checkpoints を検証環境で試してみました。起動テンプレート v1 / v2 を用意し、Auto Scaling グループが参照する起動テンプレートバージョンを切り替えたうえで、チェックポイント付きのインスタンスの更新を実行しました。
実際に確認したところ、更新は 25 %、50 % と段階的に進み、最終的に Status: Successful、PercentageComplete: 100 となりました。これにより、チェックポイントを使った段階的なインスタンス更新が意図どおり動作することを確認できました。
段階的に更新を進めたい場合や、更新途中で動作確認を挟みたい場合には、Instance Refresh Checkpoints は有効な選択肢になりそうです。
本ブログが誰かの参考になれば幸いです。

参考資料

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

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

この記事をシェアする

関連記事