CloudFormation StackSets でドリフトを検出する方法 ── 複数リージョンに配ったリソースの手動変更を見つける
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京)を管理リージョンとし、ap-northeast-3(大阪)にも配る - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| IAM ロール(管理ロール) | AWSCloudFormationStackSetAdministrationRole | 信頼: cloudformation.amazonaws.com。許可: AWSCloudFormationStackSetExecutionRole への sts:AssumeRole | AWS IAM でユーザー・ロール・ポリシーを作成しアクセス制御する |
| IAM ロール(実行ロール) | AWSCloudFormationStackSetExecutionRole | 信頼: 自分のアカウント。許可: cloudformation:* と SSM パラメータの作成・参照・削除 | 同上 |
StackSet で配るテンプレートは次の内容です。soa-stackset-drift.yaml という名前で手元に保存しておきます。
AWSTemplateFormatVersion: "2010-09-09"
Description: soa12 - StackSets drift detection sample (SSM parameters only)
Resources:
LogLevel:
Type: AWS::SSM::Parameter
Properties:
Name: /soa/stackset/log-level
Type: String
Value: INFO
Description: Application log level (managed by StackSets)
MaintenanceMode:
Type: AWS::SSM::Parameter
Properties:
Name: /soa/stackset/maintenance-mode
Type: String
Value: "off"
Description: Maintenance mode switch (managed by StackSets)
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| StackSet | soa-stackset-drift | 東京・大阪にテンプレートを配る |
| スタックインスタンス | 自分のアカウント × ap-northeast-1 / ap-northeast-3 | 各リージョンのスタック(StackSet-soa-stackset-drift-…) |
| SSM パラメータ | /soa/stackset/log-level、/soa/stackset/maintenance-mode(各リージョン) | StackSet が作る。大阪の log-level を手で変える |
手順 1: StackSet を作る
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。上部の検索バーに CloudFormation と入力し、「CloudFormation」を選択します。
左側ナビゲーションの「StackSets」を選択し、「StackSet を作成」をクリックします。以下を設定します。
- アクセス許可: 「セルフサービスのアクセス許可」(既定は「サービスマネージドアクセス許可」なので切り替えます)
- IAM 管理ロール ARN – オプション: 1 つ目のドロップダウンで「IAM Role Name」、2 つ目で
AWSCloudFormationStackSetAdministrationRoleを選択 - IAM 実行ロール名:
AWSCloudFormationStackSetExecutionRole(最初から入っています) - テンプレートの準備: 「テンプレートの準備完了」
- テンプレートソース: 「テンプレートファイルのアップロード」で
soa-stackset-drift.yamlを選択
アップロードすると、テンプレートの S3 URL が表示されます。CloudFormation が自動で作るバケット(cf-templates- で始まる名前)に置かれたものです。
「次へ」をクリックし、StackSet 名に soa-stackset-drift と入力して「次へ」をクリックします(このテンプレートには入力するパラメータはありません)。「スタックセットオプションの設定」はデフォルトのまま「次へ」をクリックします。
手順 2: 東京と大阪にデプロイする
「デプロイオプションの設定」で以下を設定します。
- スタックセットにスタックを追加: 「新しいスタックのデプロイ」のまま
- アカウントの追加: 「スタックをアカウントにデプロイ」を選び、アカウント番号に自分のアカウント ID(12 桁)を入力
- リージョンの指定: 1 行目で「アジアパシフィック (東京)」、行を追加して 2 行目で「アジアパシフィック (大阪)」を選択
- デプロイオプション: その他はデフォルトのまま
「次へ」をクリックし、確認画面で「送信」をクリックします。StackSet の「スタックインスタンス」タブを開き、2 つのスタックインスタンスの「詳細ステータス」が SUCCEEDED になるまで待ちます(1 分ほど。API の list-stack-instances では Status が CURRENT になります)。「ドリフトステータス」はまだ NOT_CHECKED です。
手順 3: 大阪のパラメータを手で変える
画面右上のリージョンを「アジアパシフィック (大阪)」に切り替えます。上部の検索バーに Systems Manager と入力して開き、左側ナビゲーションの「パラメータストア」を選択します。
/soa/stackset/log-level を開き、「編集」をクリックします。値を INFO から DEBUG に書き換えて「変更を保存」をクリックします。CloudFormation を通さない、いわゆる「手で直した」変更です。
手順 4: ドリフト検出を実行する
リージョンを「アジアパシフィック (東京)」に戻し、CloudFormation の「StackSets」から soa-stackset-drift を開きます。「アクション」→「ドリフトの検出」を選択します。
「オペレーション」タブに、タイプ DETECT_DRIFT のオペレーションが表示されます。ステータスが SUCCEEDED になるまで、1 分ほど待ちます。
「スタックインスタンス」タブを開くと、大阪(ap-northeast-3)の「ドリフトステータス」が DRIFTED、東京(ap-northeast-1)が IN_SYNC になっています。「StackSet の情報」(概要)でも、StackSet 全体のドリフトステータスが DRIFTED になっています。
手順 5: どのプロパティが変わったかを確認する
「オペレーション」タブでドリフト検出のオペレーションを選択し、「ドリフトの詳細を表示」をクリックすると、同期中のインスタンスが 1、ドリフトしたインスタンスが 1 と表示されます。閉じたら、オペレーションタブの下のスタックインスタンスの表で大阪を選び、「ドリフト結果を表示」をクリックします。「リソースのドリフトステータス」に、LogLevel(/soa/stackset/log-level)が MODIFIED、MaintenanceMode が IN_SYNC と並びます。
LogLevel を選んで「ドリフトの詳細を表示」をクリックすると、「ドリフトの詳細」の画面の「違い」の表に、Value プロパティの期待値 INFO と現在の値 DEBUG が並んで表示されます。
同じ結果は CloudShell からも確認できます。
aws cloudformation list-stack-instances \
--stack-set-name soa-stackset-drift \
--filters Name=DRIFT_STATUS,Values=DRIFTED \
--query 'Summaries[].[Region,DriftStatus,LastDriftCheckTimestamp]' --output table
大阪の 1 行だけが DRIFTED として表示されます。