この記事はRust+SvelteKit+CDKでRSS要約アプリを作ってみる Advent Calendar 2025の3日目の記事になります。
また、筆者が属している株式会社野村総合研究所のアドベントカレンダーもあるので、ぜひ購読ください。
monorepoのメリットとは
今回はmonorepoを採用しました。
monorepoを採用する理由でよくあるのが「フロントとバックのコンテキストを共有しやすい」というのがあると思います。例えばフロントとバックの両方をTypeScriptで書くようなアプリの場合、リポジトリを分けるとフロントとバックのインターフェースの同期が何かしらの仕組みで必要になります。monorepoを採用することで、同一リポジトリの中に必要な情報が閉じ込められているため、お互いのリソースを参照しやすくなります。
ここまで説明しておきながらですが、今回はフロントをSvelte、バックをRustで書いているため、あまりそのメリットは享受できません。
そもそもフロントとバックの疎通が無いので、インターフェースの旨みがほぼありません。
が、それでも今回はmonorepoにすることにしました。
AIフレンドリー(な気がする)
monorepoにした最大の理由は「開発がAIフレンドリーになる(気がする)」からでした。AIエージェントは基本的にプロジェクト内のファイルのみをコンテキストとして解釈します(間違っていたらすいません)。仕様をドキュメントとして書いてフロントやバックにも適用したい場合、もしくはフロントとバックを一気通貫で参照してAIに考えさせたい場合、monorepoの方が効率が良さそう、と考えました。
この考え方はある程度当たっていて、特にバックエンド側で定義したDBのスキーマを拾ってフロントのコードの提案をしてくれるのは大変助かりました。
本筋とはずれますが、そもそも最近はNext.jsやNuxtといった、従来のSPAフレームワークにサーバの存在感を持たせたメタフレームワークが台頭しているように感じます。これらを使うのであれば、そもそもmonorepoという考え方もあえてしなくなるのかな、と思っていたりします。
今回のディレクトリ構成
sumarss/
├── cdk/ # AWS CDK(インフラ定義)
│ ├── lib/
│ │ └── cdk-stack.ts # AWSリソース定義
│ ├── lambda/ # Rust Lambda関数
│ │ ├── src/
│ │ │ ├── bin/ # 各種Lamdba
│ │ │ ├── lib.rs # 共通ライブラリ
│ │ │ └── models.rs # データモデル
│ │ └── Cargo.toml
│ └── package.json
├── web/ # SvelteKitフロントエンド
│ ├── src/
│ │ ├── lib/
│ │ │ └── components/ # UIコンポーネント
│ │ ├── routes/ # ページルーティング
│ └── package.json
└── local/ # ローカル開発環境
├── docker-compose.yml # LocalStack設定
├── scripts/ # セットアップスクリプト
└── seed-data/ # テストデータ
各ディレクトリの役割
cdk/ - インフラストラクチャレイヤー
AWS CDKによるインフラ定義とRust製のLambda関数を含んでいます。lib/cdk-stack.tsでDynamoDB、S3、EventBridgeといったAWSリソースを定義し、lambda/bin配下にビジネスロジックを実装しています(一つのLambdaにつき一つのファイル)。RustのLambda関数はcargo-lambda-cdkパッケージを使ってCDKと統合されています。
web/ - プレゼンテーションレイヤー
SvelteKitで構築された静的サイトです。src/routes/でページを定義し、src/lib/components/に再利用可能なUIコンポーネントを配置しています。データベースとの接続などはsrc/lib配下のutilsで行なっています。
local/ - ローカル開発環境
LocalStackを使ったローカル開発環境の設定を格納しています。docker-compose.ymlでLocalStackコンテナを起動し、scripts/のシェルスクリプトで初期データの投入やLambdaの実行を行います。本番環境に近い状態でローカルで開発できる仕組みになっています。
CDKのディレクトリ内部にはプロダクション相当のもののみを置きたかったので、ローカル開発のためのリソースはトップレベルで別のディレクトリにしています。
Lambdaの実装
最初は、cdkディレクトリ配下にはAWSのリソースの定義のみを書き、ハンドラ自体は別ディレクトリでRustで書こうとしていました。ただ、いろいろと試す過程で、Lambdaのハンドラはcdkディレクトリに含めてしまった方が楽に開発を進められることがわかったので、そのようにしました。