Amazon Web Services ブログ

AI を活用したスキャフォールディングで、フルスタックの AWS アプリケーションを数分で構築する

本記事は「Build full-stack AWS applications in minutes with AI-powered scaffolding」を翻訳したものです。

AI アシスタントを使えば、AWS 上で動くアプリケーションや Web サイトを数分で立ち上げられます。しかし、実際のお客様に提供できる本番相当のものにたどり着くのは、依然として難しい部分です。セキュリティ、可観測性、型安全性、そしてレジリエンスは、本番運用では譲れない要件です。AI アシスタントがこれらすべてを一度で正しく実装できることはまれで、その出力を本番品質まで固めるには、レビュー・修正・テストのサイクルを何度も繰り返す必要があります。

このギャップを埋めるため、私たちは Nx Plugin for AWS のバージョン 1.0 をリリースします。

本記事では、それが何であるか、なぜこのように作ったのか、そして、お客様である Bingo Industries がこれを使ってマルチエージェントのソリューションをアイデアから本番まで 3 週間未満で進めた事例を簡単にご紹介します。

Nx Plugin for AWS とは何か

Nx は、単一のリポジトリの中でアプリケーションを構成する多数のプロジェクトを管理する、拡張可能なオープンソースのビルドシステムです。Nx はプラグインによって拡張でき、Nx Plugin for AWS はそのひとつで、AWS 上にアプリケーションをスキャフォールディングするためのオープンソースのツールキットです。これは Nx ジェネレーターのライブラリで、各ジェネレーターはリクエストに応じてアプリケーションの一部(API、Web サイト、AI エージェント)を、それらを動かすためのクラウドインフラストラクチャとともに構築します。

各ジェネレーターは、動作しデプロイ可能なアプリケーションの一部を書き出します。それぞれの部品には、セキュリティ・可観測性・型安全性のベストプラクティスがあらかじめ組み込まれています。また各ジェネレーターは決定的(deterministic)です。つまり、毎回同じ結果を生成します。これにより、AI アシスタントが自ら考え出さなければならないものではなく、信頼できる土台としてジェネレーターの上に構築を進められます。AI アシスタントはこれらのジェネレーターを自分で実行できるため、価値のある部分、すなわちアプリケーションをあなたのものにするロジックに労力を割けるようになります。

上の図は Nx Plugin for AWS を視覚的に示したものです。ワークスペースを作成し、エージェントまたは CLI を使ってアプリケーションの各部品をスキャフォールディングします。

クイックスタート: フルスタックのエージェンティックアプリケーションを数分で

まずはワークスペース、つまり空の Nx モノレポから始めます。ワークスペースを作成するには、ターミナルで次のコマンドを実行します。

pnpm create @aws/nx-workspace my-project --no-interactive

この例では pnpm を使っていますが、お好みで npmyarnbun も使えます。デフォルトではインフラストラクチャは AWS Cloud Development Kit (CDK) で定義されますが、Terraform をお好みの場合は上記のコマンドに --iac terraform を付けて実行できます。エージェントを構築するので、Amazon Bedrock を呼び出せる AWS 認証情報が必要です。

ワークスペースを Kiro CLI などの AI コーディングエージェントで開き、アプリケーションの構築を依頼します。たとえば次のようにします。

Nx Plugin for AWS を使って、shadcn と Cognito 認証を備えた React の Web サイトを、AG-UI プロトコル経由で TypeScript の Strands エージェントに接続し、それをデプロイするためのインフラストラクチャからなるフルスタックアプリケーションを構築してください。

AI エージェントは、上記のコマンドで作成したすべてのワークスペースにあらかじめ設定されている Nx Plugin for AWS MCP サーバーを使用します。このプロンプトによって、Strands エージェント、Amazon Cognito ログインを備えた React フロントエンド、AG-UI プロトコル経由でユーザーとエージェントがやり取りする CopilotKit のチャットインターフェイス、そしてプロジェクトをデプロイするために必要な AWS リソースを定義したインフラストラクチャプロジェクトが手に入ります。

Web サイトとエージェントを自分のマシン上でローカルに起動するには、次を実行します。

pnpm dev

