[アップデート]AWS Control TowerでAPIを使ってアカウントごとのControl Towerへの登録状況を確認できるようになりました
お疲れさまです。とーちです。
AWS Control Tower で、API を使ってアカウントごとの Control Tower への登録状況を確認できるようになったというアップデートがありました。実際に試してみたので紹介します。
AWS Control Tower のベースライン準拠状況とは
今までは、Control Tower の各アカウントがベースラインに準拠しているかどうかは以下のようにマネジメントコンソールから確認できました。
このアカウントごとの準拠状況が API でも確認できるようになったというのが、今回のアップデートの大きなところのようです。
なお、API での OU 単位での準拠状況の確認は AWS API Changes を見る限りでは、2024年2月には可能な状態となっていたようです。
Control Tower ベースラインについて
この「ベースラインの状態」について、もう少し詳しく見てみましょう。そもそも AWS Control Tower のベースラインとは、ControlTowerを使用した際にOU やアカウント等のターゲットに対して適用される設定やリソースのことを指しています。設定やリソースとは、例えば OU を Control Tower に登録すると必須コントロールとして SCP 等が設定されますが、そういったもののことです。ベースラインの状態を見ることでそのアカウントが Control Tower により正常に管理されているかどうかを確認できます。
また、ベースラインには大きく以下の2種類のものがあります。
- OU レベルで適用されるベースライン(AWSControlTowerBaseline 等):OU に対して設定するベースライン。Control Tower のコントロールを有効化した際に設定される SCP や Config ルール等を設定するためのベースライン
- ランディングゾーンに適用されるベースライン(AuditBaseline や LogArchiveBaseline 等):Control Tower を有効化すると設定されるベースラインで例えば Audit アカウント設定のための AuditBaseline 等があります
「ベースラインの状態」は API だと ListEnabledBaselines で確認できます。ListEnabledBaselines で確認できるベースラインには主に以下の状態があります(参考:EnablementStatusSummary - AWS Control Tower)
デプロイメント状態(statusSummary)
- SUCCEEDED: ベースラインが正常に適用されている(ベースラインによる設定やリソースが正常にデプロイされた)
- FAILED: ベースラインの適用に失敗した(ベースラインによる設定やリソースのデプロイに失敗した状態)
- UNDER_CHANGE: ベースラインが現在変更中である
ドリフト状態(driftStatusSummary)
OU 内のメンバーアカウントの設定が、親 OU に適用されているベースライン設定と一致しているかどうかを示すステータスです。その関係か、ドリフト状態は上記の2種類のベースラインのうち、OU レベルで適用されるベースラインでのみ表示されます。
以下の状態を持ちます。(参考:EnabledBaselineDriftStatusSummary - AWS Control Tower, EnabledBaselineInheritanceDrift - AWS Control Tower)
- IN_SYNC: アカウントの設定が親 OU の設定と一致している
- DRIFTED: アカウントの設定が親 OU の設定と一致していない
それではさっそくアカウントごとの準拠状況を API(AWS CLI)で確認してみましょう。
やってみた
AWS CLI のバージョンは以下のバージョンで試しています。
> aws --version
aws-cli/2.27.16 Python/3.13.3 Darwin/24.4.0 source/arm64
AWS CLI では list-enabled-baselines というサブコマンドでベースラインの状態を確認できます(以下の表示結果では機微な部分を置き換えています)。
> aws controltower list-enabled-baselines
{
"enabledBaselines": [
{
"arn": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/ENABLEDBASELINE-ID-1",
"baselineIdentifier": "arn:aws:controltower:ap-northeast-1::baseline/BASELINE-ID-1",
"statusSummary": {
"status": "SUCCEEDED"
},
"targetIdentifier": "arn:aws:organizations::ACCOUNT-ID:account/o-ORGANIZATION-ID/ACCOUNT-ID"
},
{
"arn": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/ENABLEDBASELINE-ID-2",
"baselineIdentifier": "arn:aws:controltower:ap-northeast-1::baseline/BASELINE-ID-2",
"statusSummary": {
"status": "SUCCEEDED"
},
"targetIdentifier": "arn:aws:organizations::ACCOUNT-ID:account/o-ORGANIZATION-ID/AUDIT-ACCOUNT-ID"
},
{
"arn": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/ENABLEDBASELINE-ID-3",
"baselineIdentifier": "arn:aws:controltower:ap-northeast-1::baseline/BASELINE-ID-3",
"statusSummary": {
"status": "SUCCEEDED"
},
"targetIdentifier": "arn:aws:organizations::ACCOUNT-ID:account/o-ORGANIZATION-ID/LOG-ACCOUNT-ID"
},
{
"arn": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/ENABLEDBASELINE-ID-4",
"baselineIdentifier": "arn:aws:controltower:ap-northeast-1::baseline/BASELINE-ID-4",
"baselineVersion": "3.0",
"driftStatusSummary": {
"types": {
"inheritance": {
"status": "DRIFTED"
}
}
},
"statusSummary": {
"lastOperationIdentifier": "ou-XXXX-XXXXXXXX-OPERATION-ID",
"status": "FAILED"
},
"targetIdentifier": "arn:aws:organizations::ACCOUNT-ID:ou/o-ORGANIZATION-ID/ou-XXXX-XXXXXXXX"
},
{
"arn": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/ENABLEDBASELINE-ID-5",
"baselineIdentifier": "arn:aws:controltower:ap-northeast-1::baseline/BASELINE-ID-4",
"baselineVersion": "3.0",
"driftStatusSummary": {
"types": {
"inheritance": {
"status": "IN_SYNC"
}
}
},
"statusSummary": {
"lastOperationIdentifier": "ou-XXXX-XXXXXXXX-OPERATION-ID",
"status": "SUCCEEDED"
},
"targetIdentifier": "arn:aws:organizations::ACCOUNT-ID:ou/o-ORGANIZATION-ID/ou-XXXX-XXXXXXXX"
},
// 同様の正常なOUが複数あり
]
}
arn
に記載されているのは enabledbaseline
という特殊な AWS リソースで、OU(組織単位)やアカウントなど、ベースラインが適用されたターゲットごとに一意のARNが発行されるようです。また、targetIdentifier
にはベースラインが適用されているターゲットが記載されています。
上記を見てみると、BASELINE-ID-2 は Audit アカウント用、BASELINE-ID-3 は LogArchive アカウント用であることがわかります。なお、BASELINE-ID-1 は管理アカウント用のベースラインです。
この例だと、BASELINE-ID-4 は「OU レベルで適用されるベースライン」となっており、同じベースラインが複数の OU に適用されているのがわかります。
ENABLEDBASELINE-ID-4 ではドリフト状態が DRIFTED となっていますね。マネジメントコンソール上で同じ OU を見てみると以下のような状態です。なおドリフトの一般的な原因としては手動で Control Tower で作成されたリソースを変更したりする等です。
アカウントレベルでのベースライン状態確認
また、ListEnabledBaselines では、OU だけでなく OU に含まれる AWS アカウントごとの状態も表示できるようになっています。AWS CLI だと以下のように --include-children
オプションを付けます。
> aws controltower list-enabled-baselines --include-children
{
"enabledBaselines": [
// 共有アカウントのベースライン(3件)(内容は上記と同様なので割愛)
// OUのベースライン(問題あり)
{
"arn": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/ENABLED-BASELINE-ID-4",
"baselineIdentifier": "arn:aws:controltower:ap-northeast-1::baseline/BASELINE-ID-4",
"baselineVersion": "3.0",
"driftStatusSummary": {
"types": {
"inheritance": {
"status": "DRIFTED"
}
}
},
"statusSummary": {
"lastOperationIdentifier": "OPERATION-ID-1",
"status": "FAILED"
},
"targetIdentifier": "arn:aws:organizations::ACCOUNT-ID:ou/o-ORG-ID/ou-XXXX-1"
},
// OUのベースライン(正常)
{
"arn": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/ENABLED-BASELINE-ID-5",
"baselineIdentifier": "arn:aws:controltower:ap-northeast-1::baseline/BASELINE-ID-4",
"baselineVersion": "3.0",
"driftStatusSummary": {
"types": {
"inheritance": {
"status": "IN_SYNC"
}
}
},
"statusSummary": {
"lastOperationIdentifier": "OPERATION-ID-2",
"status": "SUCCEEDED"
},
"targetIdentifier": "arn:aws:organizations::ACCOUNT-ID:ou/o-ORG-ID/ou-XXXX-2"
},
// アカウントのベースライン(正常)- 1つの例のみ表示
{
"arn": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/ENABLED-BASELINE-ID-6",
"baselineIdentifier": "arn:aws:controltower:ap-northeast-1::baseline/BASELINE-ID-4",
"baselineVersion": "3.0",
"driftStatusSummary": {
"types": {
"inheritance": {
"status": "IN_SYNC"
}
}
},
"parentIdentifier": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/PARENT-BASELINE-ID",
"statusSummary": {
"lastOperationIdentifier": "OPERATION-ID-3",
"status": "SUCCEEDED"
},
"targetIdentifier": "arn:aws:organizations::ACCOUNT-ID:account/o-ORG-ID/MEMBER-ACCOUNT-ID"
},
// アカウントのベースライン(失敗)- 1つの例のみ表示
{
"arn": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/ENABLED-BASELINE-ID-7",
"baselineIdentifier": "arn:aws:controltower:ap-northeast-1::baseline/BASELINE-ID-4",
"baselineVersion": "3.0",
"driftStatusSummary": {
"types": {
"inheritance": {
"status": "IN_SYNC"
}
}
},
"parentIdentifier": "arn:aws:controltower:ap-northeast-1:ACCOUNT-ID:enabledbaseline/PARENT-BASELINE-ID",
"statusSummary": {
"lastOperationIdentifier": "OPERATION-ID-4",
"status": "FAILED"
},
"targetIdentifier": "arn:aws:organizations::ACCOUNT-ID:account/o-ORG-ID/PROBLEM-ACCOUNT-ID"
}
// 他多数のアカウントは省略
]
}
アカウントに対する表示では上記のように parentIdentifier
という項目が追加されています。この項目にはそのアカウントが所属する OU の enabledbaseline
の ARN が入ります。これによってどの OU 配下のベースラインを引き継いでいるのかが分かるようになっていますね。
まとめ
というわけで、API でアカウントごとの Control Tower への登録状況を確認できるようになったというアップデートの紹介でした。
アカウントごとにドリフト状況を確認できるようになったので、定期的な Control Tower 準拠の監視がやりやすくなったのではないかなと思います。例えば、このAPIを使って定期的にベースラインの状態をチェックするスクリプトを作成し、問題があるアカウントを検出して通知するような仕組み等ができるかもしれませんね。
以上、とーちでした。