giftee Tech Blog

ギフティの開発を支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信しています。

社内向けアプリを爆速で公開するためのプラットフォームを作った

アイキャッチ

みなさん、隙間家具としての様々な社内ツールを作っていますか?エンジニアをしている @wa6sn です。

2025 年末ごろに、社内向けアプリをカジュアルに公開するためのプラットフォーム、Orbital 1 を作りました。ざっくり言うと 「コンテナイメージを置くだけで、サブドメインと社内認証つきの Web アプリが公開される」 ものです。いわゆる社内版 Heroku みたいなもの、と言うと伝わりやすいかもしれません。今回はこれを紹介します。

Orbital とは?

前述の説明の通りです。せっかくなので Orbital でアプリケーションを作る様子の gif アニメーションを貼っておきます。

ダッシュボードからアプリを作成する様子

ダッシュボードのトップと作成画面

はい、アプリケーション名として利用したい名前を入力するだけです。利用申請も不要で、社員であれば入社当日から利用できます。大変カジュアルでよろしいですね。Orbital および Orbital から払い出されたアプリケーションは、Identity-Aware Proxy(IAP) による認証がかかっています。弊社で利用されている Google Workspace と連携しており、社内のメンバーからのみアクセスできるようになっています。

アーキテクチャ

Google Kubernetes Engine と Identity-Aware Proxy が要素技術で、1 クラスタに複数のアプリを相乗りさせるマルチテナント構成です。

コアな部分を抜き出すと、以下のような仕様です。

  • 利用者は、アプリケーション名を決めて「アプリケーションを作成」ボタンを押します。これで専用の namespace と、その下に必要なインフラリソース一式、サブドメインが払い出されます。
    • サブドメインの扱いは ExternalDNS と cert-manager で実現しています。コスト集約のため LB を 1 つにして、複数アプリで共有するために Gateway API を採用しています。
    • MySQL も利用できます。アプリケーションごとに schema と user を払い出しています。
  • アプリケーション作成時に払い出された Artifact Registry にコンテナを push することで、アプリケーションが公開されます。
  • 利用者は k8s リソースを直接触ることはありません。ダッシュボードから環境変数を登録したり、再起動するのみです。

利用者側で必要なのは、コンテナをビルドする環境と、コンテナを push するための gcloud コマンドのインストールです。

なぜ作ったのか

他の人の考えたアイデアが、手軽にカタチになるような場所が欲しかったからです。自分が新卒で入った会社には、社内に「野良アプリ」を作る文化がありました。オンプレミス環境で、社内ネットワークに閉じた VM を手軽に立てられたので、それなりの割合の人が社内ツールやジョークアプリを作っていた気がします。「(社内向け)短縮 URL くん」「トリミングくん」みたいな業務ツールから、Code Golf プラットフォームやら懐かしの CGI ゲームまで、とにかく気軽にアプリを生やすことができる環境でした。

弊社はというと、(真面目な人が多いこともあって、)「エンジニアがアプリを作る」「アプリ ≒ ちゃんとした業務アプリ」という空気がまだありました。これを作った当時は社内に何かを公開するハードルもそこそこ高く、熱意のある人が Google Apps Script でがんばる、くらいの選択肢しか見かけませんでした。現代のクラウド環境では「余っているコンピュートリソースで遊ぼう」とはなかなかならず、コストを意識しなければいけないですからね。

一方で、生成 AI によって「とりあえず作ってみる」ことに関しては、ハードルがぐっと下がりました。この変化で、Slack 内でもスクリプトや HTML によるモックがやりとりされていることを見かけることがありました。だったら、気軽で安全な「アプリの置き場所」 を作るべきだよな、と思ったのが動機です。「Heroku のような既存の PaaS でいいのでは」という話はありますが、そのたびに毎回アカウントを作って社内限定の認証をかけるのは手間です。プラットフォーム側でまとめて面倒を見たほうが楽に決まっています。

作例

Orbital 自身のドキュメント

Orbital ドキュメント

