皆さん、こんにちは。入社5年目のクラウド技術統括部のR.Aです。
VPC Service Controls のサービス境界があるプロジェクトでCloud Run 関数を 実行する Cloud Pub/Sub サブスクリプションを作成するときに問題が起こったので共有します。
はじめに
以下が目次です。
目次
環境
VPC Service Controlsに保護されているプロジェクト※で、以下のリソースを作成します。
※プロジェクトで使用するサービスすべて制限付きサービスに含めている状態です。ここで取り上げていないサービスもあります。
処理はざっくりこんな感じです。
Cloud Logging から特定の文字列が出力された場合に Cloud Pub/Sub トピックにメッセージを送信する。
Cloud Pub/Sub サブスクリプションからCloud Run 関数がメッセージを受信する。
Cloud Run 関数が BigQuery に SQL を実行する。
事象
Push エンドポイントの Cloud Pub/Sub サブスクリプションが作成できないです。
[保存]を押下すると「アクセスが拒否されました」と出力されます。
原因
VPC Service Controls の制限事項 に該当していることが問題でした。
Cloud Run 関数のURLである cloudfunctions.net が自動で割り当てられますが、これがカスタムドメインとして扱われてしまいます。
該当部分を引用します。
push エンドポイントがデフォルトの run.app URL または Workflows の実行で Cloud Run サービスに設定されていない限り、新しい push サブスクリプションを作成できません(カスタム ドメインは機能しません)。Cloud Run とのインテグレーションの詳細については、VPC Service Controls の使用をご覧ください。
解決策
Cloud Run 関数を使用しているので、裏で Cloud Run が作成されています。
Cloud Run の URL(run.appで終わるURL)を使用すれば、制限事項に該当しなくなるため、それを使用します。
Cloud Run 関数のページに表示されるURLではなく、、、
Cloud Run のページに表示されるURLの隣にある「!」を押下すると右ペインが表示されるので、
右ペインに表示されている3つの中で run.app で終わるURLを Cloud Pub/Sub サブスクリプションに設定します。
run.app のURLでCloud Pub/Sub サブスクリプションを作成すると、、、
無事作成できました!
おわりに
初期構築時には VPC Service Controls を一番最後に作成することが多いため、気づきませんでした。。。
構築済みの環境に新しいリソース作成することもあるので、面倒ですが初期構築時からVPC Service Controls
を作成しておくものだなと思いました、、!
話には関係ないですが、Cloud Run 関数じゃなくて、やっぱりCloud Functionsって呼びたい!!