Slide 1

Slide 1 text

メルカリにおけるAI時代の 高速プロトタイピング基盤「Arca」 株式会社メルカリ 荒井 良太 X @ryot_a_rai ・ GitHub @ryotarai

Slide 2

Slide 2 text

の発達で、プロトタイプを作りやすくなった AI プロトタイプやアプリの作成が、エンジニア以外でもできるようになった。 コーディングエージェントに指示すれば、動くものができる コードを書けることが前提ではなくなった PdMやデザイナーも、自分のアイデアを自分で形にできる 「これ、どこで動かせばいいですか?」

Slide 3

Slide 3 text

: AIエージェント時代のVPS Arca Inspired by exe.dev 簡単に 永続ボリュームが ついたVPSのような 環境 エージェント、 社内ツール連携を 標準装備 安全に 環境に ガードレールを 組み込み 会社アカウントでの ログインが必須 共有できる を送るだけで共有 複数人で共同開発も 可能 URL

Slide 4

Slide 4 text

▶

Slide 5

Slide 5 text

社内での使われ方 プロトタイピング以外の用途にも広がっている アイデア検証 新機能や改善案を 触れる形にする 社内向けダッシュボード 検索・レコメンドの 指標 ユーザーリサーチの 結果 チームの入口ページ 社内ハッカソン 全社的に利用 アイデア募集から 成果物の公開まで Arca上で

Slide 6

Slide 6 text

「簡単に」始められる工夫

Slide 7

Slide 7 text

全体のアーキテクチャ:マシンができるまで インターネットへ Arca HTTP プロキシ 透過プロキシ エージェント .arca.example.com アプリ利用者 Cloud IAP AI プロキシ Arca arcad アプリ マシン (Pod) Arca arca.example.com アプリ作成者 Cloud IAP コンソール / API Arca 作成 Google Kubernetes Engine 永続ボリューム (/home)

Slide 8

Slide 8 text

エージェント入りの環境 プロンプトを送ると、エージェント入りのマシンが起動する メモ 起動を高速化するためマシン用サービスアカウントを事前作成しプールしている 準備済みのディスクイメージから永続ボリュームを作成し、GKE Sandbox (gVisor)のPodを 起動する 各プロダクト用にイメージを作っておくことで、開発環境をセットアップした状態で マシンを起動できる エージェント専用の、消えない1台 永続ボリューム付きなので、VPSのようにその場ですぐサービスを動かせる DB, Redisなどのステートフルなコンポーネントも気軽に中で動かせる

Slide 9

Slide 9 text

エージェントがすぐに作業を始められる などのガイドラインをあらかじめ配置 環境固有の手順を知った状態で始められる 社内標準の技術スタック(例: Go)とデザインシステムをデフォルトで使う Linear、GitHub、LiteLLMなどの社内ツールと連携済み 社内で共有されているClaude Codeプラグイン、エージェントスキルをプリインストール AGENTS.md

Slide 10

Slide 10 text

手元のエージェントから操作できる ( )とエージェント用のスキルを提供している 各個人のClaude Codeなどのエージェントから、Arcaの全ての操作ができる マシンの作成や共有の設定なども、コンソールを開かずに行える CLI arcactl

Slide 11

Slide 11 text

「安全に」使える工夫

Slide 12

Slide 12 text

エージェントに任せるには、安全な環境が必要 エージェントは自律的にコマンドを実行し、外部と通信する 指示の解釈違いやプロンプトインジェクションで、意図しない操作をすることもある 手元のPCや社内の認証情報をそのまま渡すと、影響範囲が大きい APIキーやトークンの漏えい、社内データの外部送信 通信とキーを基盤側で制御し、影響範囲を閉じ込める

Slide 13

Slide 13 text

全体のアーキテクチャ:外に出る経路は1本 インターネットへ Arca HTTP プロキシ 透過プロキシ エージェント .arca.example.com アプリ利用者 Cloud IAP AI プロキシ Arca arcad アプリ マシン (Pod) Arca arca.example.com アプリ作成者 Cloud IAP コンソール / API Arca 作成 Google Kubernetes Engine 永続ボリューム (/home)

Slide 14

Slide 14 text

プロキシの実装 HTTP で実装し、コントロールプレーンの中で動かしている マシン側(arcad) 80/443番への通信をiptablesでリレーに転送し、 プロキシへCONNECTする リレーは通信元プロセスのUIDを特定して伝える プロキシ側 独自CAでTLSを終端し、リクエストの中身を検査する マシン内のプロセス Go iptables のリレー・UIDを特定 arcad CONNECT プロキシ・検査と認証情報の付加 HTTP インターネット

Slide 15

Slide 15 text

許可されていない通信への応答 許可されていないエンドポイントには、HTTP 403と案内のメッセージを返す This environment restricts outbound destinations to keep AI agent usage safe. If you need an additional destination allowed, please reach out on Slack at #arca. エージェントがメッセージを認識し、人間に案内できる ルールはCEL (Common Expression Language) で、メソッド・ホスト・パスなどを条件に 書ける TLSを終端しているので、HTTPSでもパスやヘッダーまで見て判定できる method == "POST" && host == "example.com" && path == "/some/specific/endpoint"