プラットフォームのドキュメントサイトです。ドキュメント自身も Orbital で動いています。静的サイトをホスティングするのもいいですよ、というアピールにもなっています。

GitHub privileges viewer

GitHub privileges viewer

GitHub の権限ビューアです。本家のものだと「A さんに権限付与されているが、B さんには付与されていないリポジトリはどれか」のような、業務に合わせた柔軟な検索がしづらかったので自作したものです。

社内向けの Agent Skills カタログ

Agent Skills カタログ

Agent Skills を配布するカタログです。Agent Skills 自体は GitHub リポジトリに存在しますが、社内には GitHub にアカウントがない方もいます。リポジトリの中身から静的サイトを生成して公開することで、社内メンバーに配布できるようになっています。

会議室予約を便利にするアプリケーション

roomy

フロアマップから空いている会議室を探して、そのまま予約が取れます。新卒の方が作ってくれたアプリですが、とても使いやすく便利です。

徳を積むゲーム

toku-tower

上から降ってくる徳を落とさないように積みます。ランキングも存在します。

その他、業務の隙間家具としての細々としたツールがあります。

よもやま

アーキテクチャの割り切り

Orbital はアーキテクチャとしては極めてシンプルです。「何を作らなかったか」 が特徴と言えるかもしれません。

利用者には、中身である k8s はおろか、サーバという概念も一切意識させたくないと思っています。"Pod" とか別に知りたくないはずだし、メトリクスを見せても「CPU usage が 3% から 6% に上がった、何かがおかしい」みたいな話になりがちなので、そもそも見せていません。冗長化のような概念も割り切って捨てていて、何かあったら再起動だけは試せるという程度にしています。(k8s を触ったことがある人向けの説明になりますが、各アプリケーションは replicas: 1imagePullPolicy: Always とすることで、デプロイ ≒ 再起動という単純な仕様です)

Orbital 自身も、カジュアルなアプリケーション基盤というコンセプトなので、できるだけ運用したくないし作り込みたくありません。「定期実行」といった機能を増やすと、考えることが増えるのでやっていません。社内向けですから、ある程度サボってしまって、困ったら Slack で連絡してもらいます。

カジュアルとは、つまりそれでまったくよいのです。

ハードルを下げる工夫

「思いついたのでやってみたら、とりあえず動いた」という体験を大事にしたいです。そのため、利用申請も必要なく基本的にセルフサービスで進められるようになっています。

また、アイデアを Orbital に載せるためのプロンプトを「おまじない」としてドキュメントに記載しているほか、Agent Skills も社内ドキュメント経由で公開しています。このスキルでは Orbital の仕様をもとに「そもそもカジュアルなアプリケーションの範疇なのか?」といった壁打ちの支援から、作成したアプリケーションを Orbital に載せるまでの補助をしてくれます。

Orbital という社内のアプリケーション基盤にデプロイするための Docker コンテナを作りたいです。
以下の要件で、Dockerfile を作ってください。必要であれば、アプリケーションを改修してください。

- コンテナはポート 8080 で待ち受ける必要があります
- GET / に対して HTTP 200 を返す必要があります(ヘルスチェックで使われます)
...

おまじないとしてのプロンプト

「コンテナを作る」ということにハードルがあるのではという懸念があり、この工程も丸ごと抽象化することも検討していました。しかし、今のところ AI の力を借りるとそれなりになんとかなってしまうようで、便利な時代に驚いています。

おわりに

自分が一番のヘビーユーザーになるだろうという予感があったので、「これをぜひ使ってみてほしい」という宣伝は積極的にしていなかったのですが、いつの間にかいろんなアプリが生えていました。利用者はエンジニアの人に限らないですし、「他の人の考えたアイデアが、手軽にカタチになるような場所が欲しかった」という目的は達成できたようです。


  1. ギフティのロゴにアスタリスクがあるので、天体っぽい名前を候補にしつつ、様々なものが動いているということから「軌道」を連想し、この名前になりました