Web サイトとエージェントは、コードを編集するとどちらもホットリロードされます。ローカルでの変更に満足したら、エージェントに AWS へのデプロイを依頼できます。

ここでは Nx Plugin for AWS をエージェントで駆動しましたが、お好みで CLI を使ってアプリケーションを手作業で組み立てることもできます。ステップバイステップの例は後述しますが、クイックスタートガイドもご覧ください。Nx と Nx Plugin for AWS の恩恵を受けるためにゼロから始める必要はなく、ドキュメントでは既存プロジェクトへのプラグイン追加についても解説しています。

なぜこれを作ったのか

私たちは AWS の PACE(Prototyping and AI Customer Engineering)チームの一員で、スピードと本番運用への備えという緊張関係に日々向き合っています。私たちは、まだ明確な答えのない問題や、これまで作られたことのない技術的にリスクのあるアイデアについて、お客様と一緒に取り組みます。各エンゲージメントの期間は 4〜6 週間で、目標はただひとつ、特定のアイデアが実現可能かどうかを証明することです。

プロトタイプの価値は、問題の最も難しい部分、つまり従うべき確立されたパターンが存在しない部分から生まれます。これほど短いタイムラインでは、私たちのエンジニアは本番運用に向けたハードニングではなく、お客様の中核的な課題に時間を使う必要があります。とはいえ、プロトタイプは使い捨てるのではなく本番まで持っていけるほうが、お客様にとってより役に立ちます。

AWS 上での構築は通常、Infrastructure as Code、バックエンドサービス、フロントエンド、そして多くの場合、同一プロジェクト内に複数の言語が混在することを意味します。私たちには、選んだ言語に依存せず、多数の可動部からなるプロジェクトを管理できるビルドシステムが必要でした。私たちのチームは Nx にたどり着き、まさにこの目的のために数年間使ってきました。Nx はプロジェクトごとに一貫したモノレポのワークフローを、技術選定にかかわらず提供してくれます。ただ、Nx にモノレポを任せてもなお、私たちは各エンゲージメントの冒頭でプロジェクトの土台を手作業で組み立てていました。私たちは、自分たちのベストプラクティスをあらかじめ組み込んだ形で土台をスキャフォールディングし、本番に近いところからスタートして、限られた期間をお客様の課題に効率よく使いたいと考えました。

ジェネレーターがテンプレートやライブラリに勝った理由

現在の形にたどり着くまでに、私たちはいくつかのアプローチを試しました。

  • 最初は、各エンゲージメントの冒頭でフォークするスターターテンプレートから始めました。フォークは変更した瞬間にドリフト(乖離)します。テンプレート側で加えた修正はフォークには決して届かず、必要かどうかにかかわらずテンプレート全体を引き継ぐことになります。
  • 次に、ライブラリベースのアプローチを試し、プロジェクト構造・アプリケーションコード・インフラストラクチャコードを、再利用可能で型付きのビルディングブロックとして定義しました。これはテンプレートの問題の多くを解決しました。必要な部品だけを使えて、ライブラリへの改善はそれを使うすべてのプロジェクトに取り込めます。しかし、いくつか制約もありました。エンジニアがライブラリの公開していない設定を必要とした瞬間に、手が止まってしまうのです。ライブラリがサポートする範囲を超えたカスタマイズには、分かりにくい回避策、ライブラリ周りのコピー&ペースト、あるいはライブラリのオーナーが拡張してくれるのを待つことが必要でした。PACE エンゲージメントの 4〜6 週間というタイムラインでは、どの選択肢も現実的ではありませんでした。

最終的にしっくり来たのが Nx ジェネレーターでした。フォークするテンプレートや依存するライブラリではなく、ジェネレーターはコードを直接あなたのワークスペースに書き込みます。生成された瞬間からそのコードはあなたのものであり、扱うのにプラグイン固有の知識は一切必要ありません。ジェネレーターが想定していなかった何かを変更したくなったら、いつも通りにコードを編集できます。そして、テンプレートでは生成コードが取り残されていたのに対し、Nx マイグレーションによって、私たちが提供する改善が、以前にスキャフォールディングしたワークスペースにも届きます。ジェネレーターはいつでも実行できるので、既存の Web サイトに認証を追加したり、数か月前に作った API にフロントエンドを接続したりできます。各ジェネレーターは意図的に自己完結していて明確に説明されているため、個々のファイルではなく、より高いレベルのビルディングブロックで考えられるようになります。手作業でも AI アシスタントを使う場合でも、単一のコマンドで組み立てられる、コンポーネント丸ごとの単位で考えられるのです。

