Cloud Runのiam.serviceAccounts.actAsエラーを原因別に解消する

Cloud RunのactAs拒否を、deploy実行主体と対象service account、存在・project・権限種別から診断します。

AIものさし編集部

Cloud Runのdeployでiam.serviceAccounts.actAsが拒否されたら、「誰が」「どのservice accountを」「何の操作で使おうとしたか」を確認します。Cloud Runの実行中にAPIへアクセスする権限と、deploy時にservice accountをservice identityとして付ける権限は別です。

この記事はCloud Runサービスの作成・更新時のactAs診断です。以下の主体とprojectは架空例で、Google Cloudへの接続、IAM閲覧・付与・削除、service account作成、deploy、課金操作は行っていません。role名を列挙するだけでなく、付与先と対象resourceを判断する手順として扱います。

エラーの主体・対象・操作を一組にする

エラー全文と発生時刻、Cloud Runのproject・region・service、要求したruntime service accountを記録します。実行主体がローカル利用者かCIのservice accountか、impersonation後の主体かを照合します。普段Consoleで見ている利用者と同じとは限りません。

表は横にスクロールできます

項目架空の確認内容取り違えると起きること
deployerCI用の実行主体A自分へroleを付けてもCIは変わらない
service identityapp実行用service account B別SAへの許可では対象を満たさない
対象projectCloud Runを作るproject X別projectのroleを見てしまう
SAの所属projectBが存在するproject Ycross-project条件を見落とす

CIで認証が成功したことは、actAsも許可された証拠にはなりません。読める範囲の実行記録や監査ログで主体を確認し、ログにaccess tokenや鍵、認証設定全文を貼らないようにします。

deployerとruntimeの役割を分ける

Cloud Runのservice identity資料(新しいタブで開く)は、service accountがresourceである面とprincipalである面を分けています。deployerはそのresourceをserviceへ付ける権限を持ち、実行時にはservice account自身が必要なGoogle Cloud APIの操作権限を持つ、という二段です。

表は横にスクロールできます

失敗段階必要条件の方向actAsとの関係
service identityを付けるdeploydeployer→対象SAの利用権限actAsを確認する対象
Cloud Runの作成・更新deployerのCloud Run操作権限actAsだけで全操作は許可されない
実行中のStorage等アクセスruntime SA→対象resourceactAsの付与とは別
access token取得の別エラー表示permissionとservice agent等actAsと同じroleで修復しない

公式資料では、対象service account上のService Account User role(roles/iam.serviceAccountUser)がactAsを含むと説明しています。対象resourceはservice identityに使うSA、付与されるprincipalはdeployerです。runtime SA自身へ別APIのroleを追加するだけでは、この関係は変わりません。

SAが存在し、意図したものかを確認する

エラーに「or it may not exist」が含まれる場合、権限不足と不存在を文字列だけで決めません。設定したSAのemail、project、既定SAかuser-managed SAか、削除されていないかを権限のある管理経路で確認します。名前が似ている別SAを新規作成して埋め合わせる手順にはしません。

表は横にスクロールできます

観測次の確認直ちに行わないこと
CIが想定外のSAを指定deploy設定・入力値・既定値想定外SAへ権限追加
SAが見えない存在・閲覧権限・所属project不存在と断定
別projectのSAcross-project要件org policyの無効化
対象も主体も正しい対象SAのIAM条件と拒否理由project全体へ広いrole付与

既定Compute Engine SAが削除されたケースも、Cloud Runのtroubleshootingに説明があります。既定を使う設計なのか、専用SAを指定すべきなのかを確認し、過去の既定権限をすべて戻す方法で直さないようにします。

許可が必要なら対象SAに範囲を絞る

主体と対象が正しく、設計上そのdeployerがそのSAを付ける必要があると確認できたら、管理者が対象SA上の必要なroleを検討します。Consoleでは対象SAのアクセスを持つprincipalの設定を確認し、principal、role、条件、対象resourceの四点を記録します。project全体のOwnerやEditorを、エラーを消すために追加しません。

actAsを持つdeployerがそのSAを実行環境へ付けられることの影響も考慮します。SAに強い実行権限があるなら、利用を許可するdeployerの範囲もそれに対応する必要があります。最小の付与範囲と既存のIAM条件を、担当者が確認します。

service accountが別projectにある場合は、公式資料が示すCloud Run service agentの権限や組織ポリシーなど、追加条件を確認します。別種のpermissionエラーへ変わったら新しい段階として調査し、同じroleの追加を繰り返しません。

修正後の確認と戻し方を記録する

  1. 変更前のprincipal・role・条件・resourceを記録する。
  2. 誤った設定値なら、IAM付与より先に正しいservice identity指定へ直す。
  3. 必要なIAM変更だけを管理者の手順で適用する。
  4. 同じdeployer・対象SA・projectの検証経路で再確認する。
  5. deployが進んだことと、実行時APIの最小操作が通ることを分けて確認する。
  6. 不要だった追加bindingは、既存の必要bindingと区別して取り消せるようにする。

反映確認で失敗しても、同じ許可を複数箇所へ追加する前に、最新エラーのprincipal、permission、resourceを取り直します。role変更が不要だった場合は、今回加えた差分だけを戻し、元から必要な権限をまとめて削除しません。

復旧完了は「広いroleでdeployできた」ではなく、意図した主体が意図したSAだけを使い、必要なCloud Run操作とruntime操作をそれぞれ説明できる状態です。実施していないdeployやAPI確認は未検証として残します。

確認した公式資料