1. 概要
このラボでは、従業員が Cymbal Eats アプリから注文を表示、更新、削除できるようにする従業員ポータルをデプロイします。Identity-Aware Proxy(IAP)を使用して、バーチャル プライベート ネットワーク(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 を生成できます。または、ご自身でお試しになることもできます。このステップを終えた後は変更できず、プロジェクト期間中は維持されます。 - なお、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 を使用すると、Google Cloud サーバーレス アプリを外部 HTTP(S) ロード バランシングとともに使用できます。
- 従業員 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 同意画面に移動します。
- [User Type] で [MAKE EXTERNAL] をクリックする
- [公開ステータス] で [テスト] を選択
- [確認] をクリックします。
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 証明書が有効であることを確認する
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 Cloud SQL への接続
- Cloud Run からフルマネージド データベースへの接続
- Cloud Scheduler を使用した Cloud Run ジョブのトリガー
- Cloud Run への安全なデプロイ
- Cloud Run の上り(内向き)トラフィックの保護
- GKE Autopilot からプライベート AlloyDB への接続
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。