Cloud Runの呼び出し元IAMチェックを無効化してサービスを公開する

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

G-gen の佐々木です。当記事では Cloud Run における呼び出し元 IAM チェックの無効化について解説します。

前提知識

Cloud Run について

Cloud Run とは、Google Cloud のマネージドなコンテナ実行環境でアプリケーションを実行することができる、サーバレス コンテナコンピューティング サービスです。

Cloud Run には Cloud Run servicesCloud Run jobsCloud Run functions(旧称 : Cloud Functions)の3種類がありますが、当記事の内容は HTTP リクエストベースでアプリケーションを実行できる Cloud Run services および Cloud Run functions に関するものとなります。

Cloud Run services および Cloud Run functions の詳細については、以下の記事をご一読ください。

blog.g-gen.co.jp

blog.g-gen.co.jp

Cloud Run 呼び出し元の IAM 認証

Cloud Run 上のアプリケーションは、Google Cloud の IAM で許可されているユーザーのみがアクセスすることができます。

具体的には、アクセスを許可したいプリンシパル(ユーザー、サービスアカウントなど)に Cloud Run 起動元(roles/run.invoker)や Cloud Run サービス起動元(roles/run.servicesInvoker)などのロールを付与することで、アプリケーションを呼び出すことができるようになります。

IAM を使用して、誰でもアプリケーションを呼び出すことができるようにするためには、allUsers というプリンシパルに対して上記のロールを付与する必要があります。

「allUsers」に呼び出し権限を付与して Cloud Run を公開する(サービスの詳細画面から設定する場合)

「allUsers」に呼び出し権限を付与して Cloud Run を公開する(サービス一覧画面から設定する場合)

呼び出し元 IAM チェックの無効化

概要

Cloud Run service および Cloud Run functions では、前述の IAM 認証によるアクセス元制御(呼び出し元 IAM チェック)を無効化することができます。

これによりallUsers プリンシパルに対する IAM ロールの付与を行うことなく、誰でも Cloud Run 上のアプリケーションを呼び出すことができるようになります。

ユースケース

Cloud Run で呼び出し元 IAM チェックの無効化がサポートされる以前は、前述した allUsers プリンシパルに対する IAM ロールの付与によりアプリケーションを公開していました。すべてのプリンシパルに対してアクセス許可を行うという点においては、どちらの方法も結果は同様のものになります。

allusers を使用する手順では、プロジェクトでドメインで制限された共有iam.allowedPolicyMemberDomains)という組織ポリシー が有効化されている場合、IAM ロールを付与できるプリンシパルのドメインが制限されるため、Cloud Run の呼び出しを許可する IAM ロールを allusers に付与することができません。

この場合、allusers に対してロールを付与するためには、当該組織ポリシーを一時的に無効化し、ロールを付与したあとに再度ポリシーを有効化するといった手順が必要となります。

組織ポリシー「ドメインで制限された共有」

一方で、呼び出し元 IAM チェックを無効化する場合は、プリンシパルに対する IAM ロールの付与を伴わないため、組織ポリシーを一時的に無効化する必要がありません。したがって、より簡易的な手順で Cloud Run を公開することができます。

手順

必要な IAM 権限

当記事では Cloud Run services における設定手順を解説します。

呼び出し元 IAM チェックの設定を変更するには以下の権限が必要です。これらはプロジェクトのオーナー(roles/owner)や、Cloud Run 管理者(roles/run.admin)ロールに含まれています。

  • run.services.create
  • run.services.update
  • run.services.setIamPolicy

コンソールを使用する場合

呼び出し元 IAM チェックの設定は、サービスの作成時、および更新時に「認証」項目で変更することができます。

以下のスクリーンショットは、既存のサービスを更新する場合の設定箇所を示しています。「Cloud IAM を使用して受信リクエストを認証する」のチェックボックスでチェックを外すことで、呼び出し元 IAM チェックを無効化してサービスを公開することができます。

コンソールから呼び出し元 IAM チェックを無効化する

gcloud コマンドを使用する場合

CLI を使用する場合も、サービスの作成時や更新時に設定を変更することができます。

以下のコマンドでは、--no-invoker-iam-check フラグを使用してサービスを更新することで、呼び出し元 IAM チェックを無効化します。

# Cloud Run services で呼び出し元 IAM チェックを無効化する
$ gcloud run services update <サービス名> --no-invoker-iam-check

呼び出し元 IAM チェックを有効化したい場合は、--invoker-iam-check フラグを使用します。

# Cloud Run services で呼び出し元 IAM チェックを有効化する
$ gcloud run services update <サービス名> --invoker-iam-check

YAML ファイルを使用する場合

YAML ファイルでサービスを管理している場合は、run.googleapis.com/invoker-iam-disabled アノテーションを true にすることで、呼び出し元 IAM チェックを無効化することができます。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
   annotations:
      run.googleapis.com/invoker-iam-disabled: true
   name: <サービス名>

IAM チェック無効化を禁止する

組織のポリシーによる制御

組織ポリシーである Require IAM invoker check for Cloud Run servicesrun.managed.requireInvokerIam)を組織またはプロジェクトで有効化すると、Cloud Run 呼び出し元 IAM 認証を無効化する操作を禁止することができます。

このポリシーをドメインで制限された共有iam.allowedPolicyMemberDomains)と併せて使うことで、Cloud Run の未認証呼び出しを完全に禁止することができます。

制御されている場合の挙動(コンソール)

組織のポリシー Require IAM invoker check for Cloud Run services(run.managed.requireInvokerIam)が有効化されていると、Google Cloud コンソールの Cloud Run 画面で、IAM チェックの有無を制御するチェックボックスを操作することができなくなります。

組織ポリシーによりチェックボックスが無効化されているケース

このポリシーはデフォルトでは無効化されています。プロジェクトでポリシーを有効化した覚えがないのにも関わらず、「Cloud IAM を使用して受信リクエストを認証する」のチェックボックスがグレーアウトしている場合は、組織レベルで有効化されているポリシーがプロジェクトに継承されている可能性があります。

組織ポリシー「Require IAM invoker check for Cloud Run services」

制御されている場合の挙動(gcloud)

同様に、組織のポリシーで禁止されている場合、gcloud コマンド gcloud run services update <サービス名> --no-invoker-iam-check で Cloud Run 呼び出し元の IAM 認証を無効化しようとすると、以下のようなメッセージが表示されます(例は、2025年3月31日現在のもの)。

Update failed
ERROR: (gcloud.run.services.update) FAILED_PRECONDITION: Operation denied by custom org policy: ["constraints/run.managed.requireInvokerIam": "When enforced, this constraint requires the IAM invoker check to be enabled on Cloud Run services.
If this constraint is not enforced, you can set the service.invoker_iam_disabled field (v2), or the run.googleapis.com/invoker-iam-disabled annotation (v1) on Cloud Run services to True. The invoker_iam_disabled field is currently available by invitation-only and will not be broadly available until after March 21, 2025. It's still possible to achieve a similar result by granting the run.routes.invoke permission to allUsers."].

佐々木 駿太 (記事一覧)

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

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

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