🍓

適当に作ったWebアプリを雑に社内公開したい、そんなときはCloud Runがお勧め

に公開

はじめに

みなさんは、こんな経験はないでしょうか。

  • 業務効率化に繋がるちょっとしたWebアプリを手元で作ってみたが、自分しか使っていない。
  • 他の人も使えたら便利かもしれないけど、社内限定で公開する方法が分からない。
  • 公開するためのセキュリティを考えるのが面倒くさい。

その結果、自分専用になってしまったアプリがローカルPCに眠っていませんか?

そのWebアプリ、Google CloudのCloud Runなら簡単に認証付きでデプロイできます。

やってみよう

アプリを用意しよう

サンプルのWebアプリを用意しました。

https://github.com/k-ibaraki/sample-web-app

create viteで初期化しただけのReactアプリで、便利ツールでもなんでもないですが、今回はそれを便利ツールとみなして社内の特定のメンバーに公開するシナリオを試してみましょう。

コンテナ化しよう

Dockerfileを作ります。
https://github.com/k-ibaraki/sample-web-app/blob/main/Dockerfile

今回は比較的丁寧に、ビルドした上でhttp-serverで起動するようにしました。ですが、より雑にnpm run devで動かしてもいいと思います。雑な社内用ツールですので。

GitHubにPushしよう

アプリをGitHubにPushしておきましょう。
もちろんprivateでOKです。

Google Cloudで、Cloud RunとCloud Buildを有効化しよう

Cloud Runを初めて使う場合は、まずはCloud BuildとCloud RunのAPIを有効化しましょう。
以下のURLからそれぞれ有効化してもいいですし、ブラウザでGoogle Cloudのコンソールを開いて画面の指示に従って有効化しても良いです。

Cloud Runにアプリをデプロイしよう

ブラウザでCloud Runのコンソールを開いて、画面上部の「リポジトリを接続」を選択します。
Cloud Runのコンソール

「Cloud Buildの設定」を押下します。
Cloud Buildの設定を押下

GitHubのリポジトリを選択します。
リポジトリが表示されない場合は、画面に従ってGitHubのリポジトリに権限を付与してください。
長い注意書きをよく読んだらチェックボックスをチェックして、「次へ」を押下します。
GitHubのリポジトリを選択

ビルド構成を必要に応じて変更します。今回はデフォルトのままで問題なかったので、このまま「保存」します。
ビルド構成

Cloud Runのサービス作成に戻るので、適当に設定を埋めていきます。
今回は以下のように入れましたが、必要に応じて変更してください。

  • サービスの名前
    • sample-web-app
  • リージョン
    • asia-northeast1 (東京)
  • 認証
    • 重要なので別途説明します
  • 課金
    • リクエストベース
  • サービスのスケーリング
    • 自動スケーリング
      • インスタンスの最小数 : 0
      • インスタンスの最大数 : 1
  • Ingress
    • すべて
  • コンテナ、ボリューム、ネットワーキング、セキュリティ
    • (特別な設定やこだわりが不要ならデフォルトでOK)

一通り設定したら「作成」を押下すれば、自動でデプロイされます。
なお、認証の設定は次のセクションを参照してください。

認証の設定

「認証が必要」にして、「Identity-Aware Proxy(IAP)」にチェックをしてください。
なお「IAM」のチェックは外してください。
認証の設定

「ポリシーの編集」を押下して、「Principal 1」にアクセス許可を付与したい対象を入力してください。アクセス許可は、以下に対して付与できます。

  • Google Workspace ドメイン: example.com
  • Google グループ: admins@googlegroups.com
  • Google アカウントのメールアドレス: user@gmail.com
  • サービス アカウント: server@example.gserviceaccount.com

私としては、Googleグループで社内の特定のグループにアクセス権限を付与するのがお勧めですが、ドメイン全体(つまり会社の組織全体)に権限を付与することもできます。

アクセス権限を付与する

隣の「アクセスレベル(オプション)」は触れなくてよいので、「Principal 1」を設定したら「保存」しましょう。

その他補足

最小インスタンス数について

インスタンスの最小数0にすることで、Cloud Runはしばらくアクセスがない状態が続くとインスタンス数0までスケールインします。つまりインフラコストがゼロになり非常にお得です。
ただし、この状態だと次にアクセスした時の起動に時間がかかるので注意が必要です。

サービスアカウントについて

「コンテナ、ボリューム、ネットワーキング、セキュリティ」はデフォルトでOKと書きましたが、「セキュリティ」の「サービスアカウント」に関しては、可能であればアプリ専用のサービスアカウントを作成し必要最小の権限のみを付与することを推奨します。

動作確認

一通り設定して「作成」を押下してしばらく待つとアプリがデプロイされます。
表示されるURLにアクセスしてみましょう。
デプロイされたアプリのCloud Runのコンソール画面

Googleのログイン画面に飛ばされます。
Googleのログイン画面

アクセス許可を与えたアカウントでログインすればアプリにつながります。
デプロイしたアプリの画面

権限がないアカウントでログインすると、エラーになります。
権限がない場合のエラー画面

以上で許可された社内メンバーにだけアプリを公開することができました。
手順を振り返ってみると、Dockerfileさえ作ってしまえば後は、画面でポチポチするだけで、認証付きのWebアプリをデプロイできたことになります。

さらに、GitHubのmainブランチと連携したことにより、mainブランチが更新されると自動で再デプロイもしてくれるのもとても便利です。

そして、最小インスタンス数を0にしておけば、使ってない時の費用は0円です。
維持コストの心配もありません。

まとめ

Cloud Runを使えば、

  • Webアプリを簡単にデプロイできる
  • しかも、認証を簡単につけられる
  • しかも、アプリ更新時の再デプロイは自動
  • しかも、アクセスしたとき以外の維持コストはゼロ

Cloud Runを使って、ローカルで眠っている便利アプリを社内に公開してはどうでしょうか?

参考ドキュメント

https://cloud.google.com/run/docs/continuous-deployment-with-cloud-build?hl=ja

NCDCエンジニアブログ

Discussion