ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

Cloud Run + oauth2-proxy で気軽に認証付きサイト

最近Google Cloud Runめちゃ面白いなーと色々触ってるんですが。

静的なサイトを認証付きで配布したいなーみたいな場合、Cloud Runとoauth2-proxyで手軽にできないかな? と思ったので手順を。

oauth2-proxy はOAuth2のプロバイダ(GoogleGitHub、他...)を指定して、そのプロバイダをアクセス時の認証に利用できるようにするプロクシ。

oauth2-proxy.github.io

実は簡易的に静的ファイルを公開する機能も備わっているので、静的なサイトであればこのサーバだけで完結させることができる。

Dockerfile は以下のように書く。

FROM bitnami/oauth2-proxy:6

USER 0
# 公開用のディレクトリ
RUN mkdir -p /var/www && chown 1001 /var/www
ADD entry.sh /
RUN chmod a+x /*.sh

USER 1001
# ここから適宜静的ファイルをCOPY
COPY index.html /var/www/index.html

ENTRYPOINT ["/entry.sh"]
CMD [""]

entry.sh はこういう感じ。

#!/bin/sh
exec oauth2-proxy --http-address=0.0.0.0:$PORT "$@"

ポイントなど:

  • bitnami/oauth2-proxy というベースイメージを使うと大体いい感じに立ち上がるんだけれど、ENTRYPOINToauth2-proxy コマンドに固定されるので上書きしている
    • 同じように実行ユーザも ID=1001 になっている
  • Cloud Runは $PORT という環境変数の示すポートをリッスンしていないといけないので、そのアドレスをコマンドの引数で渡せるようラッパーシェルを噛ませている。

ビルドはこんな感じで、

$ gcloud builds submit --tag gcr.io/youapj-example/o2ptest:0.0.1

デプロイはこう。これはGoogleアカウントを使う例。cloud runなどのオプションも適宜変更してください。

$ gcloud run deploy o2ptest-rc1 \
    --image=gcr.io/youapj-example/o2ptest:0.0.1 \
    --args=--email-domain=udzura.jp,--upstream='file:///var/www/#/' \
    --set-env-vars=OAUTH2_PROXY_CLIENT_ID=$CLIENT_ID,OAUTH2_PROXY_CLIENT_SECRET=$CLIENT_SECRET,OAUTH2_PROXY_COOKIE_SECRET=$COOKIE_SECRET \
    --platform managed \
    --memory 2Gi --cpu 2.0 \
    --allow-unauthenticated # Cloud Run 側では認証しない

もう一個のポイントが --upstream='file:///var/www/#/' の指定で、これは、ホストの /var/www/* のファイルをproxyへの /* のアクセスに対応させます、という意味になる模様。普通は別のサーバのアドレスなどを指定するが、こういう指定もできる。

あとはデプロイされたアドレスにアクセスすると、認証を求められるので、ぽちぽちすれば配信されたファイルが見えるという感じ。--email-domain やその他oauth2-proxyのオプションで許可する範囲を狭めることもできる。

CIごとにカバレッジファイルを公開するとか、そういう使い方ができそう。


想定されそうなツッコミ

IAP は?

なんか今の段階ではサクッと設定できなそうだった(たとえば、 Cloud Load BalancerのバックエンドにCloud Runが出てこない)ので、こういうやり方にしちゃいました。いい方法があればもちろん知りたい。