寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

Cloud Run に別の Project の Container Registry/Artifact Registry からデプロイする方法

f:id:chidakiyo:20210907150330j:plain

Cloud Run 使ってますかー?
例えば、本番環境とテスト環境など、 Project を分離した場合、どちらかの GCR などから両方の環境の Cloud Run にコンテナをデプロイしたくなることはあると思います。
一般的には単一のコンテナで(環境に合わせて build などせずとも)複数環境対応できるのが良いとされていると思います。

Run で他の Project の GCR からイメージを取得しようとすると、
Google Cloud Run Service Agent must have permission to read the image
という感じのエラーメッセージが表示されます。

これは、Run のデプロイの際に他のプロジェクトからコンテナを Pull しようとしたが、コンテナレジストリに対して Run の Service Agent が権限を持っていないというメッセージになります。

さて、どうやって対応すればよいのか。

Run の Service Agent に権限を与える

Run の Service Agent がつまりは他のプロジェクトのレジストリの権限を持てばよいということになります。

手順を示します。

Cloud Run Service Agent を追加する

Run の Service Agent は以下のような命名ルールになっています。

service-<projectNumber>@serverless-robot-prod.iam.gserviceaccount.com

注意点は project_id ではなく、 project_number である点です。
一番確認しやすいのは、GCP コンソールの自分のアイコンの左横の 点が3つ のボタンから、
Project Setting を押し、 Project number: を参照します。
(これは参照元 projct の ID です。Run が動く側。)

上記のルールの Service Agent をメンバーとして追加します。
また、ロールは Storage Object Viewer参照先のプロジェクト に追加する。
(これは GCR:レジストリがある側のプロジェクトです)

動作確認を行う

Cloud Run のデプロイを試し、動作確認をしましょう。
問題なくデプロイできれば完了です。

ではでは。