Cloud RunのDeterministic URLを解説

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

G-gen の佐々木です。当記事では 2024年9月より Cloud Run で利用可能となった Deterministic URL について解説します。

Deterministic URLs とは

2024年9月以降、Cloud Run サービスにアクセスするための URL として、従来の URL(Non-deterministic URL)に加え、Deterministic URL が使用できるようになりました。

従来からある Non-deterministic URL は以下のような形式となっていました。

# Non-deterministic URL の形式
https://{サービス識別子}.run.app

Non-deterministic URL のサービス識別子はランダムハッシュが含まれており、サービスの作成が完了するまで、サービスの URL がどうなるか予測することができませんでした。

それに対して、deterministic URL は以下のような形式となっています。

# Deterministic URL の形式
https://{サービス名}-{プロジェクト番号}.{リージョン}.run.app

このように、サービスの作成前から URL が予測できるような形式になっていることで、IaC やシェルスクリプトなどで Cloud Run サービスを扱いやすくなります。

Deterministic URL のユースケース(Terraform の例)

たとえば、バックエンド用の Cloud Run サービスと、それを呼び出すフロントエンド用の Cloud Run サービスを Terraform で作成する場面を想定してみます。フロントエンドのサービスの環境変数に、バックエンドのサービスの URL を設定します。

従来の Non-deterministic URL を使用する場合、バックエンドのサービスの URL はサービス作成後に判明します。したがって、それを呼び出すフロントエンドのサービスは、必ずバックエンドのサービスの作成後に作成する必要があります。

それに対して、deterministic URL の場合、バックエンドのサービスの URL は作成前に予測可能なため、フロントエンドとバックエンドのサービスを並行して作成することができます。

したがって、Cloud Run サービスの URL がわかるまで作成できないようなリソースは、deterministic URL を使用することで依存関係を解消し、並行して作成できるようになります。

既存の Cloud Run サービスへの影響

Google Cloud コンソールから既存のサービスを確認すると、以前までは Non-deterministic URL が表示されていた URL の項目が Deterministic URL になっています。

既存のサービスはコンソール上のURLがdeterministic URLになっている

gcloud コマンドを使用することで、今まで使用していた Non-deterministic URL を確認することができます。コンソールの場合はサービス詳細画面の YAML タブから確認できます。

# 既存のサービスの URL を確認する(Non-deterministic URL が出力される)
$ gcloud run services describe hello --region=asia-northeast1 --format='value(status.url)'
https://hello-xxxxxxxxxx-an.a.run.app

コンソールからNon-deterministic URLを確認する

もしくは、インフォメーションマークをクリックして表示される情報パネルで確認することも可能です。

インフォメーションマークから2つの URL を確認

実際にサービスにアクセスしてみます。従来から存在していた Non-deterministic URL にアクセスすると、ステータスコード200が返り、サービスにアクセスできていることがわかります。

# Non-deterministic URL を使用し既存のサービスにアクセスする(ステータスコードのみ抽出)
$ curl https://hello-xxxxxxxxxx-an.a.run.app -o /dev/null -w "%{http_code}\n" -s
200

続いて、Deterministic URL を使用してアクセスします。こちらも同様にステータスコード200が返ってきます。

# Deterministic URL を使用して既存のサービスにアクセスする(ステータスコードのみ抽出)
$ curl https://hello-000000000000.asia-northeast1.run.app -o /dev/null -w "%{http_code}\n" -s
200

したがって、既存のサービスについては、コンソール上の URL が Deterministic URL に変更されたものの、どちらの URL も使用できる状態になっているため、今まで使っていた URL でサービスにアクセスできなくなるといった影響はありません。

新規に作成した Cloud Run サービス

続いて、Deterministic URL が一般公開されて以降に作成されたサービスについて確認してみます。

コンソール上では Deterministic URL が表示されています。

新しく作成したサービスもはコンソール上のURLがdeterministic URLになっている

CLI で URL を確認すると、Non-deterministic URL が表示されます。したがって、新規に作成されたサービスについても Non-deterministic URL が発行されていることがわかります。

# 新しく作成されたサービスの URL を確認する(Non-deterministic URL が出力される)
$ gcloud run services describe hello-new --region=asia-northeast1 --format='value(status.url)'
https://hello-new-yyyyyyyyyy-an.a.run.app

そして、どちらの URL にも問題なくアクセスできます。

# Non-deterministic URL を使用して新しいサービスにアクセスする(ステータスコードのみ抽出)
$ curl https://hello-new-yyyyyyyyyy-an.a.run.app -o /dev/null -w "%{http_code}\n" -s
200
  
# Deterministic URL を使用して新しいサービスにアクセスする(ステータスコードのみ抽出)
$ curl https://hello-new-000000000000.asia-northeast1.run.app -o /dev/null -w "%{http_code}\n" -s
200

したがって、サービスの作成タイミングに関わらず、どちらの URL も使用できる状態になっています。

サービスの URL を無効化した場合

Cloud Run ではサービスに付与される URL を無効化することもできます。無効化の方法やユースケースについては以下の記事をご一読ください。

blog.g-gen.co.jp

URL の無効化を行った場合、Deterministic URL、Non-deterministic URL ともに無効化され、サービスの URL を使用したアクセスができなくなります。

URLを無効化したサービス

# URL を無効化したサービスの URL を確認する
$ gcloud run services describe hello-no-url --region=asia-northeast1 --format='value(status.url)'
(※何も出力されない)

Deterministic URL は形式が決まっているため、それに従った URL にアクセスしてみましたが、URL を無効化したサービスでは404エラーが返ってきました。

# Deterministic URL の形式に従った URL にアクセスしてみる
$ curl https://hello-no-url-000000000000.asia-northeast1.run.app -o /dev/null -w "%{http_code}\n" -s
404

佐々木 駿太 (記事一覧)

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

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

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