異なるプロジェクトにあるコンテナイメージをCloud Runにデプロイする場合のIAM権限

記事タイトルとURLをコピーする

G-gen の佐々木です。当記事では、Cloud Run にコンテナイメージをデプロイする際に、異なるプロジェクトにある Artifact Registry リポジトリからコンテナイメージをプルするための権限設定について解説します。

Cloud Run デプロイのための IAM 権限

通常、Cloud Run をデプロイするためには、デプロイを実行するプリンシパル(ユーザーアカウント、サービスアカウントなど)が以下の権限を持っている必要があります。これらの権限は、Cloud Run の実行モデル(services、jobs、worker pools)で共通となっています。

権限 説明 最小権限
Cloud Run デベロッパー
(roles/run.developer)
Cloud Run のデプロイを行うための権限 初回デプロイ時: プロジェクトに対して権限を設定
既存リソースの編集時: 対象の Cloud Run に対して権限を設定
サービス アカウント ユーザー
(roles/iam.serviceAccountUser)
Cloud Run にサービスアカウントを紐付けるための権限 対象のサービスアカウントに対して権限を設定
Artifact Registry 読み取り
(roles/artifactregistry.reader)
Artifact Registry からコンテナイメージを参照するための権限 対象の Artifact Registry リポジトリに対して権限を設定

これらの権限が足りない場合、Cloud Run のデプロイが実行される前にエラーが発生します。

別プロジェクトへのデプロイ時のエラーメッセージ

コンテナイメージが異なるプロジェクトにある場合、デプロイの実行はされますが、デプロイ後に以下のようなエラーが表示されることがあります。

Google Cloud Run Service Agent service-xxxxxxxxxxxx@serverless-robot-prod.iam.gserviceaccount.com must have permission to read the image, asia-northeast1-docker.pkg.dev/myproject-b/myrepo/myjob. Ensure that the provided container image URL is correct and that the above account has permission to access the image. If you just enabled the Cloud Run API, the permissions might take a few minutes to propagate. Note that the image is from project [myproject-b], which is not the same as this project [myproject-a]. Permission must be granted to the Google Cloud Run Service Agent service-xxxxxxxxxxxx@serverless-robot-prod.iam.gserviceaccount.com from this project. See https://cloud.google.com/run/docs/deploying#other-projects Cause: 403 Forbidden GET https://asia-northeast1-docker.pkg.dev/v2/myproject-b/myrepo/myjob/manifests/latest {"errors":[{"code":"DENIED","message":"Permission \"artifactregistry.repositories.downloadArtifacts\" denied on resource \"projects/myproject-b/locations/asia-northeast1/repositories/myrepo\" (or it may not exist)"}]}

別プロジェクトのコンテナイメージを指定した場合の権限エラー

これは、Cloud Run をデプロイしたプリンシパルではなく、そのプロジェクトにある Cloud Run 自体が、別プロジェクトの Artifact Registry リポジトリにあるコンテナイメージをプルできない状態になっているためです。

別プロジェクトのコンテナイメージを使用する場合のイメージプル失敗

Cloud Run のサービスエージェント

Cloud Run は、サービスエージェントを使用して認証を行い、Artifact Registry リポジトリからコンテナイメージをプルします。このサービスエージェントは、Cloud Run 自体に紐づけるサービスアカウントとは異なる点に注意が必要です。

サービスエージェントは Google Cloud のサービスが内部的に使用する特別なサービスアカウントで、Google Cloud のサービスが内部的に別のサービスを呼び出すときなどで使用されます。

Cloud Run 用のサービスエージェントは、以下のような命名規則になっています。

service-<プロジェクト番号>@serverless-robot-prod.iam.gserviceaccount.com

Cloud Run 用のサービスエージェントはデフォルトで、同じプロジェクトに対する Cloud Run サービス エージェントroles/serverless.serviceAgent)ロールが付与されています。これは Cloud Run のデプロイに関する広範な権限を持っているロールです。

Cloud Run 用のサービスエージェント

IAM ロールの追加

Cloud Run が別のプロジェクトにあるコンテナイメージをプルするためには、Cloud Run をデプロイするプロジェクトのサービスエージェントに対して、別プロジェクトにある Artifact Registry リポジトリの読み取り権限を付与する必要があります。

Cloud Run のサービスエージェントに対してリポジトリの読み取り権限を付与する

佐々木 駿太 (記事一覧)

G-gen 最北端、北海道在住のクラウドソリューション部エンジニア

2022年6月に G-gen にジョイン。Google Cloud Partner Top Engineer に選出(2024 / 2025 Fellow / 2026)。好きな Google Cloud プロダクトは Cloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。