GCPで別なプロジェクトのリソースにアクセスする
はじめに
サービスの立て付け上、プロジェクトを分ける必要性があるが、
システム上同期をとって他方のサービスに対して処理を実行したい。
アクセスはセキュアにしたいので、認証されたアカウントでのいアクセスさせたい。
APIで通信すれば実現可能だが、クラウド的な実装で解決したい。
構成
プロジェクトAからPub/Subをパブリッシュし、
プロジェクトBのCloud Runにメッセージ送信
Pub/Subのトリガーは簡単なのでSchedulerにしました。
実際はCloud Functionだったり、Cloud Runからキックする実装になるかと思います。
解決法
先に答えを行ってしまうと、
- 呼び出し元でサービスアカウントを作成
- サービスアカウントで認証しつつPub/Subメッセージ送信
- 呼び出される側のCloud Runの権限にメンバーとして上記のサービスアカウントを追加
詳細
1.Cloud Runアプリケーション作成(プロジェクトA)
サービス名やリージョンは任意
コンテナイメージも任意(今回はアクセスできれば良いのでデモコンテナを指定)
トリガーはこんな感じ
「認証が必要」を選ぶことで外から許可されたメンバー以外アクセスできなくなります。
作成が完了するとURLが生成されます。 後でPub/Subに設定するのに使います。
2.Pub/Subトピック作成(プロジェクトB)
トピックの作成
一緒にデフォルトのサブスクリプションも作成します。
後ほどサブスクリプションの設定を変更しますが、
その前に変更する設定に必要なサービスアカウントを作成します。
3.サービスアカウント作成(プロジェクトB)
サービス名は任意で、他は未設定でもOK
作成されたサービスアカウント ※サービスアカウントのメールアドレスをこの後使います。
4.Pub/Subサブスクリプション作成(プロジェクトB)
サブスクリプションの編集
サブスクリプションの設定を変更します。
配信タイプ:Push
エンドポイント:1で作成したClourd Run URL
認証を有効:3で作成したサービスアカウントを設定
トークン作成の権限が必要とのことなので付与ボタンをクリックしておきます。
付与すると一度入力がリセットされてしまうのでもう一度入力しなおしてください。
残りの項目はデフォルトでOKです。
5.スケジューラの作成(プロジェクトB)
初回だけリージョンの選択をします。東京で
ジョブの設定。今回はコンソールから手動で起動するつもりなので適当に
ターゲットタイプにPub/Sub、トピックは作成したトピックを選択します。
6.Cloud Runの権限追加(プロジェクトA)
Cloud Runの権限にてメンバーを追加
メンバー:3で作成したサービスアカウントのメールアドレスを指定 ロール:Cloud Run 起動元
メンバーにメールアドレスを入力すると下記のようにテキスト入力欄の下に候補が出るので、それをクリックする。
確認
スケジューラを手動実行します。 「今すぐ実行」をクリック
Cloud Runのログを確認します。
無事届きました。
上手くいかない場合は経路のどこかの設定が間違えていたり抜けていたりします。
設定したつもりがされていなかったり、更新したつもりが変わってなかったり。