お知らせ・ブログ

オノコムからの最新情報や、生成AI、AWSクラウド、ノーコードアプリケーションに関する有益な情報をお届けします。

MastraをAWS Lambdaで動かしてみた

2025年05月27日
斧山 洋一
ブログ

対話式インストールから手動構築までの実践記録

はじめに

先日、MastraのMeetUpミーティングに参加する機会があり、それをきっかけにMastraを試してみました。

👉 Mastra公式サイト

AI関連のツールといえばPythonベースが多い中、MastraはTypeScriptで動作するのが特徴です。公式サイトでは対話式インストールが提供されており、非常に手軽に始められます。

以下のコマンドを実行することで、プロジェクト名やAPIキーなどの質問に答えるだけでセットアップが完了します。

npx create-mastra@latest

たとえば「test-app」というプロジェクト名でセットアップしたとすると、以下の手順でローカル環境のプレイグラウンドにアクセスできます。

cd test-app
npm run dev

ブラウザで http://localhost:4111/ にアクセスすると、サンプルエージェントとの対話が可能です。すぐに動作確認ができるのは、開発者のモチベーションを大きく高めてくれます。

Mastraのプレイグランド

本番環境へのデプロイ方法

公式ドキュメントでは、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" と返すシンプルな動作確認を行っています。

Lambdaの実行結果

まとめと所感

Mastraを初めて触ったとき、Honoをベースとした構成が前提かと思い込んでいました。しかし、手動インストールによって、既存のTypeScriptコードに簡単に組み込めることがわかりました。

この構成により、Honoに依存せず、純粋なLambda関数としてMastraを利用することが可能です。今回の例では最低限の機能しか試していませんが、Mastraには以下のような高度な機能も備わっています。

  • メモリ機能
  • ワークフローエンジン
  • MCPサーバー連携

今後はそれらの機能も試し、さらに高度なAIエージェントの構築にも挑戦してみたいと思います。


ご意見やご指摘があれば、お気軽にX(旧Twitter)のDMまでお寄せください。

📩 @onoyamayoichi