はじめに
バックエンド開発をやっていると、用途によってフレームワークを使い分けることが多いですよね。
APIサーバーならExpress、バックグラウンドジョブならBullMQ、ワークフローならTemporal。それぞれ良いツールなんですけど、プロジェクトが大きくなると管理が煩雑になってくる。
「これ、全部統一できないの?」と思っていたら、いいフレームワークを見つけました。
それがMotia。「Step」という単一のプリミティブで、APIもジョブもワークフローもAIエージェントも構築できるという、かなり野心的なフレームワークです。
GitHubスターは11,000を超えていて、開発も活発。個人的にはこれ、かなり注目しています。
Motiaとは
Motiaは「one STEP to build any backend」をコンセプトにしたマルチ言語対応のバックエンドフレームワークです。
従来は複数のライブラリやフレームワークを組み合わせて実現していた機能を、「Step」という統一された概念で構築できます。TypeScript、JavaScript、Pythonに対応しているので、チームのスキルセットに合わせて言語を選べるのも嬉しい。
ビルトインの可観測性(トレース、ログ)と状態管理機能を備えているので、運用面でも楽ができます。
特徴・メリット
単一プリミティブ「Step」で何でも作れる
これがMotiaの核心です。API、イベントハンドラ、定期実行ジョブ、すべてが「Step」という同じ構造で定義されます。
学習コストが低いのは大きなメリットですね。1つの書き方を覚えれば、あとは応用するだけ。
マルチ言語対応
TypeScript、JavaScript、Pythonに対応しています。同じプロジェクト内で混在させることも可能なので、「この処理はPythonの方が得意」みたいな場面でも柔軟に対応できます。
これ、意外とできるフレームワークが少ないんですよね。
ビジュアルデバッガ「Workbench」
開発サーバーを起動すると、ブラウザでワークベンチが開きます。Stepの依存関係がフロー図で可視化されていて、トレースやログも確認できる。
デバッグ時に「どのStepで止まってる?」というのが一目瞭然なので、QOL上がります。
セルフホスト可能
Dockerイメージが提供されているので、AWSでもGCPでもオンプレでも、好きな場所にデプロイできます。Motia Cloudというマネージドサービスもあるので、インフラを気にしたくない場合はそちらを選ぶことも可能。
イベント駆動アーキテクチャが簡単
Step間の通信はemit関数でイベントを発行するだけ。疎結合な設計が自然と実現できます。マイクロサービス的な思想で設計したいときには便利。
インストール方法
インストールは非常に簡単です。npxコマンド一発でプロジェクトを作成できます。
npx motia@latest create
対話形式でテンプレートとプロジェクト名、使用言語を選択すれば、すぐに開発を始められます。
開発サーバーの起動
npx motia dev
これだけでローカルサーバーがhttp://localhost:3000で起動します。時短になるのは間違いない。
Dockerでデプロイ
docker pull motiadev/motia
docker run -p 3000:3000 motiadev/motia
本番環境へのデプロイもシンプルです。
基本的な使い方
Stepの構造
MotiaのStepは、configとhandlerの2つで構成されます。
// send-message.step.ts
export const config = {
name: 'SendMessage',
type: 'api',
path: '/messages',
method: 'POST'
};
export const handler = async (req, { emit, logger }) => {
logger.info('メッセージを受信しました', req.body);
// イベントを発行して他のStepに処理を委譲
await emit({
topic: 'message.sent',
data: req.body
});
return { status: 200, body: { ok: true } };
};
ファイル名を.step.tsにするだけで、Motiaが自動的に認識してくれます。設定ファイルをいじる必要がないのは楽ですね。
イベントを購読するStep
// process-message.step.ts
export const config = {
name: 'ProcessMessage',
type: 'event',
subscribes: ['message.sent']
};
export const handler = async (input, { logger, state }) => {
logger.info('メッセージを処理中:', input);
// 状態を保存
await state.set('lastMessage', input);
// ここで実際の処理を行う
// メール送信、DB保存、外部API呼び出しなど
};
subscribesでトピックを指定するだけで、そのイベントを受け取れます。
定期実行(Cron)
// daily-report.step.ts
export const config = {
name: 'DailyReport',
type: 'cron',
cron: '0 9 * * *' // 毎日9時に実行
};
export const handler = async (_, { logger, emit }) => {
logger.info('日次レポートを生成中...');
await emit({
topic: 'report.generated',
data: { date: new Date().toISOString() }
});
};
Cronジョブも同じStep構造で書けます。一貫性があって良い。
Pythonでも書ける
# analyze_data_step.py
config = {
"name": "AnalyzeData",
"type": "event",
"subscribes": ["data.received"]
}
async def handler(input, ctx):
ctx.logger.info("データ分析中...")
# Pythonの強力なデータ処理ライブラリを活用
result = process_with_pandas(input)
await ctx.emit({
"topic": "analysis.completed",
"data": result
})
データ分析やML関連の処理はPythonで書きたいことが多いので、この柔軟性は助かります。
実践的なユースケース
Webhook受信 → 非同期処理
これは定番のパターンですね。外部サービスからのWebhookを受けて、重い処理は非同期で行う。
// webhook.step.ts
export const config = {
name: 'WebhookReceiver',
type: 'api',
path: '/webhook',
method: 'POST'
};
export const handler = async (req, { emit }) => {
// すぐにレスポンスを返す
await emit({ topic: 'webhook.received', data: req.body });
return { status: 200, body: { received: true } };
};
// process-webhook.step.ts
export const config = {
name: 'ProcessWebhook',
type: 'event',
subscribes: ['webhook.received']
};
export const handler = async (data, { logger }) => {
// 時間のかかる処理をここで実行
logger.info('Webhookデータを処理中...', data);
};
AIエージェントの構築
MotiaはAIエージェントの構築にも対応しています。LLMの呼び出しをStep化して、複数のエージェントを連携させることも可能。
// ai-agent.step.ts
export const config = {
name: 'AIAgent',
type: 'event',
subscribes: ['query.received']
};
export const handler = async (input, { emit, logger }) => {
const response = await callLLM(input.query);
await emit({
topic: 'response.generated',
data: { response }
});
};
マイクロサービス間の連携
複数のサービスをMotiaで構築すれば、イベント駆動で疎結合な連携が実現できます。サービスごとにStepを分離しておけば、スケーリングも柔軟に行えます。
注意点
良いことばかり書いてきましたが、正直なところ注意点もあります。
まだベータ版
現時点でバージョンは0.15.x。本番投入する場合は、破壊的変更に注意が必要です。とはいえ、開発は非常に活発なので、安定版リリースも近いのではないかと思います。
日本語情報は少なめ
英語のドキュメントは充実していますが、日本語の情報はほとんどありません。英語に抵抗がない人なら問題ないですが。
既存のエコシステムとの比較
Express + BullMQ + Temporalのような組み合わせと比べると、実績という点ではまだ劣ります。新規プロジェクトで試すのが無難でしょう。
まとめ
Motiaは「バックエンド開発を統一する」という野心的なゴールを持ったフレームワークです。
- 単一の「Step」プリミティブでAPI、ジョブ、ワークフロー、AIエージェントを構築
- TypeScript、JavaScript、Python対応
- ビジュアルデバッガで可観測性を確保
- イベント駆動アーキテクチャが自然に実現
- セルフホスト、マネージドクラウド両対応
30代になって思うのは、新しいツールの学習コストって馬鹿にならないということ。Motiaは「Step」という1つの概念を覚えるだけで、いろんなバックエンド処理が書けるようになります。
個人的には、新規プロジェクトで試してみる価値は十分にあると思います。まずはnpx motia@latest createで触ってみてください。
公式サイト: https://motia.dev GitHub: https://github.com/MotiaDev/motia