このチュートリアルでは、Cloud Run で実行されるセキュアな 2 つのサービス アプリケーションを作成する方法について説明します。このアプリケーションは、誰でもマークダウン テキストを作成できる一般公開の「フロントエンド」サービス、およびマークダウン テキストを HTML にレンダリングする限定公開の「バックエンド」サービスを含む、Markdown エディタです。
このバックエンド サービスは、Cloud Run 組み込みの IAM ベースのサービス間認証機能を使用した限定公開です。これにより、サービスを呼び出すことができるユーザーが限定されます。どちらのサービスも、最小権限の原則に基づいて構築されており、必要な場合を除いて Google Cloud のその他のサービスにはアクセスできません。
このチュートリアルの制限事項または目標でないこと
このチュートリアルでは、Identity Platform または Firebase Authentication を使用してユーザー ID トークンを生成し、手動でユーザー認証を行うエンドユーザー認証については説明しません。エンドユーザー認証の詳細については、Cloud Run チュートリアルのエンドユーザー認証をご覧ください。
IAM ベースの認証と ID トークンのメソッドを組み合わせることについては、サポートされていないためこのチュートリアルでは説明しません。
目標
- サービス間の認証用および Google Cloud のその他のサービスへのアクセス用に最小権限を持つ、専用のサービス アカウントを作成する。
- 対話する 2 つのサービスを作成およびビルドし、Cloud Run にデプロイする。
- 一般公開と限定公開の Cloud Run サービス間でリクエストを送信する。
費用
このドキュメントでは、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.
-
Make sure 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run API.
- gcloud CLI をインストールして初期化します。
- サービスを試用するために、curl をインストールします。
必要なロール
チュートリアルを完了するために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。
-
Cloud Build 編集者(
roles/cloudbuild.builds.editor
) -
Cloud Run 管理者(
roles/run.admin
) -
サービス アカウントの作成(
roles/iam.serviceAccountCreator
) -
プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) -
サービス アカウント ユーザー(
roles/iam.serviceAccountUser
) -
Service Usage ユーザー(
roles/serviceusage.serviceUsageConsumer
) -
ストレージ管理者(
roles/storage.admin
) -
Artifact Registry リポジトリ管理者(
roles/artifactregistry.repoAdmin
)
ロールの付与の詳細については、アクセス権の管理をご覧ください。
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
(大阪)europe-north1
(フィンランド) 低 CO2europe-southwest1
(マドリッド) 低 CO2europe-west1
(ベルギー) 低 CO2europe-west4
(オランダ) 低 CO2europe-west8
(ミラノ)europe-west9
(パリ) 低 CO2me-west1
(テルアビブ)us-central1
(アイオワ) 低 CO2us-east1
(サウスカロライナ)us-east4
(北バージニア)us-east5
(コロンバス)us-south1
(ダラス) 低 CO2us-west1
(オレゴン) 低 CO2
ティア 2 料金を適用
africa-south1
(ヨハネスブルグ)asia-east2
(香港)asia-northeast3
(ソウル、韓国)asia-southeast1
(シンガポール)asia-southeast2
(ジャカルタ)asia-south1
(ムンバイ、インド)asia-south2
(デリー、インド)australia-southeast1
(シドニー)australia-southeast2
(メルボルン)europe-central2
(ワルシャワ、ポーランド)europe-west10
(ベルリン) 低 CO2europe-west12
(トリノ)europe-west2
(ロンドン、イギリス) 低 CO2europe-west3
(フランクフルト、ドイツ) 低 CO2europe-west6
(チューリッヒ、スイス) 低 CO2me-central1
(ドーハ)me-central2
(ダンマーム)northamerica-northeast1
(モントリオール) 低 CO2northamerica-northeast2
(トロント) 低 CO2southamerica-east1
(サンパウロ、ブラジル) 低 CO2southamerica-west1
(サンティアゴ、チリ) 低 CO2us-west2
(ロサンゼルス)us-west3
(ソルトレイクシティ)us-west4
(ラスベガス)
Cloud Run サービスをすでに作成している場合は、Google Cloud コンソールの Cloud Run ダッシュボードにリージョンが表示されます。
コードサンプルを取得する
使用するコードサンプルを取得するには:
Cloud Shell またはローカルマシンにサンプルアプリ リポジトリのクローンを作成します。
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/markdown-preview/
Python
cd python-docs-samples/run/markdown-preview/
Go
cd golang-samples/run/markdown-preview/
Java
cd java-docs-samples/run/markdown-preview/
C#
cd dotnet-docs-samples/run/markdown-preview/
限定公開の Markdown レンダリング サービスを確認する
フロントエンドの観点から、Markdown サービスの簡単な API 仕様があります。
/
に 1 つのエンドポイントがある- POST リクエストの受信を想定する
- POST リクエストの本文が、Markdown テキストである
セキュリティ上の問題については、すべてのコードを確認するか、または ./renderer/
ディレクトリで詳細を確認してください。このチュートリアルでは、Markdown 変換コードについては説明しません。
限定公開の Markdown レンダリング サービスを配布する
コードを配布するには、Cloud Build でビルドし、Artifact Registry にアップロードしてから、Cloud Run にデプロイします。
renderer
ディレクトリに移動します。Node.js
cd renderer/
Python
cd renderer/
Go
cd renderer/
Java
cd renderer/
C#
cd Samples.Run.MarkdownPreview.Renderer/
Artifact Registry を作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
次のように置き換えます。
- REPOSITORY は、リポジトリの一意の名前に置き換えます。プロジェクト内のリポジトリのロケーションごとに、リポジトリ名は一意でなければなりません。
- REGION は、Artifact Registry リポジトリに使用する Google Cloud リージョンに置き換えます。
次のコマンドを実行してコンテナをビルドし、Artifact Registry に公開します。
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
PROJECT_ID は Google Cloud プロジェクト ID、
renderer
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
PROJECT_ID は Google Cloud プロジェクト ID、
renderer
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
PROJECT_ID は Google Cloud プロジェクト ID、
renderer
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Java
このサンプルでは、Jib を使用して一般的な Java ツールにより Docker イメージをビルドします。Jib は、Dockerfile や Docker をインストールせずにコンテナのビルドを最適化します。Jib を使用して Java コンテナを構築する方法の詳細を確認します。
Docker を承認して Artifact Registry に push するには、gcloud 認証ヘルパーを使用します。
gcloud auth configure-docker
Jib Maven プラグインを使用して、コンテナをビルドし Artifact Registry に push します。
mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
PROJECT_ID は Google Cloud プロジェクト ID、
renderer
はサービスに付ける名前です。ビルドが成功すると、BUILD SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
PROJECT_ID は Google Cloud プロジェクト ID、
renderer
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
アクセスが制限された限定公開のサービスとしてデプロイします。
Cloud Run では、すぐに使用できる機能としてアクセス制御とサービス ID があります。アクセス制御では、ユーザーやその他のサービスによるサービスの呼び出しを制限する認証レイヤが提供されます。サービス ID によって、権限が制限された専用のサービス アカウントを作成することにより、その他の Google Cloud リソースへのアクセスが制限できます。
レンダリング サービスの「コンピューティング ID」として機能する、サービス アカウントを作成します。デフォルトでは、このアカウントにプロジェクト メンバーシップ以外の権限は付与されません。
コマンドライン
gcloud iam service-accounts create renderer-identity
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
Markdown レンダリング サービスは、Google Cloud 内のその他のサービスとは直接には統合されません。それ以上の権限は必要ありません。
renderer-identity
サービス アカウントを使用してデプロイします。未認証のアクセスは拒否します。コマンドライン
gcloud run deploy renderer \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer \ --service-account renderer-identity \ --no-allow-unauthenticated
このサービス アカウントが同じプロジェクトに含まれている場合は、Cloud Run において、短い形式のサービス アカウント名を完全なメールアドレスの代わりに使用できます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
限定公開の Markdown レンダリング サービスを試用する
限定公開のサービスは、ウェブブラウザから直接読み込むことはできません。その代わりに、curl
を使用するか、または Authorization
ヘッダーを挿入できる同様の HTTP リクエスト CLI ツールを使用します。
このサービスに太字のテキストを送信し、それによりマークダウン アスタリスクが HTML の <strong>
タグに変換されるのを確認するには、次の手順を行います。
デプロイ出力から URL を取得します。
gcloud
を使用して、特別な開発専用の ID トークンを取得します。TOKEN=$(gcloud auth print-identity-token)
未加工の Markdown テキストを、URL の生成から除外されたクエリ文字列のパラメータとして渡す、curl リクエストを作成します。
curl -H "Authorization: Bearer $TOKEN" \ -H 'Content-Type: text/plain' \ -d '**Hello Bold Text**' \ SERVICE_URL
SERVICE_URL は、Markdown レンダリング サービスのデプロイ後に提供された URL に置き換えます。
レスポンスは HTML スニペットである必要があります。
<strong>Hello Bold Text</strong>
エディタ サービスとレンダリング サービスの統合を確認する
エディタ サービスは、単純なテキスト入力 UI と HTML プレビューを表示する空間を提供します。続行する前に、./editor/
ディレクトリを開いて、先ほど取得したコードを確認してください。
次に、以下のセクションで 2 つのサービスをセキュアに統合するコードを確認します。
Node.js
render.js
モジュールは、限定公開の Renderer サービスへの認証済みリクエストを作成します。Cloud Run 環境の Google Cloud メタデータ サーバーを使用して、ID トークンを作成し、その ID トークンを Authorization
ヘッダーの一部として HTTP リクエストに追加します。
他の環境では、render.js
がアプリケーションのデフォルト認証情報を使用して Google のサーバーからトークンをリクエストします。
JSON のマークダウンを解析し、HTML に変換する Renderer サービスに送信します。
Python
new_request
メソッドは、限定公開サービスに対する認証済みリクエストを作成します。Cloud Run 環境の Google Cloud メタデータ サーバーを使用して、ID トークンを作成し、その ID トークンを Authorization
ヘッダーの一部として HTTP リクエストに追加します。
他の環境では、new_request
は、アプリケーションのデフォルト認証情報で認証することで Google のサーバーから ID トークンをリクエストします。
JSON のマークダウンを解析し、HTML に変換する Renderer サービスに送信します。
Go
RenderService
は、限定公開サービスに対する認証済みリクエストを作成します。Cloud Run 環境の Google Cloud メタデータ サーバーを使用して、ID トークンを作成し、その ID トークンを Authorization
ヘッダーの一部として HTTP リクエストに追加します。
他の環境では、RenderService
は、アプリケーションのデフォルト認証情報で認証することで Google のサーバーから ID トークンをリクエストします。
変換するマークダウン テキストを HTML に追加した後、リクエストが Renderer サービスに送信されます。レンダリング機能と通信の問題を切り分けるため、レスポンス エラーが処理されます。
Java
makeAuthenticatedRequest
は、限定公開サービスに対する認証済みリクエストを作成します。Cloud Run 環境の Google Cloud メタデータ サーバーを使用して、ID トークンを作成し、その ID トークンを Authorization
ヘッダーの一部として HTTP リクエストに追加します。
他の環境では、makeAuthenticatedRequest
は、アプリケーションのデフォルト認証情報で認証することで Google のサーバーから ID トークンをリクエストします。
JSON のマークダウンを解析し、HTML に変換する Renderer サービスに送信します。
C#
GetAuthenticatedPostResponse
は、限定公開サービスに対する認証済みリクエストを作成します。Cloud Run 環境の Google Cloud メタデータ サーバーを使用して、ID トークンを作成し、その ID トークンを Authorization
ヘッダーの一部として HTTP リクエストに追加します。
他の環境では、GetAuthenticatedPostResponse
は、アプリケーションのデフォルト認証情報で認証することで Google のサーバーから ID トークンをリクエストします。
JSON のマークダウンを解析し、HTML に変換する Renderer サービスに送信します。
一般公開のエディタ サービスを配布する
コードをビルドしてデプロイするには、次の手順を行います。
editor
ディレクトリに移動します。Node.js
cd ../editor
Python
cd ../editor
Go
cd ../editor
Java
cd ../editor
C#
cd ../Samples.Run.MarkdownPreview.Editor/
次のコマンドを実行してコンテナをビルドし、Artifact Registry に公開します。
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
PROJECT_ID は Google Cloud プロジェクト ID、
editor
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Container Registry に保存されます。このイメージは必要に応じて再利用できます。
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
PROJECT_ID は Google Cloud プロジェクト ID、
editor
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
PROJECT_ID は Google Cloud プロジェクト ID、
editor
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Java
このサンプルでは、Jib を使用して一般的な Java ツールにより Docker イメージをビルドします。Jib は、Dockerfile や Docker をインストールせずにコンテナのビルドを最適化します。Jib を使用して Java コンテナを構築する方法の詳細を確認します。mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
PROJECT_ID は Google Cloud プロジェクト ID、
editor
はサービスに付ける名前です。ビルドが成功すると、BUILD SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
C#
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
PROJECT_ID は Google Cloud プロジェクト ID、
editor
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
レンダリング サービスへの特別なアクセス権を持つ、限定公開のサービスとしてデプロイします。
限定公開サービスの「コンピューティング ID」として機能する、サービス アカウントを作成します。デフォルトでは、このアカウントにプロジェクト メンバーシップ以外の権限は付与されません。
コマンドライン
gcloud iam service-accounts create editor-identity
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
エディタ サービスは、Markdown レンダリング サービス以外の Google Cloud 内の要素とやり取りする必要はありません。
editor-identity
コンピューティング ID へのアクセス権を付与して、Markdown レンダリング サービスを呼び出します。このコンピューティング ID を使用するすべてのサービスに、この権限が付与されています。コマンドライン
gcloud run services add-iam-policy-binding renderer \ --member serviceAccount:editor-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/run.invoker
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
レンダリング サービスのコンテキスト内で起動元ロールが付与されるため、このレンダリング サービスは、エディタから呼び出せる唯一の限定公開 Cloud Run サービスになります。
editor-identity
サービス アカウントでデプロイし、一般公開の未認証アクセスを許可します。コマンドライン
gcloud run deploy editor --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor \ --service-account editor-identity \ --set-env-vars EDITOR_UPSTREAM_RENDER_URL=SERVICE_URL \ --allow-unauthenticated
次のように置き換えます。
- PROJECT_ID はプロジェクト ID に置き換えます。
- SERVICE_URL は、Markdown レンダリング サービスのデプロイ後に提供された URL に置き換えます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
エディタ サービスをデプロイします。
サービスを呼び出すための
allUsers
権限を付与します。
HTTPS トラフィックについて
これらのサービスを使用したマークダウンのレンダリングに関する HTTP リクエストは 3 つあります。
試してみる
完全な 2 つのサービス アプリケーションを試すには、次の手順を行います。
ブラウザで、前述のデプロイの手順により提供された URL に移動します。
左側のマークダウン テキストを編集してからボタンをクリックすると、右側にプレビューが表示されます。
次のようになります。
これらのサービスを開発し続けることにした場合、Google Cloud の他のサービスへの Identity and Access Management(IAM)アクセスが制限されます。他の多くのサービスにアクセスするには、追加の IAM ロールをこれらのサービスに与える必要があることにご注意ください。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金されないようにする最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- 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 サービスを削除します。
gcloud
gcloud run services delete editor gcloud run services delete renderer
Cloud Run サービスは Google Cloud コンソールから削除することもできます。
チュートリアルを設定したときに追加した gcloud のデフォルト構成を削除します。
gcloud config unset run/region
プロジェクト構成を削除します。
gcloud config unset project
このチュートリアルで作成した他の Google Cloud リソースを削除します。
- Artifact Registry から
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/editor
という名前のエディタ コンテナ イメージを削除します。 - Artifact Registry から
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/renderer
という名前のレンダリング コンテナ イメージを削除します。 - エディタ サービス アカウント
editor-identity@PROJECT_ID.iam.gserviceaccount.com
を削除します - レンダリング サービス アカウント
renderer-identity@PROJECT_ID.iam.gserviceaccount.com
を削除します
- Artifact Registry から
次のステップ
- IAM を安全に使用するチェックリストに沿ってプロジェクトをさらに保護する
- このサンプル アプリケーションを拡張して、Cloud Monitoring のカスタム指標で Markdown の使用状況を追跡する
- 安全な非同期マイクロ サービスへのアプローチについては、Pub/Sub チュートリアルを確認する