対話式インストールから手動構築までの実践記録
はじめに
先日、MastraのMeetUpミーティングに参加する機会があり、それをきっかけにMastraを試してみました。
AI関連のツールといえばPythonベースが多い中、MastraはTypeScriptで動作するのが特徴です。公式サイトでは対話式インストールが提供されており、非常に手軽に始められます。
以下のコマンドを実行することで、プロジェクト名やAPIキーなどの質問に答えるだけでセットアップが完了します。
npx create-mastra@latest
たとえば「test-app」というプロジェクト名でセットアップしたとすると、以下の手順でローカル環境のプレイグラウンドにアクセスできます。
cd test-app
npm run dev
ブラウザで http://localhost:4111/
にアクセスすると、サンプルエージェントとの対話が可能です。すぐに動作確認ができるのは、開発者のモチベーションを大きく高めてくれます。
本番環境へのデプロイ方法
公式ドキュメントでは、MastraをHonoサーバーとしてEC2などに直接デプロイするか、Cloudflareなどのサーバーレス環境で動かす方法が紹介されています。
しかし、私の開発環境では AWS Lambda を利用しており、既存のSPA(AppSyncベース)と統合したいと考えています。
Lambdaでのデプロイ構想
LambdaでMastraを動かす方法として、以下の2つが考えられます。
- Honoアプリをコンテナ化してLambda Web Adapter経由で実行
- Honoに依存せず、Mastraを直接Lambda関数に組み込む
私は後者を選び、MastraのコアをLambda関数内で直接利用する構成を試してみました。
TypeScriptによるLambda関数の構築
まずは基本となるTypeScriptベースのLambda環境を整えます。
1. プロジェクトの準備
mkdir myProject
cd myProject
2. 必要なパッケージのインストール
git init
npm install --save-dev typescript @types/aws-lambda @types/node ts-node esbuild
3. TypeScript設定ファイル(tsconfig.json)
{
"compilerOptions": {
"target": "es2020",
"strict": true,
"preserveConstEnums": true,
"noEmit": true,
"sourceMap": false,
"module": "ESNext",
"moduleResolution": "node",
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"isolatedModules": true
},
"include": ["index.ts"],
"exclude": ["node_modules", "dist"]
}
4. package.jsonのスクリプト定義
{
"name": "myProject",
"version": "0.1.0",
"private": true,
"devDependencies": {
"@types/aws-lambda": "^8.10.146",
"@types/node": "^22.10.2",
"esbuild": "^0.24.2",
"ts-node": "^10.9.2",
"typescript": "^5.7.2"
},
"scripts": {
"prebuild": "rm -rf dist",
"build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js",
"postbuild": "cd dist && zip -r package.zip index.js*"
}
}
5. テスト用Lambda関数(index.ts)
import { Handler } from 'aws-lambda';
export const handler: Handler = async (): Promise<Record<string, any>> => {
return {
message: 'Hello, world!',
};
};
以下のコマンドでZipファイルが生成されます。
npm run build
このZipをAWS CLIやGitHub Actionsで自動的にアップロードすることも可能です。
Mastraの手動インストール
Mastraは内部的にVercel AI SDKを使ってモデルを呼び出しています。したがって、以下の依存パッケージをインストールします。
npm install @ai-sdk/openai
つづいてMastraのパッケージをインストールします。
npm install @mastra/core@latest
これだけで、Mastraエージェントを呼び出す最小構成が整います。
MastraエージェントをLambdaで動かす
index.ts
を以下のように編集し、Mastraエージェントを組み込みます。
import { Handler } from 'aws-lambda';
import { openai } from '@ai-sdk/openai';
import { Agent } from '@mastra/core/agent';
export const handler: Handler = async (): Promise<Record<string, any>> => {
const myAgent = new Agent({
name: 'Demo Agent',
instructions: `You are demo agent. You can only say "Hello"`,
model: openai('gpt-4o-mini'),
});
const response = await myAgent.generate('test');
return {
message: response.text,
};
};
APIキーの設定
OpenAIのAPIキーは、Lambdaの環境変数に OPENAI_API_KEY
として設定することでMastraが自動で読み込みます。セキュリティ面を考慮すると、AWS Secrets Manager などでの管理が望ましいです。
このサンプルでは、どんなプロンプトを送っても "Hello"
と返すシンプルな動作確認を行っています。
まとめと所感
Mastraを初めて触ったとき、Honoをベースとした構成が前提かと思い込んでいました。しかし、手動インストールによって、既存のTypeScriptコードに簡単に組み込めることがわかりました。
この構成により、Honoに依存せず、純粋なLambda関数としてMastraを利用することが可能です。今回の例では最低限の機能しか試していませんが、Mastraには以下のような高度な機能も備わっています。
- メモリ機能
- ワークフローエンジン
- MCPサーバー連携
今後はそれらの機能も試し、さらに高度なAIエージェントの構築にも挑戦してみたいと思います。
ご意見やご指摘があれば、お気軽にX(旧Twitter)のDMまでお寄せください。