1. 概要
このラボでは、従業員が Cymbal Eats アプリから注文を表示、更新、削除できるようにする従業員ポータルをデプロイします。Identity-Aware Proxy(IAP)を使用して、Virtual Private Network(VPN)を使用せずにポータルへのアクセスを保護します。IAP を使用すると、ゼロトラスト アクセス モデルの実装が簡素化され、オンプレミス環境とクラウド環境の両方でリモート ワーカーが VPN よりも短時間でアプリへのアクセスを管理できます。
Identity-Aware Proxy とは
Identity-Aware Proxy(IAP)は Google Cloud のサービスです。アプリケーションに送信されたリクエストをインターセプトし、Google Identity Service を使用してリクエストを送信したユーザーの認証を行い、アプリケーションへのアクセスが許可されているユーザーからのリクエストのみを通過させます。さらに、リクエスト ヘッダーを変更して認証されたユーザーに関する情報を含めることができます。
学習内容
- サーバーレス ネットワーク エンドポイント グループ(NEG)を構成する方法
- ロードバランサを構成する方法
- IAP を有効にしてアクセスを制限する方法
- IAP を使用してアクセスを制限する方法
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。
- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この場所はいつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_ID
と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
環境設定
- プロジェクトとリソースに関連する環境変数を作成する
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
- IAP と Cloud Resource Manager サービス API を有効にする
gcloud services enable \
iap.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudidentity.googleapis.com \
compute.googleapis.com
- サンプルアプリ リポジトリのクローンを作成してディレクトリに移動する
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
- セットアップ スクリプトを使用して従業員ポータルをデプロイします。スクリプトが完了するまで待ってから、次のステップに進みます。
./setup.sh
出力例
... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- サービス URL リンクをクリックします。
3. サーバーレス ネットワーク エンドポイント グループ(NEG)の構成
社員向け UI の Cloud Run サービスにサーバーレス ネットワーク エンドポイント グループ(サーバーレス NEG)を作成します。サーバーレス NEG を使用すると、外部 HTTP(S) ロード バランシングを適用した Google Cloud サーバーレス アプリを使用できます。
- 社員向け UI サービスのネットワーク エンドポイント グループを作成します。
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
--project $PROJECT_ID \
--region=$REGION \
--network-endpoint-type=serverless \
--cloud-run-service=employee-ui-service
出力例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg]. Created network endpoint group [employee-ui-iap-neg].
バックエンド サービスを作成してサーバーレス NEG を追加する
バックエンド サービスは、Cloud Load Balancing によるトラフィックの分散方法を定義します。バックエンド サービスの構成には、バックエンドへの接続に使用されるプロトコル、さまざまな配信とセッションの設定、ヘルスチェック、タイムアウトなどの値が含まれます。これらの設定により、ロードバランサの動作を細かく制御できます。
- バックエンド サービスを作成する
gcloud compute backend-services create employee-ui-iap-backend \
--global
出力例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend]. NAME: employee-ui-iap-backend BACKENDS: PROTOCOL: HTTP
- サーバーレス NEG をバックエンドとしてバックエンド サービスに追加します。
gcloud compute backend-services add-backend employee-ui-iap-backend \
--global \
--network-endpoint-group=employee-ui-iap-neg \
--network-endpoint-group-region=$REGION
出力例
Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
- 受信リクエストをバックエンド サービスに転送するための URL マップを作成する
gcloud compute url-maps create employee-ui-iap-url-map \
--default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map]. NAME: employee-ui-iap-url-map DEFAULT_SERVICE: backendServices/employee-ui-iap-backend
4. ロードバランサ コンポーネントの構成
次の図は、ロードバランサがサーバーレス NEG バックエンドを使用して、リクエストをサーバーレス Cloud Run サービスに転送していることを示しています。
静的 IP アドレスを予約する
- 静的 IPv4 アドレスを予約してドメインを保存する
gcloud compute addresses create employee-ui-iap-ip \
--network-tier=PREMIUM \
--ip-version=IPV4 \
--global
出力例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
- nip.io ドメインを保存する
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io
Google マネージド SSL 証明書リソースを作成する
- Google マネージド SSL 証明書リソースを作成する
gcloud compute ssl-certificates create employee-ui-iap-cert \
--description=employee-ui-iap-cert \
--domains=$DOMAIN \
--global
出力例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert]. NAME: employee-ui-iap-cert TYPE: MANAGED CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00 EXPIRE_TIME: MANAGED_STATUS: PROVISIONING 34.102.234.98.nip.io: PROVISIONING
ターゲット HTTPS プロキシを作成する
- URL マップにリクエストを転送するターゲット HTTPS プロキシを作成する
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
--ssl-certificates employee-ui-iap-cert \
--url-map employee-ui-iap-url-map
出力例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy]. NAME: employee-ui-iap-http-proxy SSL_CERTIFICATES: employee-ui-iap-cert URL_MAP: employee-ui-iap-url-map CERTIFICATE_MAP:
転送ルールを構成する
- 受信リクエストをプロキシに転送する転送ルールを作成します。
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
--load-balancing-scheme=EXTERNAL \
--network-tier=PREMIUM \
--address=employee-ui-iap-ip \
--global \
--ports=443 \
--target-https-proxy employee-ui-iap-http-proxy
出力例
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].
Cloud Run サービスへの上り(内向き)を制限する
内部リクエストと HTTP(S) ロード バランシング経由のリクエストのみを受け入れるように上り(内向き)トラフィックを制限します。
- 内部リクエストと HTTP(S) ロードバランサ経由のリクエストからの上り(内向き)トラフィックのみを許可するようにサービスを更新する
gcloud run services update employee-ui-service \
--ingress internal-and-cloud-load-balancing \
--region $REGION
出力例
OK Deploying... Done. OK Creating Revision... OK Routing traffic... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- [サービス URL] リンクをクリックします。
Cloud Run サービス URL へのアクセスが禁止されていることがわかります。
5. ロードバランサでの Cloud Identity-Aware Proxy(IAP)の有効化
IAP を使用すると、HTTPS によってアクセスされるアプリケーションの一元的な認可レイヤを確立できます。ネットワーク レベルのファイアウォールの代わりに、アプリケーション レベルのアクセス制御モデルを使用できます。
OAuth 同意画面の構成
ブランドとは、ユーザーのブランド情報が含まれる OAuth 同意画面です。ブランドは、内部ユーザーまたはパブリック ユーザーに限定される場合があります。内部ブランドを使用すると、プロジェクトと同じ Google Workspace 組織のメンバーが OAuth フローにアクセスできるようになります。パブリック ブランドを使用すると、インターネットにアクセスできるすべてのユーザーが OAuth フローにアクセスできるようになります。
- ブランドを作成する
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
gcloud alpha iap oauth-brands create \
--application_title="Cymbal Eats" \
--support_email=$USER_EMAIL
出力例
Created [462858740426]. applicationTitle: Cymbal Eats name: projects/462858740426/brands/462858740426 orgInternalOnly: true
IAP OAuth クライアントの作成
- 前の手順のブランド名を使用してクライアントを作成する
gcloud alpha iap oauth-clients create \
projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
--display_name=cymbal-eats-employee-ui
出力例
Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com]. displayName: cymbal-eats-employee-ui name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com secret: [secret-removed]
- クライアント名、ID、シークレットを保存する
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
--filter="displayName:cymbal-eats-employee-ui")
export CLIENT_ID=${CLIENT_NAME##*/}
export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
- Cloud コンソールで、プロジェクト選択プルダウン メニューからプロジェクトを選択します。
- Cloud コンソールで OAuth 同意画面に移動します。
- [ユーザーの種類] の下の [外部にする] をクリックします。
- [公開ステータス] で [テスト中] を選択します。
- [確認] をクリックします。
6. IAP を使用してアクセスを制限する
IAP を使用してバックエンド サービスへのアクセスを制限し、アプリケーションにアクセスできないことを確認します。
- バックエンド サービスで IAP を有効にする
gcloud iap web enable --resource-type=backend-services \
--oauth2-client-id=$CLIENT_ID \
--oauth2-client-secret=$CLIENT_SECRET \
--service=employee-ui-iap-backend
IAP 構成を確認する
- SSL 証明書が ACTIVE であることを確認する
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
- サービス URL を取得する
echo https://$DOMAIN
出力例
https://34.102.234.98.nip.io
- サービス URL をクリックして、社員ポータルを開きます。
- ラボの認証情報を使用してログインします。
- ブラウザを閉じる
社員ポータルへのアクセス権をユーザーに付与する
- 前の手順で作成したユーザーの
'roles/iap.httpsResourceAccessor'
ロールの IAM ポリシー バインディングを追加します。
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=employee-ui-iap-backend \
--member=user:$USER_EMAIL \
--role='roles/iap.httpsResourceAccessor'
出力例
Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].
サービスへのアクセスをテストする
社員ポータルへのアクセス権が付与されていることを確認する
- サービス URL を取得する
echo https://$DOMAIN
出力例
https://34.102.234.98.nip.io
- サービス URL をクリックして、社員ポータルを開きます。
これで、社員ポータルにアクセスできるようになります。
(省略可)すべての依存関係をデプロイします。これらのマイクロサービスのデプロイには 20 分ほどかかることがあります。
unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL
cd ~/cymbal-eats
./setup.sh
./get-site-urls.sh
7. 完了
お疲れさまでした。これでこの Codelab は終了です。
次のステップ:
Cymbal Eats の他の Codelab をご確認ください。
- Eventarc を使用して Cloud Workflows をトリガーする
- Cloud Storage からイベント処理をトリガーする
- Cloud Run から Private CloudSQL に接続する
- Cloud Run からフルマネージド データベースに接続する
- Cloud Scheduler による Cloud Run ジョブのトリガー
- Cloud Run への安全なデプロイ
- Cloud Run 上り(内向き)トラフィックの保護
- GKE Autopilot からプライベート AlloyDB に接続する
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。