このチュートリアルでは、以下で構成される投票サービスの作成方法について説明します。
ブラウザベースのクライアント。次の処理を行います。
- Identity Platform を使用して ID トークンを取得する。
- ユーザーがお気に入りの動物に投票する。
- 取得した ID トークンをリクエストに付加して、投票を処理する Cloud Run サーバーに送信する。
Cloud Run サーバー。次の処理を行います。
- 有効な ID トークンが提供され、エンドユーザーが正しく認証されていることを確認する。
- エンドユーザーの投票を処理する。
- 独自の認証情報を使用して、投票結果を Cloud SQL に送信して保管する。
投票結果を保存する PostgreSQL データベース。
説明をわかりやすくするため、このチュートリアルでは Google をプロバイダとして使用します。ID トークンを取得するには、ユーザーは Google アカウントを使用して認証を行う必要があります。ただし、ユーザーのログインに他のプロバイダや認証方法を使用することもできます。
このサービスは、Secret Manager を使用して Cloud SQL インスタンスへの接続で使用されるセンシティブ データを保護し、セキュリティ リスクを最小限に抑えます。また、最小権限のサービス ID を使用して、データベースへのアクセスを保護します。
目標
次のことを行うサービスを作成、ビルドし、Cloud Run にデプロイします。
Identity Platform を使用し、Cloud Run サービスのバックエンドに対してエンドユーザーを認証します。
サービス用に最小権限の ID を作成して、Google Cloud リソースに対する最小のアクセス権を付与します。
Cloud Run サービスを PostgreSQL データベースに接続するときに Secret Manager を使用してセンシティブ データを扱います。
費用
このドキュメントでは、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, Secret Manager, Cloud SQL, Artifact Registry, and Cloud Build APIs.
必要なロール
チュートリアルを完了するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
-
Artifact Registry リポジトリ管理者(
roles/artifactregistry.repoAdmin
) - Cloud Build 編集者(
roles/cloudbuild.builds.editor
) - Cloud Run 管理者(
roles/run.admin
) - Cloud SQL 管理者(
roles/cloudsql.admin
) - サービス アカウントの作成(
roles/iam.serviceAccountCreator
) - Identity Platform 管理者(
roles/identityplatform.admin
) - OAuth Config 編集者(
roles/oauthconfig.editor
) - プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) - Secret Manager 管理者(
roles/secretmanager.admin
) - サービス アカウント ユーザー(
roles/iam.serviceAccountUser
) -
Service Usage ユーザー(
roles/serviceusage.serviceUsageConsumer
) -
ストレージ管理者(
roles/storage.admin
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
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 ダッシュボードにリージョンが表示されます。
コードサンプルを取得する
使用するコードサンプルを取得するには:
ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。
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 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Cloud Run のサンプルコードが含まれているディレクトリに移動します。
Node.js
cd nodejs-docs-samples/run/idp-sql/
Python
cd python-docs-samples/run/idp-sql/
Java
cd java-docs-samples/run/idp-sql/
アーキテクチャを可視化する
エンドユーザーが、Cloud Run サーバーに最初のリクエストを行います。
クライアントがブラウザに読み込まれます。
ユーザーが Identity Platform の Google ログイン ダイアログでログイン認証情報を入力します。ログインしたユーザーにアラートが表示されます。
制御がサーバーにリダイレクトされます。エンドユーザーがクライアントを使用して投票します。クライアントは、Identity Platform から ID トークンを取得して、投票リクエスト ヘッダーに追加します。
サーバーは、リクエストを受信すると、Identity Platform ID トークンを検証してエンドユーザーが適切に認証されていることを確認します。次に、サーバーは、独自の認証情報を使用して Cloud SQL に投票を送信します。
コアコードについて
このサンプルは、以下のようにクライアントとサーバーとして実装されます。
Identity Platform との統合: クライアント側のコード
このサンプルでは、Firebase SDK を使用して Identity Platform と統合し、ユーザーのログインと管理を行います。Identity Platform に接続するため、クライアント側の JavaScript はプロジェクトの認証情報への参照を構成オブジェクトとして保持し、必要な Firebase JavaScript SDK をインポートします。
Firebase JavaScript SDK は、ポップアップ ウィンドウを表示してエンドユーザーに Google アカウントへのログインを求めることにより、ログインフローを処理します。次に、サービスにリダイレクトします。
ユーザーがログインに成功すると、クライアントは Firebase メソッドを使用して ID トークンを作成します。クライアントが、この ID トークンをサーバーに対するリクエストの Authorization
ヘッダーに追加します。
Identity Platform との統合: サーバーサイド コード
サーバーでは、Firebase Admin SDK を使用して、クライアントから送信されたユーザー ID トークンを確認します。提供された ID トークンが正しい形式で、期限切れではなく、適切に署名されていれば、メソッドはデコードされた ID トークンを返します。そのユーザーの Identity Platform uid
が、サーバーにより抽出されます。
Node.js
Python
Java
サーバーを Cloud SQL に接続する
サービスは、/cloudsql/CLOUD_SQL_CONNECTION_NAME
の形式を使用して、Cloud SQL インスタンスの Unix ドメイン ソケットに接続します。
Node.js
Python
Java
Spring Cloud Google Cloud PostgreSQL スターター統合を使用して、Spring JDBC ライブラリを使用する Cloud SQL の PostgreSQL データベースを操作します。DataSource
Bean を自動的に構成するように Cloud SQL for MySQL 構成を設定します。これは、Spring JDBC と一体となり、データベースのクエリや変更などのオペレーションを可能にする JdbcTemplate
オブジェクト Bean を提供します。
Secret Manager で機密性の高い構成を処理する
Cloud SQL 構成などのセンシティブ データは、Secret Manager によって一元管理され、安全に保管されます。このサービスは、Secret Manager から環境変数を介してランタイムに Cloud SQL 認証情報を挿入します。詳しくは、Cloud Run でのシークレットの使用をご覧ください。
Node.js
Python
Java
Identity Platform を設定する
Identity Platform は、Google Cloud コンソールで手動で設定する必要があります。
Google Cloud コンソールで Identity Platform の Marketplace ページに移動します。
[Identity Platform を有効化] をクリックします。
OAuth 同意画面を作成します。
新しいウィンドウで、[API とサービス] > [認証情報] ページに移動します。
OAuth 同意画面のページを選択します。
テスト目的で [外部] を選択します。
[作成] をクリックします。
[アプリ情報] ダイアログで、次の操作を行います。
- アプリケーション名を入力します。
- 表示されたユーザー サポートメールのいずれかを選択します。
- デベロッパーの連絡先に使用するメールアドレスを入力します。
[保存して次へ] をクリックします。
[スコープ] ダイアログで、[保存して次へ] をクリックします。
[テストユーザー] ダイアログで、[保存して次へ] をクリックします。
[概要] ダイアログで、[ダッシュボードに戻る] をクリックします。
[公開ステータス] で、[アプリを公開] をクリックします。
[確認] をクリックします。
OAuth クライアント ID とシークレットを作成して取得します。
ページの上部にある [認証情報を作成] をクリックし、[
OAuth client ID
] を選択します。[アプリケーションの種類] で [ウェブ アプリケーション] を選択し、名前を入力します。
[作成] をクリックします。
client_id
とclient_secret
をメモします。これらは後の手順で使用します。
Google をプロバイダとして構成します。
Cloud コンソールで [ID プロバイダ] ページに移動します。
[プロバイダを追加] をクリックします。
リストから [Google] を選択します。
[ウェブ SDK 構成] で、前の手順でメモした
client_id
とclient_secret
の値を入力します。[アプリケーションの構成] で [詳細を設定] をクリックします。
apiKey
とauthDomain
の値をサンプルのstatic/config.js
にコピーして、Identity Platform Client SDK を初期化します。[保存] をクリックします。
サービスのデプロイ
次の手順に沿って、インフラストラクチャのプロビジョニングおよびデプロイを完了するか、Cloud Shell で [Run on Google Cloud] をクリックしてプロセスを自動化します。
Console または CLI を使用して、PostgSQL データベースの Cloud SQL インスタンスを作成します。
gcloud sql instances create CLOUD_SQL_INSTANCE_NAME \ --database-version=POSTGRES_12 \ --region=CLOUD_SQL_REGION \ --cpu=2 \ --memory=7680MB \ --root-password=DB_PASSWORD
Cloud SQL の認証情報の値を
postgres-secrets.json
に追加します。Node.js
Python
Java
コンソールまたは CLI を使用して、バージョニングされたシークレットを作成します。
gcloud secrets create idp-sql-secrets \ --replication-policy="automatic" \ --data-file=postgres-secrets.json
Console または CLI を使用して、サーバーのサービス アカウントを作成します。
gcloud iam service-accounts create idp-sql-identity
Console または CLI を使用して、Secret Manager と Cloud SQL にアクセスするためのロールを付与します。
サーバーに関連付けられたサービス アカウントに、作成したシークレットへのアクセスを許可します。
gcloud secrets add-iam-policy-binding idp-sql-secrets \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
サーバーに関連付けられたサービス アカウントに Cloud SQL へのアクセスを許可します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudsql.client
Artifact Registry を作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
REPOSITORY
はリポジトリの名前です。プロジェクト内のリポジトリのロケーションごとに、リポジトリ名は一意でなければなりません。
Cloud Build を使用してコンテナ イメージをビルドします。
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
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/idp-sql
コンソールまたは CLI を使用して、コンテナ イメージを Cloud Run にデプロイします。このサーバーは、未認証のアクセスを許可するようにデプロイされています。これは、ユーザーがクライアントを読み込んで処理を開始できるようにするためです。サーバーは、投票リクエストに追加された ID トークンを手動で検証し、エンドユーザーを認証します。
gcloud run deploy idp-sql \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql \ --allow-unauthenticated \ --service-account idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --add-cloudsql-instances PROJECT_ID:REGION:CLOUD_SQL_INSTANCE_NAME \ --update-secrets CLOUD_SQL_CREDENTIALS_SECRET=idp-sql-secrets:latest
また、
--service-account
、--add-cloudsql-instances
、--update-secrets
の各フラグにも注意してください。これらはそれぞれ、サービス ID、Cloud SQL インスタンス接続、環境変数としてバージョン付きシークレット名を指定します。
最後の仕上げ
Identity Platform では、ユーザーがログインした後に、Cloud Run サービスの URL を許可されたリダイレクトとして承認する必要があります。
[ID プロバイダ] ページでペンのアイコンをクリックして、Google プロバイダを編集します。
右側の [承認済みドメイン] で [ドメインを追加] をクリックし、Cloud Run サービスの URL を入力します。
ビルドまたはデプロイの後、サービス URL はログで確認できます。また、次のコマンドを使用して確認することもできます。
gcloud run services describe idp-sql --format 'value(status.url)'
-
OAuth クライアント ID の横にある鉛筆アイコンをクリックして編集し、
Authorized redirect URIs click the
[URI を追加] ボタンをクリックします。フィールドに、次の URL をコピーして貼り付け、ページ下部の [保存] ボタンをクリックします。
https://PROJECT_ID.firebaseapp.com/__/auth/handler
試してみる
完成したサービスを試すには:
ブラウザで、前述のデプロイの手順により提供された URL に移動します。
[Google でログイン] ボタンをクリックして、認証フローを行います。
投票します。
次のようになります。
これらのサービスを開発し続けることにした場合、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 run services delete SERVICE-NAME
SERVICE-NAME は、選択したサービス名です。
Cloud Run サービスは Google Cloud コンソールから削除することもできます。
チュートリアルの設定時に追加した gcloud のデフォルト リージョン構成を削除します。
gcloud config unset run/region
プロジェクト構成を削除します。
gcloud config unset project
このチュートリアルで作成した他の Google Cloud リソースを削除します。
次のステップ
- Cloud Run から Cloud SQL に接続する方法を確認する。
- ログイン プラットフォームと Identity Platform でユーザーを管理する方法を学習する。
- Cloud Run にデプロイされたサービスのデベロッパー、サービス、ユーザーを認証するその他の方法を確認する。
- 他の Cloud Run のデモ、チュートリアル、サンプルを確認する。