State Manager で EC2 設定を自動化管理
本記事では AWS Systems Manager の State Manager 機能を紹介し、Association を使って EC2 の望ましい状態を継続的に維持し、定期的なパスワード更新などの自動化タスクを実現する方法を解説します。
前回の記事では、Run Command を使って複数の EC2 に一括でコマンドを実行する方法を紹介しました。
しかし、特定の設定を「継続的に維持」したい場合や、「定期的にタスクを実行」したい場合、Run Command だけでは不便です。
そんな時に役立つのが State Manager です。
State Manager とは
State Manager は AWS Systems Manager の機能の一つで、EC2 の「望ましい状態」を定義し、スケジュールやイベントトリガーで指定した SSM Document を自動実行して、その状態を維持できます。
簡単に言えば、State Manager は「スケジュール可能でバージョン管理できる Run Command」です。
State Manager と Run Command の違い
| 特徴 | Run Command | State Manager |
|---|---|---|
| 実行方法 | 手動または EventBridge でスケジュール | Association 作成後に自動実行 |
| バージョン管理 | 標準では不可 | Association のバージョン管理が可能 |
| 実行履歴 | 実行ログを保持 | ログとコンプライアンス追跡を保持 |
| 対象管理 | 毎回指定が必要 | タグやリソースグループで動的選択 |
| 利用シーン | 単発・臨時タスク | 継続的・定期的タスク |
State Manager のコア概念:Association
State Manager で作成する各自動化タスクは Association(関連付け)と呼ばれます。
Association には以下が含まれます:
- SSM Document:実行するスクリプトやコマンド
- 対象(Targets):適用する EC2 インスタンス
- スケジュール(Schedule):実行頻度
- パラメータ(Parameters):Document に必要な入力値
Association を作成すると、Systems Manager がスケジュールに従って自動実行し、各実行の状態を追跡します。
実例:EC2 パスワードの定期更新
例えば、毎月 Web サーバーのローカルアカウントのパスワードを自動で更新したい場合、State Manager を使うと EventBridge + Run Command より管理が簡単です。
ステップ 1:SSM Document の準備
AWS 標準の AWS-RunShellScript(Linux)や AWS-RunPowerShellScript(Windows)を使うか、カスタム Document を作成します。
Linux で webuser のパスワードを更新する例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
schemaVersion: '2.2'
description: Update webuser password
parameters:
NewPassword:
type: String
description: New password for webuser
noEcho: true
mainSteps:
- action: aws:runShellScript
name: updatePassword
inputs:
runCommand:
- |
echo 'webuser:' | chpasswd
echo "Password updated successfully"
ステップ 2:Association の作成
AWS コンソールの場合:
- Systems Manager > State Manager を開く
- Create association をクリック
- 上記のカスタム Document を選択
- Targets で対象を選択:
- 特定の Instance ID
- またはタグで動的選択(例:
Environment=ProductionかつRole=WebServer)
- Schedule を設定(例:
cron(0 2 1 * ? *)は毎月1日午前2時) - Parameters に新しいパスワードを入力(Parameter Store/Secrets Manager 参照も可)
- Create association をクリック
AWS CLI の場合:
1
2
3
4
5
6
7
aws ssm create-association \
--name "UpdateWebUserPassword" \
--document-name "Custom-UpdatePassword" \
--targets "Key=tag:Role,Values=WebServer" \
--schedule-expression "cron(0 2 1 * ? *)" \
--parameters "NewPassword=SecurePass123!" \
--association-name "MonthlyPasswordRotation"
ステップ 3:実行状況の確認
Association 作成後、以下が確認できます:
- Status:Success / Failed / Pending
- Last execution time:最終実行時刻
- Compliance status:準拠しているインスタンス数
失敗時は詳細なエラーメッセージも確認可能です。
Association のバージョン管理
State Manager の大きな利点はバージョン管理です。Association の設定(スケジュール・パラメータ・対象)を変更するたびに新しいバージョンが作成されます。
- 過去バージョンの確認
- 差分の比較
- 以前のバージョンへのロールバック
大規模環境での変更追跡に非常に便利です。
EventBridge + Run Command だけではダメ?
EventBridge で Run Command を定期実行すれば十分では?
技術的には可能ですが、State Manager には以下の利点があります:
- 統一管理画面:すべてのスケジュールタスクを一箇所で確認可能
- バージョン管理:Association 設定の変更履歴を追跡
- コンプライアンス追跡:成功・失敗したインスタンス数を確認
- 動的ターゲット:タグに一致する新規 EC2 が自動的に対象に含まれる
- 自動リトライ機能:失敗した実行を自動的に再試行
単純なタスクなら EventBridge でも問題ありませんが、複雑・大規模な管理には State Manager の方が整理しやすいです。
State Manager の主な利用例
1. セキュリティパッチの定期適用
1
2
3
4
aws ssm create-association \
--name "AWS-RunPatchBaseline" \
--targets "Key=tag:Environment,Values=Production" \
--schedule-expression "cron(0 3 ? * SUN *)"
毎週日曜午前3時に Patch Manager を自動実行。
2. サービスの常時稼働監視
1
2
3
4
5
6
7
8
9
10
11
12
mainSteps:
- action: aws:runShellScript
name: ensureServiceRunning
inputs:
runCommand:
- |
if ! systemctl is-active --quiet nginx; then
systemctl start nginx
echo "Nginx was down, restarted"
else
echo "Nginx is running"
fi
30分ごとに Nginx の稼働を確認し、停止していれば自動起動。
3. 一時ファイルの定期削除
1
2
3
4
5
aws ssm create-association \
--name "AWS-RunShellScript" \
--targets "Key=instanceids,Values=i-1234567890abcdef0" \
--schedule-expression "rate(7 days)" \
--parameters 'commands=["find /tmp -type f -mtime +7 -delete"]'
/tmp 配下の7日以上前のファイルを毎週削除。
Association 実行履歴の確認方法
コンソール
- Systems Manager > State Manager を開く
- 対象 Association を選択
- Execution history タブに切り替え
- 実行時刻・状態・対象数を確認
CLI
1
2
3
aws ssm describe-association-execution-targets \
--association-id "<association-id>" \
--execution-id "<execution-id>"
トラブルシューティング
1. Association が Pending のまま
- SSM Agent が未接続
- IAM Role 権限不足
- スケジュール未到達
2. エラーが出ないのに失敗
- Document の構文確認
- パラメータの渡し方確認
- EC2 上の SSM Agent ログ確認:
/var/log/amazon/ssm/amazon-ssm-agent.log
3. 今すぐ Association を実行したい
apply-association-now を利用:
1
2
aws ssm start-associations-once \
--association-ids "<association-id>"
Parameter Store との連携
Document でパスワード等の機密パラメータが必要な場合、Association に直接書かず、Parameter Store や Secrets Manager に保存しましょう。
例:
1
2
3
4
5
6
7
8
9
10
11
# まずパスワードを Parameter Store に保存
aws ssm put-parameter \
--name "/app/webuser/password" \
--value "SecurePass123!" \
--type "SecureString"
# Association 作成時に参照
aws ssm create-association \
--name "Custom-UpdatePassword" \
--targets "Key=tag:Role,Values=WebServer" \
--parameters "NewPassword="
メリット:
- 機密情報の一元管理
- KMS で暗号化
- IAM で細かくアクセス制御
まとめ
State Manager は Systems Manager の強力な機能で、
- EC2 の望ましい状態を定義・維持
- バージョン管理で変更履歴を追跡
- 動的ターゲットで新規インスタンスにも自動適用
- 自動化タスクの状態を一元監視
Run Command や EventBridge 単体よりも、長期・定期タスクの管理に最適です。
まずはログ削除やサービス監視など簡単なシナリオから始め、徐々に複雑な自動化へ発展させましょう。
参考資料
- AWS Systems Manager State Manager: https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-state.html
- State Manager の Association について: https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-state-about.html
- Association の作成(コンソール): https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-state-assoc.html
- SSM Document 構文: https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/documents-syntax.html