CloudWatch Dashboardにタグが付けられるようになったのでABACでチーム別閲覧制御を試してみた
はじめに
2026年6月24日、Amazon CloudWatch Dashboardがタグをサポートしました。
これまでダッシュボードにはタグを付けられなかったため、チーム別のアクセス制御を行うにはダッシュボード名に命名規則を設けてARNのワイルドカードで制御するなど、運用上の工夫が必要でした。
| 項目 | タグなし(従来) | タグあり(今回) |
|---|---|---|
| アクセス制御の粒度 | ダッシュボード名(ARN ワイルドカード) | タグ値(ABAC) |
| ダッシュボード追加時の対応 | ポリシー修正 or 命名規則遵守が必要 | タグを付けるだけ |
| 大規模環境でのスケーラビリティ | ポリシー肥大化 | ポリシーは固定、タグで制御 |
タグサポートにより、ABAC(Attribute-Based Access Control)で「このチームのダッシュボードだけ見せる」制御が簡潔に実現できるようになりました。本記事では実際にタグ付きダッシュボードを作成し、ABACポリシーで閲覧制御が効くことを確認します。
検証環境
- AWSアカウント: 開発環境
- リージョン: ap-northeast-1(東京)
- AWS CLI 2.35.10
タグ付きダッシュボードの作成
put-dashboard コマンドでダッシュボードを作成する際に --tags オプションでタグを付与できます。2つのチーム用ダッシュボードを作成しました。
aws cloudwatch put-dashboard \
--dashboard-name TeamA-Dashboard \
--dashboard-body '{"widgets":[{"type":"text","x":0,"y":0,"width":12,"height":3,"properties":{"markdown":"# Team Alpha Dashboard\nThis dashboard belongs to Team Alpha."}}]}' \
--tags Key=Team,Value=alpha Key=Environment,Value=dev
aws cloudwatch put-dashboard \
--dashboard-name TeamB-Dashboard \
--dashboard-body '{"widgets":[{"type":"text","x":0,"y":0,"width":12,"height":3,"properties":{"markdown":"# Team Bravo Dashboard\nThis dashboard belongs to Team Bravo."}}]}' \
--tags Key=Team,Value=bravo Key=Environment,Value=dev
いずれも DashboardValidationMessages が空配列で返り、正常に作成されました。
タグの操作
ダッシュボードのARN形式は arn:aws:cloudwatch::<account-id>:dashboard/<dashboard-name> です(リージョン部分は空)。
タグの確認
aws cloudwatch list-tags-for-resource \
--resource-arn arn:aws:cloudwatch::123456789012:dashboard/TeamA-Dashboard
{
"Tags": [
{"Key": "Team", "Value": "alpha"},
{"Key": "Environment", "Value": "dev"}
]
}
タグの追加
aws cloudwatch tag-resource \
--resource-arn arn:aws:cloudwatch::123456789012:dashboard/TeamA-Dashboard \
--tags Key=Temporary,Value=true
追加後の確認
{
"Tags": [
{"Key": "Team", "Value": "alpha"},
{"Key": "Environment", "Value": "dev"},
{"Key": "Temporary", "Value": "true"}
]
}
タグの削除
aws cloudwatch untag-resource \
--resource-arn arn:aws:cloudwatch::123456789012:dashboard/TeamA-Dashboard \
--tag-keys Temporary
削除後の確認
{
"Tags": [
{"Key": "Team", "Value": "alpha"},
{"Key": "Environment", "Value": "dev"}
]
}
タグの追加・削除ともに正常に動作しました。ABAC検証に使用する Team タグには影響を与えていないことを確認しています。
ABAC によるダッシュボード閲覧制御
設計方針
以下の方針でアクセス制御を設計しました。
- ベース権限として
CloudWatchReadOnlyAccessを付与し、CloudWatch全体の読み取りを許可 - カスタムDenyポリシーで
Team=alpha以外のダッシュボードに対するGetDashboardを拒否
IAM ロールの作成
aws iam create-role \
--role-name CWDashboard-TeamAlpha-ReadOnly \
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:root"},"Action":"sts:AssumeRole"}]}' \
--description "ABAC test: CloudWatch Dashboard read-only for Team Alpha only"
aws iam attach-role-policy \
--role-name CWDashboard-TeamAlpha-ReadOnly \
--policy-arn arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess
Deny ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyDashboardWithoutTeamTag",
"Effect": "Deny",
"Action": "cloudwatch:GetDashboard",
"Resource": "arn:aws:cloudwatch::123456789012:dashboard/*",
"Condition": {
"StringNotEquals": {
"aws:ResourceTag/Team": "alpha"
}
}
}
]
}
StringNotEquals により、Team タグが alpha ではないダッシュボード、および Team タグがないダッシュボードへのGetDashboardが拒否されます。
aws iam create-policy \
--policy-name DenyDashboardUnlessTeamAlpha \
--policy-document '<上記JSON>'
aws iam attach-role-policy \
--role-name CWDashboard-TeamAlpha-ReadOnly \
--policy-arn arn:aws:iam::123456789012:policy/DenyDashboardUnlessTeamAlpha
動作確認
AssumeRole
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/CWDashboard-TeamAlpha-ReadOnly \
--role-session-name abac-test
以降は取得した一時クレデンシャルで実行します。
TeamA-Dashboard(Team=alpha)の取得 → 成功
aws cloudwatch get-dashboard --dashboard-name TeamA-Dashboard
{
"DashboardArn": "arn:aws:cloudwatch::123456789012:dashboard/TeamA-Dashboard",
"DashboardBody": "{...}",
"DashboardName": "TeamA-Dashboard"
}
Team=alpha のダッシュボードは正常に取得できました。
TeamB-Dashboard(Team=bravo)の取得 → AccessDenied
aws cloudwatch get-dashboard --dashboard-name TeamB-Dashboard
An error occurred (AccessDenied) when calling the GetDashboard operation: User: arn:aws:sts::123456789012:assumed-role/CWDashboard-TeamAlpha-ReadOnly/abac-test is not authorized to perform: cloudwatch:GetDashboard on resource: arn:aws:cloudwatch::123456789012:dashboard/TeamB-Dashboard with an explicit deny in an identity-based policy: arn:aws:iam::123456789012:policy/DenyDashboardUnlessTeamAlpha
Team=bravo のダッシュボードはDenyポリシーにより拒否されました。今回の検証では、エラーメッセージにDenyポリシーのARNが含まれており、どのポリシーで拒否されたかを確認できました。
ListDashboards → 両方表示される
aws cloudwatch list-dashboards
{
"DashboardEntries": [
{"DashboardName": "TeamA-Dashboard", "DashboardArn": "arn:aws:cloudwatch::123456789012:dashboard/TeamA-Dashboard", "LastModified": "..."},
{"DashboardName": "TeamB-Dashboard", "DashboardArn": "arn:aws:cloudwatch::123456789012:dashboard/TeamB-Dashboard", "LastModified": "..."}
]
}
本記事のDenyポリシーはGetDashboardのみを対象としており、ListDashboardsは制御していないため、一覧には両方表示されます。一覧表示は見える前提で設計しており、制御対象はGetDashboardによるダッシュボード本文の取得です。
マネジメントコンソールでの確認
同ロールでマネジメントコンソールにスイッチロールし、動作を確認しました。
ダッシュボード一覧では両方のダッシュボードが表示されます。コンソールの一覧表示はListDashboards APIを使用しており、今回のDenyポリシーの対象外です。

TeamA-Dashboardは正常に表示されました。

TeamB-Dashboardを開くと、GetDashboardが拒否されるためダッシュボードの内容が表示されません。

まとめ
CloudWatch Dashboardのタグサポートにより、ダッシュボードの作成時や既存リソースへのタグ付与が可能になり、ABACでの閲覧制御が実現できるようになりました。今回の構成では、CloudWatchReadOnlyAccess をベースにDenyポリシーを1つ追加することで、Team=alpha のダッシュボード本文は取得でき、別チームのダッシュボード本文は取得できないことを確認しました。
適切な Team タグが付与されている限り、同じ制御単位内でダッシュボードが増えてもポリシーを変更する必要はありません。ダッシュボード名やARNワイルドカードに依存した従来の制御に比べ、タグを基準に管理できるため、ダッシュボード数が増える環境では運用負荷を抑えやすくなります。
参考リンク