Slide 16

Slide 16 text

キーをマシン内に置かない API キーの流出リスクを抑えるため、マシンにはキーを置かない 各種APIキーはHTTPプロキシで自動付加する GitHubには、リポジトリ単位でread/writeを絞ったトークンを 付加する git / REST / GraphQLを検査し、社内Organization以外への 書き込みは許可しない 個人ごとに紐づいたキーを付加するケースもある 個人ごとにLinuxユーザーを分け、通信元のUIDで特定する エージェント キーなしでリクエスト プロキシ HTTP キーを付加 などのAPI GitHub

Slide 17

Slide 17 text

の受け付け Webhook マシンの設定で、外部からのWebhookを受け付けられる マシンごとに、トークン付きのエンドポイントを発行する エンドポイントへのリクエストに、マシンは直接応答しない 事前に設定したステータスコードやボディを、Arcaが代わりに返す マシン上のアプリに脆弱性があっても、外部に悪用されるリスクを抑える 受け付けたリクエストは、非同期でマシンに配送される

Slide 18

Slide 18 text

の権限 Google Cloud 各マシンはユニークなGoogle Cloudの サービスアカウントを持つ ユーザーはマシンのサービスアカウントに権限を 付与できる 複数のマシンで共有するサービスアカウントも作れる マシンはその共有サービスアカウントの権限を 借用できる 各プロダクトのアプリを動かす前に、必要な権限を 揃えておける ユーザー マシン として動作 権限付与 マシンのSA 借用 共有SA 権限付与

Slide 19

Slide 19 text

「共有できる」工夫

Slide 20

Slide 20 text

全体のアーキテクチャ:URLで届く インターネットへ Arca HTTP プロキシ 透過プロキシ エージェント .arca.example.com アプリ利用者 Cloud IAP AI プロキシ Arca arcad アプリ マシン (Pod) Arca arca.example.com アプリ作成者 Cloud IAP コンソール / API Arca 作成 Google Kubernetes Engine 永続ボリューム (/home)

Slide 21

Slide 21 text

簡単に共有できる 既定は非公開、Google Driveのように権限を付与して URLを送るだけ URLはマシン内の特定のポートに自動で プロキシされる プロトタイプのページに直接コメントして フィードバックできる 認可はコントロールプレーンのプロキシでおこなう

Slide 22

Slide 22 text

権限に応じた共有 社内のメンバー管理システムと連携し、個人やチーム単位で共有できる Viewer アプリを使える ページに直接コメントできる 作成者に通知が届く Editor マシンの中に入って変更できる エージェントを使って一緒に 開発できる 1つのマシンを複数人で共同開発

Slide 23

Slide 23 text

コストを抑える工夫

Slide 24

Slide 24 text

マシンの自動停止 マシンは起動中ずっとリソースを確保する CPUはオーバーコミット、メモリは保証 24時間トラフィックがないマシンは自動停止 マシンが停止されると、Podが削除される /home (PersistentVolume) は永続化され、次回起動時に復元される 停止中マシンのURLにアクセスすると、その画面から起動できる

Slide 25

Slide 25 text

マシンの自動停止 を少ないノードに詰めて配置できる(ビンパッキング) マシンが起動し続けると、Kubernetesノード上のPodの配置が断片化する 自動停止によって、適宜再配置できる マシン用に、MostAllocated strategyのkube-schedulerをデプロイして使用 Pod

Slide 26

Slide 26 text

永続ボリュームの自動スナップショット マシン停止時に、永続ボリュームを自動でスナップショットへ移行する コスト削減 Hyperdisk Balanced Snapshot 約4割のコスト減 → Standard ゾーンを跨いで起動 ディスクは特定のゾーンに紐づく 任意のゾーンで復元できる ノードを有効活用できる 特定のゾーンのリソース枯渇に 対応できる

Slide 27

Slide 27 text

のコスト管理 LLM と連携している マシン上のエージェントは、LiteLLM経由でLLMを呼び出す マシンごとに予算を設定できる エージェントを自由に動かしても、コストの上限をコントロールできる 予算を超えると、エラーレスポンスに予算申請の案内を入れて返す エージェントがメッセージを読んで、人間に申請方法を案内できる LiteLLM

Slide 28

Slide 28 text

利用の広がり

Slide 29

Slide 29 text

続々と利用が広がっている 1,029人 ユニークアクセス数 346名 でアプリを作った人数 Arca 631台 マシン数

Slide 30

Slide 30 text

基盤の外でやったこと 利用者のSlackチャンネルで、つまずきに毎日答えた スタートアップのように手厚いサポートを提供する できるだけ速いレスポンスを心がける エージェント自身が案内役になるようにメッセージを提供する 例: 弾かれた通信先や予算超過など 社内ハッカソンで全社的に使ってもらった

Slide 31

Slide 31 text

まとめ アイデアを形にして共有するハードルが下がった 職種を問わず、多くのメンバーに浸透した 当初想定していたユースケースを超えて、様々な用途で使われている

Slide 32

Slide 32 text

ありがとうございました We are hiring!