Nx Plugin for AWS の仕組み

まずワークスペースを作成し、次にジェネレーターを使ってアプリケーションを組み立て、必要なものを必要なときにだけ追加していきます。ジェネレーターは単なるファイルテンプレート以上のものです。新しいファイルを書き出すだけでなく、既存のファイルを変更し、依存関係を配線し、設定を更新します。

API・Web サイト・データベース・AI エージェント向けのコアジェネレーター

ジェネレーターは、ほとんどの AWS アプリケーションが構成される主要なコンポーネントを、TypeScript と Python の両方でカバーします。たとえば次のとおりです。

  • tRPCFastAPISmithy を使った API と、それらをデプロイするためのインフラストラクチャ
  • オプションで Amazon Cognito 認証を備えた React の Web サイト
  • Amazon DynamoDB と Amazon Aurora 上のデータベース
  • エージェンティック AI: Strands Agents SDK を使ったエージェントと Model Context Protocol(MCP)サーバーの構築。いずれも Amazon Bedrock AgentCore 上にデプロイされます。

デフォルトでは、各ジェネレーターは本来なら自分で追加しなければならないベストプラクティスを備えて出荷されます。

  • API ハンドラーには、構造化ロギング・AWS X-Ray トレーシング・Amazon CloudWatch メトリクスのために AWS Lambda Powertools が配線済みで組み込まれます。
  • 生成される DynamoDB テーブルは、自動キーローテーション付きのカスタマーマネージド KMS 暗号化、ポイントインタイムリカバリ、削除保護を使用します。
  • 生成される Aurora データベースは IAM 認証を備えた Amazon RDS Proxy の背後に配置され、データベースのスキーマとマイグレーションは、TypeScript 向けには Prisma、Python 向けには SQLModelAlembic であらかじめ設定されます。
  • エージェントと MCP サーバーは AgentCore Observability が設定された状態で提供され、AgentCore Gateway にはエージェントのセキュリティ制御のためのポリシーを書き始めるのに必要なものがすべて揃っています。

スタック全体にわたる型安全な接続

これらのコンポーネントを結びつけるのが connection ジェネレーターです。React の Web サイトと tRPC の API があるとします。connection ジェネレーターを実行すると、両者が型安全なクライアントで配線され、API の形状に対する変更が、本番での呼び出し失敗としてではなく、デプロイ前にフロントエンドの型エラーとして現れるようになります。React フロントエンドをエージェントに接続する場合も同様です。AG-UI プロトコル(リッチでインタラクティブなエージェントの応答をフロントエンドへストリーミングするためのオープンスタンダード)で生成されたエージェントに対しては、応答のストリーミング、ツール呼び出しのレンダリング、状態管理を備えた CopilotKit のチャットインターフェイスを生成します。すべてのジェネレーターがローカル開発をサポートしており、Nx continuous tasks を使えば、単一のコマンドで相互接続された各部品(Web サイト、その API、エージェント)が、あなたのマシン上でホットリロードしながら一斉に立ち上がるため、何もデプロイせずに変更をテストできます。

実際には、コンポーネントの選択とそれらの接続は AI に任せて駆動しますが、このアプローチにより、お好みならアプリケーション全体を視覚的にスキャフォールディングすることもできます。

このスクリーンショットは Nx Plugin for AWS の Graph Builder のものです。作りたいアプリケーションを図として描き、それをスキャフォールディングするためのコマンドをコピーできます。

あなたのコード、あなたのインフラストラクチャ選択

生成されるコードは主流のフレームワーク上に構築され、あなたのものになります。プラグインへのランタイム依存はなく、生成された内容を編集するのを妨げるものは何もありません。ジェネレーターは出発点であってコミットメントではありません。作りたいものに最も近いものを選び、そこから自分の方向へ進めてください。インフラストラクチャの定義方法も選べます。ジェネレーターは AWS Cloud Development Kit (AWS CDK) のコンストラクトか Terraform のモジュールのいずれかを生成するからです。

