Cloud Monitoring インシデントを開くと monitoring.incidents.get の権限エラーが出る
なにが起きたか
メンバーに「ちょっとこのインシデントのエラー見てもらえませんか?」と Slack で通知された Cloud Monitoring のインシデントリンクを共有しました。ところが、メンバーがリンクを開くと、「You need additional access」というエラー画面が表示され確認できませんでした。

エラー画面
エラー内容を見ると、monitoring.incidents.getという permission が足りないようです。該当するロールがないか調べたところ良さそうなロールをみつけることができました。しかし、いざカスタムロールに permission を追加しようとしても該当するものがありませんでした 😭

カスタムロール Add permissions
結論
カスタムロールは諦めて、素直にインシデントのモニタリング閲覧者roles/monitoring.cloudConsoleIncidentViewer をユーザーに付与しましょう。

Monitoring Cloud Console Incident Viewer
ドキュメントを読む
Google Cloud Observability の 「IAM によるアクセス制御 > インシデントのロール」[1]を確認すると二つのロールが確認できます。
また、注釈で「注: これらのロールに関連付けられた個々の権限を付与することはできません。」と記載されています。

ドキュメント - インシデントのロール
さらにリンク先の「権限エラーのため、インシデントの詳細を表示できない[2]」を参照すると以下の記載があります。
- カスタムロールでは、インシデント詳細の表示に必要な権限を付与することはできない
 - 指標データを除くすべてのインシデントの詳細を表示するには以下のロールが必要です
- インシデントのモニタリング閲覧者(roles/monitoring.cloudConsoleIncidentViewer)
 - Stackdriver アカウント閲覧者(roles/stackdriver.accounts.viewer)
 
 - さらに、インシデントを確認またはクローズできるようにするには以下のロールが必要です
- Monitoring 閲覧者(roles/monitoring.viewer)
 - インシデントのモニタリング編集者(roles/monitoring.cloudConsoleIncidentEditor)
 
 

ドキュメント - アラートポリシーのトラブルシューティング
エラー画面に出るのに本当にカスタムロールへ設定できないだろうか?
本当にカスタムロールへ設定できないのか、ログベース > アラートポリシーのインシデントの例[3]を使って、検証してみます。
0. 準備
検証に使うインシデントを作成します。Cloud Logging のログエクスプローラを開いて、以下のクエリを入力します。ドキュメントの例と異なり、任意のプロジェクト ID でもいいよう正規表現を使っています。
-- プロジェクトID部分は正規表現
logName=~"^projects/([^/]+)/logs/test-log$"
textPayload:"Oops"

ログ エクスプローラ
その後、「アラートを作成」から作成します。
- Alert details
- Alert Policy Name:Alert on Oops などなんでもいい
 - Policy Severity Level:デフォルト(No severity)
 - Documentation:デフォルト(空)
 
 - Choose logs to include in the alert
- 先ほどのクエリが自動入力されていることを確認する
 
 - Set notification frequency and autoclose duration
- Time between notifications:デフォルト(1 時間)
 - Incident autoclose duration:デフォルト(7 日)
 
 - Who should be notified?
- 何も設定しない
 
 - 「SAVE」をクリックする
 
アラートが作成できたら、アラートを発火させるため Cloud Logging にログエントリを書き込みます[4]。
gcloud logging write test-log \
  --severity=ERROR \
  --payload-type=text \
  'This log entry contains Oops'
しばらく待つと、コンソールの Alerting の画面の Incidents にリンクが表示されます。「Incident summary」のリンクで詳細を確認でき、今回はこれを見るためにどんな権限があればいいか確かめてみます。あとで使うので、インシデント詳細へのリンクを控えておきます。
e.g.)
https://console.cloud.google.com/monitoring/alerting/incidents/0.ncs3lg9ri9li?project=${PROJECT_ID}

コンソール - Alerting > Incidents
1. インシデント詳細の閲覧
なにも権限がない別のアカウントでアクセスして、アクセスできないことを確認します。

エラー画面
エラー画面に表示された permissions を持つカスタムロールを作成して利用します。
PROJECT_ID=xxxxxxxxx
ROLE_ID=mycustom.monitoring.viewer
gcloud iam roles create $ROLE_ID --project=$PROJECT_ID \
    --title=MyCustomMonitoringViewer \
    --description=ViewIncidentDetails \
    --permissions="stackdriver.projects.get,monitoring.incidents.get" \
    --stage=ALPHA
USER_EMAIL="foo@example.com"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="user:${USER_EMAIL}" \
  --role="projects/${PROJECT_ID}/roles/mycustom.monitoring.viewer"
再度アクセスすると、エラー画面がかわりました。画面を見る限りでは、なんの権限が必要かわかりません。

エラー画面
試しに、プロジェクトへのアクセス権を付与するため「ブラウザ(roles/browser)[5]」を使ってみるとアクセスできました。そのため、そこから最低限必要そうなresourcemanager.projects.get を追加してみます。カスタムロールの permissions は上書きになるため、再び他の permission も指定する必要があります。
# resourcemanager.projects.get を追加
gcloud iam roles update $ROLE_ID \
  --project=$PROJECT_ID \
  --permissions="stackdriver.projects.get,monitoring.incidents.get,resourcemanager.projects.get"
もう一度アクセスすると、インシデント詳細を表示することができました 🎉
ただし「CLOSE INCIDENTS」は非アクティブになっていて Annotation の「ADD COMMENTS」も非アクティブになっています。

Incident Details
試しに Alerting へアクセスすると画面は表示されるものの Incidents が表示されませんでした。

Alerting > Incidents
ここで permissions をよく見ると規則性があることに気づきます。get があるなら、update と list もありそうですが、これ以上はやめておきましょう。おとなしく「インシデントのモニタリング編集者」を付与します。
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="user:${USER_EMAIL}" \
  --role="roles/monitoring.cloudConsoleIncidentEditor"
一覧も表示され、「CLOSE INCIDENTS」と「ADD COMMENTS」もできるようになりました。

Incident Details

Alerting > Incidents
3. カスタムロール permissions について
ここで、コンソールからカスタムロールを確認してみます。追加した permissions は「Hidden」と表示されています。マウスでホバーすると「Permission may not be supported in custom roles」と表示され、しっかりとサポート外であることを指摘されます。あらためてですが、サポート外のうちは使わない方が無難でしょう。
ちなみに、stackdriver.projects.get は「Deprecated permission, may be removed soon」と表示されました。とはいえ、代替になりそうものは見つからずどうしたらいいのかわかりませんでした。わかるひとがいれば教えてください 🙏

Edit Role
さいごに
Google Cloud のインシデントに関する IAM ロールについて調べてみました。それっぽいロールはあるが permissions は表示されず、使えるか不安でしたがなんとかなりそうでよかったです。同じ問題にあたったひとがいれば参考になれば幸いです 😄
Discussion