Hejdaの見る夢

一人前のエンジニアを目指して頑張ったこととかをつらつら書くブログ

Cloud Run を ID トークンによる簡易認証で見てみる ( Authorization: Bearer )

概要

Cloud Run のサービスに認証機構をつけたい場合は Identity-Aware Proxy ( IAP ) が推奨されます

cloud.google.com

しかし、 Cloud Load Balancing を設置したり Oauth 画面を設置したりしなくては行けず、すこし面倒です…

今回は Cloud Run の Permission だけで、 Web アプリを見れるやり方を試したいと思います

cloud.google.com

※ 今回は デプロイするアカウントと Cloud Run 上のアプリを見るアカウントは別の場合を想定しています

  • Developer の A
    • Cloud Run を使用している GCP Project 内で IAM などを変更出来る強い権限を持っている
  • Viewer の X ( = viewer-xxx@gmail.com )
    • Cloud Run 上にデプロイされた特定のサービスだけを閲覧のみ出来るユーザ
    • Cloud Run のページすら見れない

準備

A が Cloud Run に適当なサービスを 未公開 でデプロイします

今回は pkg-gcp-run-basic というサービスがデプロイされています

A による IAM での作業

※ 今回は デプロイするアカウントと Cloud Run 上のアプリを見るアカウントは別の場合を想定しています

A が Cloud Run が動いている GCP Project の IAM にて、 X の Google アカウントに Cloud Run Invoker(roles/run.invoker) を付与します

export _gcp_pj_id='Cloud Run を使用している GCP Project ID'
export _run_service='pkg-gcp-run-basic'
export _region='asia-northeast1'
export _web_viewer_account='viewer-xxx@gmail.com' 
gcloud beta run services add-iam-policy-binding ${_run_service} \
  --region=${_region} \
  --member="user:${_web_viewer_account}" \
  --role='roles/run.invoker' \
  --project ${_gcp_pj_id}

X の確認方法

X は自分の Google アカウントの ID トークンを利用することで Cloud Run のサービスを見ることが出来ます

gcloud beta auth print-identity-token ${_web_viewer_account}

上記で出力されたトークンをメモします

X がコマンドラインで確認

Cloud Run にデプロイしたサービスの URL が必要になります

export _run_service_url='Cloud Run にデプロイしたサービスの URL'
  • cURL コマンドにて、ヘッダに Authorization: Bearer で ID トークンを入れます
curl -H "Authorization: Bearer $(gcloud beta auth print-identity-token ${_web_viewer_account} )"  ${_run_service_url}
### Sample

# curl -H "Authorization: Bearer $(gcloud beta auth print-identity-token ${_web_viewer_account} )" ${_run_service_url}
Hello World!! :D

---> 見ることが出来ました :D

X が Web ブラウザで確認

Web ブラウザにてヘッダを修正する必要があります

今回は ModHeader を利用します

chrome.google.com

Request header に Authorization を入れ、ValueBearer [自分の ID トークン] を入れましょう

---> Web ブラウザでも無事に表示できました :D

まとめ

Cloud Run の Permission だけの時のアクセス方法を試しました

簡易的な確認であればこの認証方法でも問題無さそうですね!

もちろん、本格的な運用を考える時は IAP を使うことを推奨します ;)

Have fan !! :)