Nx マイグレーションで最新に保つ

コードを所有することは通常、ライブラリが与えてくれていた唯一のもの、すなわち後から改善をきれいに取り込む手段を犠牲にすることを意味します。v1.0 では、Nx Plugin for AWS は Nx マイグレーションによってそのギャップを狭めます。私たちが新しいバージョンを出荷したら、公開されたマイグレーションを適用してワークスペースを更新できます。マイグレーションは、アプリケーションコードだけでなく、ジェネレーターが書いたすべてに届きます。たとえば、非推奨になった Vite の設定オプションを現行の API に置き換えたり、静的 Web サイトのアクセスログを Amazon Simple Storage Service (Amazon S3) バケットから CloudWatch へ移して、監視やアラームを設定できるようにしたりします。エージェントにプラグインのアップグレードを依頼することもできますし、CLI を使ってマイグレーションを駆動することもできます。

# Install the latest version and prepare migrations
pnpm nx migrate @aws/nx-plugin@latest

# Apply the migrations to your codebase
pnpm nx migrate --run-migrations

変更に判断が必要で自動的に適用できない場合は、オプションのエージェンティックマイグレーションが、あなたを放置せずにコーディングエージェントを通じてその変更をガイドします。最新に保つことが、リリースノートやプルリクエストを手作業でレビューする作業ではなく、日常的なコマンドになります。

ステップバイステップの例: CLI を使ったスキャフォールディング

ワークスペースを作成した後、最も手早く始めるには AI にジェネレーターを駆動させるのが良いですが、お好みで各ジェネレーターを CLI から手作業で呼び出すこともできます。このセクションでは、CLI コマンドといくつかの小さなコード編集で、複数言語のアプリケーションを構築する方法を順を追って説明します。AWS 認証情報に加えて、Python エージェント用に UV をインストールしておく必要があります。

# Create a new workspace with pnpm (yarn, bun and npm are also supported)
pnpm create @aws/nx-workspace my-project --no-interactive
cd my-project

# Create a Python project and add an agent
pnpm nx g @aws/nx-plugin:py#project backend --no-interactive
pnpm nx g @aws/nx-plugin:py#agent --project backend --auth=cognito --protocol=ag-ui --no-interactive

# Add a website with Cognito login
pnpm nx g @aws/nx-plugin:ts#website website --no-interactive
pnpm nx g @aws/nx-plugin:ts#website#auth --project website --no-interactive

# Connect the website to the agent
pnpm nx g @aws/nx-plugin:connection --source-project=website --target-project=backend --no-interactive

# Create a CDK project to deploy to AWS
pnpm nx g @aws/nx-plugin:ts#infra infra --no-interactive

Terraform を使いたい場合は、ワークスペースの作成時に --iac=terraform を渡し、ts#infra の代わりに terraform#project を使います。同じパターンがすべてのジェネレーターに当てはまります。エージェントを tRPC や FastAPI のバックエンドに差し替えれば、connection ジェネレーターは代わりにそのバックエンドへ Web サイトを配線します。

connection ジェネレーターはすでに CopilotKit がエージェントと安全に通信するよう配線済みなので、あとは React コンポーネントをインスタンス化するだけです。たとえばホームページで次のようにします。

// packages/website/src/routes/index.tsx
import { createFileRoute } from '@tanstack/react-router';
import { BackendAgentChat } from '../components/backend-agent-chat';

export const Route = createFileRoute('/')({
  component: RouteComponent,
});

function RouteComponent() {
  return <BackendAgentChat />;
}
 pnpm dev を実行すると、ローカルの Web サイトとエージェントを起動できます。AWS 認証情報が設定されていれば、エージェントは Amazon Bedrock 上の Strands のデフォルトモデルを使用します。ローカル開発サーバーを開いて、エージェントとのチャットを始められます。

準備ができたら、生成された CDK コンストラクトを自分のスタックに組み込みます。

