このチュートリアルでは、Cloud Run サービスの作成、デプロイ、Pub/Sub push サブスクリプションからの呼び出し方法を説明します。
目標
- Cloud Run でサービスを書き込み、作成、ビルド、デプロイする
- Pub/Sub トピックにメッセージを公開してサービスを呼び出す
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Pub/Sub and Cloud Run APIs.
- gcloud CLI をインストールして初期化します。
- コンポーネントを更新します。
gcloud components update
-
Cloud Build 編集者(
roles/cloudbuild.builds.editor
) -
Cloud Run 管理者(
roles/run.admin
) -
サービス アカウントの作成(
roles/iam.serviceAccountCreator
) -
プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) -
Pub/Sub 編集者(
roles/pubsub.editor
) -
サービス アカウント ユーザー(
roles/iam.serviceAccountUser
) -
Service Usage ユーザー(
roles/serviceusage.serviceUsageConsumer
) -
ストレージ管理者(
roles/storage.admin
)
必要なロール
チュートリアルを完了するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
gcloud のデフォルトを設定する
Cloud Run サービスを gcloud のデフォルトに構成するには:
デフォルト プロジェクトを設定します。
gcloud config set project PROJECT_ID
PROJECT_ID は、このチュートリアルで作成したプロジェクトの名前に置き換えます。
選択したリージョン向けに gcloud を構成します。
gcloud config set run/region REGION
REGION は、任意のサポートされている Cloud Run のリージョンに置き換えます。
Cloud Run のロケーション
Cloud Run はリージョナルです。つまり、Cloud Run サービスを実行するインフラストラクチャは特定のリージョンに配置され、そのリージョン内のすべてのゾーンで冗長的に利用できるように Google によって管理されます。
レイテンシ、可用性、耐久性の要件を満たしていることが、Cloud Run サービスを実行するリージョンを選択する際の主な判断材料になります。一般的には、ユーザーに最も近いリージョンを選択できますが、Cloud Run サービスで使用されている他の Google Cloudプロダクトのロケーションも考慮する必要があります。 Google Cloud プロダクトを複数のロケーションで使用すると、サービスのレイテンシだけでなく、コストにも影響を及ぼす可能性があります。
Cloud Run は、次のリージョンで利用できます。
ティア 1 料金を適用
asia-east1
(台湾)asia-northeast1
(東京)asia-northeast2
(大阪)asia-south1
(ムンバイ、インド)europe-north1
(フィンランド)低 CO2
europe-north2
(ストックホルム)低 CO2
europe-southwest1
(マドリッド)低 CO2
europe-west1
(ベルギー)低 CO2
europe-west4
(オランダ)低 CO2
europe-west8
(ミラノ)europe-west9
(パリ)低 CO2
me-west1
(テルアビブ)northamerica-south1
(メキシコ)us-central1
(アイオワ)低 CO2
us-east1
(サウスカロライナ)us-east4
(北バージニア)us-east5
(コロンバス)us-south1
(ダラス)低 CO2
us-west1
(オレゴン)低 CO2
ティア 2 料金を適用
africa-south1
(ヨハネスブルグ)asia-east2
(香港)asia-northeast3
(ソウル、韓国)asia-southeast1
(シンガポール)asia-southeast2
(ジャカルタ)asia-south2
(デリー、インド)australia-southeast1
(シドニー)australia-southeast2
(メルボルン)europe-central2
(ワルシャワ、ポーランド)europe-west10
(ベルリン)低 CO2
europe-west12
(トリノ)europe-west2
(ロンドン、イギリス)低 CO2
europe-west3
(フランクフルト、ドイツ)europe-west6
(チューリッヒ、スイス)低 CO2
me-central1
(ドーハ)me-central2
(ダンマーム)northamerica-northeast1
(モントリオール)低 CO2
northamerica-northeast2
(トロント)低 CO2
southamerica-east1
(サンパウロ、ブラジル)低 CO2
southamerica-west1
(サンティアゴ、チリ)低 CO2
us-west2
(ロサンゼルス)us-west3
(ソルトレイクシティ)us-west4
(ラスベガス)
Cloud Run サービスをすでに作成している場合は、Google Cloud コンソールの Cloud Run ダッシュボードにリージョンが表示されます。
Artifact Registry 標準リポジトリを作成する
コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
次のように置き換えます。
- REPOSITORY: リポジトリの一意の名前。
- REGION: Artifact Registry リポジトリに使用する Google Cloud リージョン。
Pub/Sub トピックを作成する
このサンプル サービスは Pub/Sub トピックに公開されたメッセージによってトリガーされるため、Pub/Sub でトピックを作成する必要があります。
gcloud
新しい Pub/Sub トピックを作成するには、次のコマンドを使用します。
gcloud pubsub topics create myRunTopic
myRunTopic を使用するか、 Google Cloud プロジェクト内で一意のトピック名に置き換えることができます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
Pub/Sub トピックを作成するには、既存の main.tf
ファイルに次の行を追加します。
Cloud プロジェクト内で一意のトピック名を使用できます。
コードサンプルを取得する
使用するコードサンプルを取得するには:
ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
または、zip 形式のサンプルをダウンロードしてファイルを抽出してもかまいません。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
または、zip 形式のサンプルをダウンロードしてファイルを抽出してもかまいません。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
または、zip 形式のサンプルをダウンロードしてファイルを抽出してもかまいません。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
または、zip 形式のサンプルをダウンロードしてファイルを抽出してもかまいません。
C#
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
また、zip 形式のサンプルをダウンロードしてファイルを抽出してもかまいません。
Cloud Run のサンプルコードが含まれているディレクトリに移動します。
Node.js
cd nodejs-docs-samples/run/pubsub/
Python
cd python-docs-samples/run/pubsub/
Go
cd golang-samples/run/pubsub/
Java
cd java-docs-samples/run/pubsub/
C#
cd dotnet-docs-samples/run/Run.Samples.Pubsub.MinimalApi/
コードを確認する
このチュートリアルのコードは、次のものから構成されています。
受信リクエストを処理するサーバー。
Node.js
Node.js サービスをテストしやすくするため、サーバー構成はサーバーの起動とは別になっています。
Node.js ウェブサーバーは、
app.js
内で設定されています。ウェブサーバーは
index.js
で開始します。Python
Go
Java
C#
Pub/Sub メッセージを処理し、応答メッセージをログに記録するハンドラ。
Node.js
Python
Go
Java
C#
正確な HTTP レスポンス コードを返すようにサービスをコーディングする必要があります。HTTP
200
や204
などの成功コードは、Pub/Sub メッセージの処理の完了を意味します。HTTP400
や500
などのエラーコードは、push を使用したメッセージの受信で説明されているように、メッセージが再試行されることを示します。サービスの動作環境を定義する
Dockerfile
。Dockerfile
の内容は言語によって異なります。Node.js
Python
Go
Java
このサンプルでは、Jib を使用して一般的な Java ツールにより Docker イメージをビルドします。Jib は、Dockerfile や Docker をインストールせずにコンテナのビルドを最適化します。Jib を使用して Java コンテナを構築する方法の詳細を確認します。
C#
Pub/Sub リクエストの送信元を認証する方法の詳細については、Pub/Sub と統合するをご覧ください。
コードを配布する
コードの配布は、Cloud Build でコンテナ イメージをビルドする、Artifact Registry にコンテナ イメージをアップロードする、Cloud Run にコンテナ イメージをデプロイするという 3 つのステップで構成されます。
コードを配布するには:
-
コンテナをビルドして、Artifact Registry に公開します。
Node.js
次のように置き換えます。gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REPOSITORY: Artifact Registry リポジトリの名前。
- REGION: Artifact Registry リポジトリに使用する Google Cloud リージョン。
pubsub
はイメージ名です。成功すると、ID、作成時間、イメージ名を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Python
次のように置き換えます。gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REPOSITORY: Artifact Registry リポジトリの名前。
- REGION: Artifact Registry リポジトリに使用する Google Cloud リージョン。
pubsub
はイメージ名です。成功すると、ID、作成時間、イメージ名を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Go
次のように置き換えます。gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REPOSITORY: Artifact Registry リポジトリの名前。
- REGION: Artifact Registry リポジトリに使用する Google Cloud リージョン。
pubsub
はイメージ名です。成功すると、ID、作成時間、イメージ名を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Java
-
Docker を承認して Artifact Registry に push するには、gcloud CLI 認証ヘルパーを使用します。
gcloud auth configure-docker
- Jib Maven プラグインを使用して、コンテナをビルドし Artifact Registry に push します。
次のように置き換えます。mvn compile jib:build -D image=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REPOSITORY: Artifact Registry リポジトリの名前。
- REGION: Artifact Registry リポジトリに使用する Google Cloud リージョン。
pubsub
はイメージ名です。ビルドが成功すると、BUILD SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
C#
次のように置き換えます。gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REPOSITORY: Artifact Registry リポジトリの名前。
- REGION: Artifact Registry リポジトリに使用する Google Cloud リージョン。
pubsub
はイメージ名です。ビルドが成功すると、ID、作成時間、イメージ名を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
-
アプリケーションをデプロイします。
コマンドライン
-
次のコマンドを実行して、アプリをデプロイします。
次のように置き換えます。gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub --no-allow-unauthenticated
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REPOSITORY: Artifact Registry リポジトリの名前。
- REGION: Artifact Registry リポジトリに使用する Google Cloud リージョン。
pubsub
はイメージ名、pubsub-tutorial
はサービスの名前です。コンテナ イメージは、前に gcloud の設定で構成したサービスとリージョンにデプロイされることに注意してください。--no-allow-unauthenticated
フラグは、サービスへの未認証アクセスを制限します。サービスを非公開にすることで、Cloud Run と Pub/Sub の自動統合でリクエストの認証を行うことができます。構成の詳細については、Pub/Sub と統合するをご覧ください。Identity and Access Management(IAM)に基づく認証の詳細については、IAM を使用したアクセスの管理をご覧ください。デプロイが完了するまで待ちます。30 秒ほどかかる場合があります。成功すると、コマンドラインにサービス URL が表示されます。この URL は、Pub/Sub サブスクリプションの構成で使用します。
-
サービスにコードの更新をデプロイする場合は、上記のステップを繰り返します。サービスをデプロイするたびに、リビジョンが作成されます。準備ができると、トラフィックの送信が自動的に開始します。
Terraform
Cloud Run サービスを作成するには、既存の
.tf
ファイルに次の行を追加します。 次のように置き換えます。resource "google_project_service" "cloudrun_api" { service = "run.googleapis.com" disable_on_destroy = false } resource "google_cloud_run_v2_service" "default" { name = "pubsub-tutorial" location = "REGION" template { containers { image = "IMAGE_URL" } } depends_on = [google_project_service.cloudrun_api] }
- IMAGE_URL は、画像の URL の
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
に置き換えます。 - REGION: Artifact Registry リポジトリに使用する Google Cloud リージョン。
-
Pub/Sub と統合する
Pub/Sub とサービスを統合するには:
gcloud
Pub/Sub サブスクリプションの ID を表すサービス アカウントを作成または選択します。
gcloud iam service-accounts create cloud-run-pubsub-invoker \ --display-name "Cloud Run Pub/Sub Invoker"
cloud-run-pubsub-invoker
を使用するか、 Google Cloud プロジェクト内で一意の名前に置き換えることができます。このサービス アカウントを使用して Pub/Sub サブスクリプションを作成します。
呼び出し元のサービス アカウントに、
pubsub-tutorial
サービスを呼び出すための権限を付与します。gcloud run services add-iam-policy-binding pubsub-tutorial \ --member=serviceAccount:cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/run.invoker
IAM の変更が反映されるまでに数分かかることがあります。その間に、サービスログに
HTTP 403
エラーが報告されることがあります。Pub/Sub がプロジェクトで認証トークンを作成できるようにします。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
次のように置き換えます。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- PROJECT_NUMBER: Google Cloud プロジェクト番号。
プロジェクト ID とプロジェクト番号は、Google Cloud コンソールで、対象プロジェクトの [プロジェクト情報] パネルに表示されます。
このサービス アカウントを使用して Pub/Sub サブスクリプションを作成します。
gcloud pubsub subscriptions create myRunSubscription --topic myRunTopic \ --ack-deadline=600 \ --push-endpoint=SERVICE-URL/ \ --push-auth-service-account=cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
次のように置き換えます。
- myRunTopic は、以前に作成したトピックに置き換えます。
- SERVICE-URL は、サービスのデプロイ時に提供された HTTPS URL で置き換えます。この URL は、ドメイン マッピングを追加している場合でも機能します。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
--push-auth-service-account
フラグは、認証と認可のために Pub/Sub の push 機能を有効にします。Pub/Sub サブスクリプションで使用するための Cloud Run サービス ドメインが自動的に登録されます。
Cloud Run の場合のみ、トークンが有効であるという組み込みの認証チェックと、サービス アカウントに Cloud Run サービスを起動する権限があることの承認チェックがあります。
これで、サービスが Pub/Sub と完全に統合されました。
Terraform
Pub/Sub サブスクリプションの ID を表すサービス アカウントを作成または選択します。
このサービス アカウントを使用して Pub/Sub サブスクリプションを作成します。
呼び出し元のサービス アカウントに、
pubsub-tutorial
サービスを呼び出すための権限を付与します。Pub/Sub がプロジェクトで認証トークンを作成できるようにします。
このサービス アカウントを使用して Pub/Sub サブスクリプションを作成します。
これで、サービスが Pub/Sub と完全に統合されました。
試してみる
エンドツーエンドのソリューションをテストするには、次の手順を行います。
トピックに Pub/Sub メッセージを送信します。
gcloud pubsub topics publish myRunTopic --message "Runner"
このチュートリアルで説明したコマンドラインを使用する代わりに、プログラムでメッセージを発行することもできます。詳しくは、メッセージの公開をご覧ください。
サービスログに移動します。
- Google Cloud コンソールに移動します。
pubsub-tutorial
サービスをクリックします。[ログ] タブを選択します。
ログが表示されるまで少し時間がかかることがあります。すぐに表示されない場合は、しばらくしてからもう一度確認してください。
「Hello Runner!」というメッセージを見つけます。
クリーンアップ
Cloud Run with Pub/Sub を使用する場合の詳しいユースケースを知るには、クリーンアップをスキップし、Cloud Run を使用した画像処理のチュートリアルをご覧ください。
Google Cloud アカウントに追加料金が課されるのを回避するには、このチュートリアルでデプロイしたリソースをすべて削除します。
プロジェクトを削除する
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで行った変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
チュートリアル リソースを削除する
このチュートリアルでデプロイした Cloud Run サービスを削除します。Cloud Run サービスの費用は、リクエストを受け取るまで発生しません。
Cloud Run サービスを削除するには、次のコマンドを実行します。
gcloud run services delete SERVICE-NAME
SERVICE-NAME は、実際のサービス名に置き換えます。
Cloud Run サービスは Google Cloud コンソールで削除することもできます。
チュートリアルの設定時に追加した
gcloud
のデフォルトのリージョン構成を削除します。gcloud config unset run/region
プロジェクト構成を削除します。
gcloud config unset project
このチュートリアルで作成した他の Google Cloud リソースを削除します。
- Pub/Sub トピック
myRunTopic
を削除します。 - Pub/Sub サブスクリプション
myRunSubscription
を削除します。 - Artifact Registry から
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
という名前のコンテナ イメージを削除します。 - 呼び出し元のサービス アカウント
cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
を削除します
- Pub/Sub トピック
次のステップ
- 内部 Ingress 制御を使用して上り(内向き)を制限することで本番環境のセキュリティを向上させる方法については、上り(内向き)の制限をご覧ください。
- このチュートリアルでデプロイされたサンプル サービスを展開して、Cloud Storage にアップロードされた画像を変更する画像処理機能を追加する。
- トピックを Pub/Sub アーキテクチャに合わせる方法とトピックの管理方法を学習する。
- サブスクリプションの管理で Pub/Sub サブスクリプションの詳細を確認する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。