GCPで別なプロジェクトのリソースにアクセスする

はじめに

サービスの立て付け上、プロジェクトを分ける必要性があるが、
システム上同期をとって他方のサービスに対して処理を実行したい。
アクセスはセキュアにしたいので、認証されたアカウントでのいアクセスさせたい。
APIで通信すれば実現可能だが、クラウド的な実装で解決したい。

構成

f:id:katutoki:20210830234228p:plain

プロジェクトAからPub/Subをパブリッシュし、
プロジェクトBのCloud Runにメッセージ送信
Pub/Subのトリガーは簡単なのでSchedulerにしました。
実際はCloud Functionだったり、Cloud Runからキックする実装になるかと思います。


解決法

先に答えを行ってしまうと、

  1. 呼び出し元でサービスアカウントを作成
  2. サービスアカウントで認証しつつPub/Subメッセージ送信
  3. 呼び出される側のCloud Runの権限にメンバーとして上記のサービスアカウントを追加


詳細

1.Cloud Runアプリケーション作成(プロジェクトA

サービス名やリージョンは任意 f:id:katutoki:20210831000212p:plain

コンテナイメージも任意(今回はアクセスできれば良いのでデモコンテナを指定) f:id:katutoki:20210831001425p:plain

トリガーはこんな感じ
「認証が必要」を選ぶことで外から許可されたメンバー以外アクセスできなくなります。 f:id:katutoki:20210831001748p:plain

作成が完了するとURLが生成されます。 f:id:katutoki:20210831003732p:plain 後でPub/Subに設定するのに使います。


2.Pub/Subトピック作成(プロジェクトB)

トピックの作成
一緒にデフォルトのサブスクリプションも作成します。 f:id:katutoki:20210831005008p:plain

後ほどサブスクリプションの設定を変更しますが、
その前に変更する設定に必要なサービスアカウントを作成します。


3.サービスアカウント作成(プロジェクトB)

f:id:katutoki:20210831005749p:plain

f:id:katutoki:20210831005907p:plain サービス名は任意で、他は未設定でもOK

作成されたサービスアカウント f:id:katutoki:20210831010039p:plain ※サービスアカウントのメールアドレスをこの後使います。


4.Pub/Subサブスクリプション作成(プロジェクトB)

サブスクリプションの編集 f:id:katutoki:20210831005225p:plain f:id:katutoki:20210831005252p:plain

サブスクリプションの設定を変更します。
配信タイプ:Push
エンドポイント:1で作成したClourd Run URL
認証を有効:3で作成したサービスアカウントを設定
f:id:katutoki:20210831010424p:plain トークン作成の権限が必要とのことなので付与ボタンをクリックしておきます。
付与すると一度入力がリセットされてしまうのでもう一度入力しなおしてください。

残りの項目はデフォルトでOKです。


5.スケジューラの作成(プロジェクトB)

初回だけリージョンの選択をします。東京で f:id:katutoki:20210831003422p:plain

ジョブの設定。今回はコンソールから手動で起動するつもりなので適当に f:id:katutoki:20210831004812p:plain

ターゲットタイプにPub/Sub、トピックは作成したトピックを選択します。 f:id:katutoki:20210831010916p:plain


6.Cloud Runの権限追加(プロジェクトA

Cloud Runの権限にてメンバーを追加 f:id:katutoki:20210831011226p:plain

メンバー:3で作成したサービスアカウントのメールアドレスを指定 ロール:Cloud Run 起動元 f:id:katutoki:20210831011352p:plain

メンバーにメールアドレスを入力すると下記のようにテキスト入力欄の下に候補が出るので、それをクリックする。 f:id:katutoki:20210831011458p:plain

確認

スケジューラを手動実行します。 「今すぐ実行」をクリック f:id:katutoki:20210831011715p:plain

Cloud Runのログを確認します。 f:id:katutoki:20210831012736p:plain

無事届きました。

上手くいかない場合は経路のどこかの設定が間違えていたり抜けていたりします。
設定したつもりがされていなかったり、更新したつもりが変わってなかったり。