// packages/infra/src/stacks/application-stack.ts
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { BackendAgent, UserIdentity, Website } from '@my-project/common-constructs';

export class ApplicationStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // Create the Cognito resources
    const identity = new UserIdentity(this, 'Identity');

    // Create the agent
    new BackendAgent(this, 'Agent', {
      identity,
    });

    // Create the website
    new Website(this, 'Website');
  }
}

開発用スタックを AWS にデプロイするには、pnpm nx deploy-sandbox infra を実行し、デプロイされたユーザープールに Amazon Cognito ユーザーを作成し、CloudFront ディストリビューションの URL を開いてサインインし、デプロイしたアプリケーションを使用します。

終わったら AWS リソースをクリーンアップするために pnpm nx destroy-sandbox infra を実行し、Amazon Cognito と Amazon S3 のリソースを AWS マネジメントコンソールから削除します(これらはデータ損失を防ぐためにデフォルトでは保持されます)。

フロー全体の詳しいウォークスルー(テキストベースのエージェンティックなゲームの例の構築を含む)は、Dungeon Adventure チュートリアルをご覧ください。

お客様事例: Bingo Industries のマルチエージェントソリューション

オーストラリアのリサイクル・廃棄物管理企業である Bingo Industries は、Nx Plugin for AWS を使ってマルチエージェントアプリケーションを構築し、本番環境に投入しました。彼らが構築したアーキテクチャは次のとおりです。

以下は、彼ら自身の言葉による、何を構築したかの説明です。

Bingo のオペレーション・物流部門は、ビジネスがスムーズに機能することを支える中心的な役割を担っています。この部門には、24 時間常時高い可用性を維持しつつ、効率的にスケールできる必要のある幅広いアプリケーションが含まれます。これらのアプリケーションは、アロケーター、カスタマーサービス担当者、コンタクトセンタースタッフ、オペレーター、アナリストなど、多様なユーザーグループによって利用されており、全員が日々の業務でこれらのツールに頼っています。関わる業務が複雑なため、ユーザーは複数の画面を行き来し、さまざまなフィルター・クエリ・検索を使いこなすことが多く、そのプロセスは時間がかかり煩雑になりがちです。こうした課題を軽減し効率を高めるため、私たちは複数のデータソースやログの情報を活用してユーザーからの問い合わせに応答する、マルチエージェント AI ソリューションを実装することにしました。

マルチエージェント AI ソリューションをゼロから開発するアプローチは数多くありましたが、私たちは時間とリソースの制約に直面していました。この制約を乗り越えるため、私たちは Nx Plugin for AWS を選びました。これはまだ使ったことのない方々に強くおすすめできるツールです。このツールは AWS ベースのアプリケーションのための、加速されたスキャフォールディングの発射台として機能し、AI エージェントを素早く立ち上げるために必要なアプリケーションコードとクラウドインフラストラクチャを、それらを取り囲む API やフロントエンドとともに生成します。

この土台の上に、私たちはユーザーからの問い合わせに回答し、説明を提供できるマルチエージェントのチャットボットを開発しました。ひとつの巨大なエージェントがすべてをこなそうとするのではなく、このソリューションは各質問を適切なスペシャリストエージェントにルーティングします。これにより各エージェントの焦点が絞られ、その回答の信頼性が保たれます。一方で、基盤となる AWS の生成 AI サービスが、全体を結びつける言語理解を提供します。

このアプローチの大きな利点は、AG-UI(リッチでインタラクティブなエージェントの応答をフロントエンドへ直接ストリーミングする)や A2A(エージェント同士が直接呼び出し合えるようにする)といったプロトコルを含む、成熟しつつある新しいスタンダードを、それらが成熟するにつれて素早く採用できたことです。私たちのチームは、セットアップ・認証・配線をゼロから考え出す必要がなく、その土台があらかじめ整った形で手に入り、代わりにビジネスロジックに集中できました。また、すべてを一から考える必要がなく、AWS 推奨のプラクティスと AWS Well-Architected Framework に沿った強力な出発点も得られました。最初の本番ローンチに到達するまで、3 週間弱でした。

たとえば、トランザクションが失敗したとき、チャットボットはよくある障害シナリオの中から考えられる原因の診断を手助けでき、オペレーターは複数のシステムをまたいで手作業で状況を組み立てるよりも速く解決へたどり着けます。さらにユーザーは、プロンプトベースのレポートをリアルタイムに生成でき、分析や情報に基づいた意思決定を促進します。このプロジェクトを通じて協力的に支援してくれた AWS チームに感謝します。

— Alex To(Principal Engineer)、Balaji Ravichandran(Head of Engineering)、Bingo Industries

Alex は Nx Plugin for AWS に多大な貢献を還元してくれており、私たちは彼の尽力に大いに感謝しています。生成されたコードは彼らが自由に変更できるものであったため、Bingo Industries はそれらの変更を手元に留めておくこともできましたが、代わりにそれらをアップストリームに貢献してくれ、彼らの改善は v1.0 を形作ったものの一部になっています。

自分たちのジェネレーターで拡張する

アップストリームへの貢献はひとつの道にすぎず、多くのチームが必要とする道でもありません。私たちはジェネレーターを SDK として公開しているので、自分たちのニーズに合わせて拡張・適応できます。あなたの組織独自のベストプラクティスのパターンや好みのフレームワークを、私たちが自分たちのものをエンコードしたのとまったく同じようにエンコードできます。これにより、あなたのエンジニアと彼らの AI アシスタントが、チームをまたいで、同じ決定的でレビュー済みの土台から構築できるようになります。Nx Plugin ジェネレーターを使って自分のプラグインをスキャフォールディングし、自分のジェネレーターを作り、それを MCP サーバー経由で公開してください。

コミュニティに参加する

Nx Plugin for AWS は Apache 2.0 ライセンスのもと GitHub で公開されており、私たちは貢献を歓迎します。質問・バグ・アイデアがあれば issue や discussion を開いてください。

私たちがこれを作ったのは、自分たちに必要だったからであり、オープンに作ったのは、これが解決する問題が私たちのチームだけのものではないからです。あなたが AWS 上で構築していて、同じ土台を何度も書いている自分に気づくなら、ジェネレーターをより良くするお手伝いをぜひお願いしたいです。

オープンソースの上に築かれている

Nx Plugin for AWS は、多くのオープンソースコミュニティの成果の上に成り立っています。

  • Nx: Nx Plugin for AWS が構築されている、拡張可能なモノレポのビルドシステム
  • tRPC: TypeScript でのエンドツーエンドの型安全な API
  • FastAPIPydantic: API とエージェントのジェネレーターの背後にある Python の Web フレームワークとデータバリデーションライブラリ
  • Smithy: API をモデリングするためのプロトコル非依存のインターフェイス定義言語
  • React: Web サイトジェネレーターの背後にある UI ライブラリ
  • ViteRolldown: TypeScript の Web サイトとバックエンドのビルド・バンドル用
  • ShadcnCloudScape: Web サイトジェネレーターが設定できる UX フレームワーク
  • TanStack: Web サイトのルーティングと API 向けの型安全なフック
  • CopilotKitAG-UI プロトコル: エージェントフロントエンド向けのチャットインターフェイスとストリーミングプロトコル
  • A2Aa2a-sdk: 生成されたエージェントが互いを発見し委譲できるようにする、エージェント間プロトコルと SDK
  • Strands Agents SDKLangChain: エージェントジェネレーターが使用するエージェントフレームワーク
  • Model Context Protocol: AI アシスタントがジェネレーターを駆動できるようにするスタンダード
  • AWS CDKTerraform: ジェネレーターが対象とする 2 つの Infrastructure as Code の選択肢
  • AWS Lambda Powertools: 生成される API ハンドラーの可観測性のデフォルト
  • PrismaElectroDBSQLModelAlembicPynamoDB: データベースジェネレーターの ORM とエンティティモデリングのレイヤー
  • GritQL: ジェネレーターとマイグレーションによる堅牢なコード編集を支える
  • Biome: ワークスペース全体での TypeScript のリンティングとフォーマット用
  • uvtyRuff: Python のパッケージ管理・型チェック・リンティング・フォーマット用

これらをメンテナンスしてくださっているすべての方々に感謝します。