
Amazon Bedrock AgentCore Managed Harness で作ったAIエージェントを、AWSアカウントを使用しないユーザーに配布できるチャットアプリテンプレートを作ってみた
はじめに
こんにちは、ドライブ練習中のコンサル部の神野(じんの)です。
一発で駐車できると気持ち良いですよね。
話は変わって皆さん、Amazon Bedrock AgentCore Harness 触っていますか?
コンソール上で モデル / システムプロンプト / ツール を設定するだけでエージェントが作れてとても手軽でいいですよね。ハンズオンなど含めていくつかブログも書き、魅力を紹介しました。
ただ、いざ作ったエージェントをチームのみんなに使ってもらおうとなったときに困るのが、使う側にも AWS マネジメントコンソールへのサインインが必要という点です。エージェントを試してもらうためだけに、利用者全員へ IAM ユーザーやコンソールアクセスを払い出すのは避けたいです・・・
そこで、Harness の前段に Cognito 認証付きの Web チャットを置いて、AWS アカウントを持たないメンバーでもブラウザだけで使えるテンプレートを作りました!Amplify Gen 2 ベースで、SSO など社内配布に必要な非機能を用意しています。
リポジトリはこちらです。
前提
- Node.js 24 以上
- AWS CLI(認証情報設定済み)
- AgentCore Harness が利用できるリージョン(例: us-east-1)
Harness 本体はコンソールで手動作成し、その ARN を環境変数でテンプレートに渡す構成です。
構成
構成はシンプルで、Amplify Gen 2 で SPA・Cognito・API Gateway・Lambda をまとめてデプロイします。

| リソース | 役割 |
|---|---|
| Cognito User Pool | ユーザー認証(SSO フェデレーション・サインアップ制御を含む) |
| API Gateway REST | POST /invoke。Cognito Authorizer で JWT 検証 |
| Lambda harness-proxy | Harness を IAM 認証で呼び出し、SSE をそのまま透過するプロキシ |
| WAF Web ACL(オプション) | Cognito への接続元 IP 制限 |
Harness の呼び出しを Lambda の IAM ロール経由での実行としているのを工夫しています。
利用者は Cognito にログインして JWT を取得し、それを持って API Gateway にリクエストを送ります。JWT の検証は API Gateway の Cognito Authorizer が行い、Harness の呼び出しは Lambda の IAM ロールで行う仕組みです。
代替案として、Cognito Identity Pool で一時クレデンシャルを払い出してフロントエンドから直接 InvokeHarness する構成や、Harness 側に JWT Authorizer を設定する構成も取れます。ただ、前者はブラウザに AWS クレデンシャルを渡すことになり、後者はコンソールから Harness を操作できなくなって検証体験が悪くなるので、今回はどちらも採用していません。
エージェント本体(モデル / システムプロンプト / ツール)はコンソールの Harness 設定画面で管理したままなので、エージェントの振る舞いを変えたいときにアプリの再デプロイは不要です。コンソールで設定を変えて試して、利用者に即反映されるのは嬉しいですね!
sandbox でデプロイしてみる
まずは Amplify の sandbox で動かしてみます。バックエンド(Cognito・API Gateway・Lambda)は実際に AWS リソースとしてデプロイされ、フロントエンドだけローカルの開発サーバーで動かす構成です。チームに配る本番環境は後述の Amplify Hosting で別に作ります。
コンソールで Harness を作成して ARN を控えたら、リポジトリをクローンして環境変数を付けてデプロイするだけです。
git clone https://github.com/yuu551/agentcore-harness-chat.git
cd agentcore-harness-chat
npm install
HARNESS_ARN=arn:aws:bedrock-agentcore:us-east-1:123456789012:harness/xxxxxxxx \
ADMIN_USER_EMAIL=you@example.com \
npx ampx sandbox --once
ADMIN_USER_EMAIL を設定しておくと、デプロイ時に最初のユーザーが作成されて仮パスワードがメールで届きます。セルフサインアップはデフォルト無効なので、これが初回ログインの手段になります。
デプロイが完了したら開発サーバーを起動します。
npm run dev
http://localhost:5173 を開いて、届いた仮パスワードでログイン(初回にパスワード変更)すればチャットが試せます。ストリーミング応答とツール使用の可視化、モデル切替に対応しています。

無事 Harness で作成したエージェントと会話できましたね!
本番デプロイ(Amplify Hosting)
動作確認できたので、チームに配るための本番環境を Amplify Hosting の Git 連携で作ります。こちらも流れはシンプルです。
- リポジトリを fork するか、自分の GitHub リポジトリへ push する
- Amplify コンソールで「新しいアプリを作成」→「GitHub」を選択し、リポジトリとブランチを接続する(Amplify Gen 2 プロジェクトとして自動検出されます)
- アプリ設定の環境変数に HARNESS_ARN と ADMIN_USER_EMAIL を設定して、初回デプロイを実行する
環境変数の設定は初回デプロイの開始前に済ませてください。HARNESS_ARN を設定しないままビルドすると synth エラーで失敗します。
ひとつだけ注意点があって、アプリの URL は初回デプロイ後に発行されるため、CORS の設定が 2 段階になります。
- 初回デプロイ完了後、発行された URL(例: https://main.xxxxxxxx.amplifyapp.com)を確認する
- 環境変数 APP_ORIGINS にその URL を設定して再デプロイする
この手順を飛ばすと、画面は開けるのにチャット送信だけ CORS エラーになるので、忘れずに設定してください。ちなみに、APP_ORIGINS は API の CORS 許可だけでなく、Cognito の callback / logout URL にも反映されるので、SSO を使う場合もこの設定が前提になります。
工夫した反面、弱みにも触れておくと、Amplify Hosting のデプロイは 1 回あたり 10〜13 分ほどかかります。フロントエンドの軽微な修正でもバックエンドを含めたフルビルドが走る仕組みのためで、下記の記事でも同じ点に悩んで SAM 構成へ移行した例が紹介されています。
上記の CORS 設定のように再デプロイ前提の手順もあるので、環境変数を変えては 10 分待ち・・・を何度も繰り返すとストレスが溜まります。SSO や WAF などのパラメータ調整はできるだけ sandbox 側で固めてから、本番デプロイに臨むのがおすすめです。(私も乗り換えようかな・・・)
あとは main ブランチへ push するだけで自動的に再デプロイされます。発行された URL をチームに共有すれば配布完了です!
ポイントをピックアップ
ストリーミングプロキシ Lambda
Harness の呼び出し部分は Lambda のレスポンスストリーミングで実装しています。コアの部分だけ抜粋します。
const command = new InvokeHarnessCommand({
harnessArn: HARNESS_ARN,
runtimeSessionId: sessionId,
messages,
actorId: claims.sub,
});
const response = await client.send(command);
for await (const event of response.stream) {
responseStream.write(`data: ${JSON.stringify(event)}\n\n`);
}
InvokeHarness の SSE ストリームをそのままフロントエンドに流しているだけで、プロキシ全体でも 100 行程度です。会話のセッション管理は Harness がやってくれるので、アプリ側でセッション管理をする必要はありません。ただし、このテンプレート自体は会話履歴の永続化までは行わない点は注意です。
社内配布向けのオプション機能
社内に配るとなると認証まわりの要件が色々出てきますが、環境変数で有効化できるようにしています。
| 機能 | 環境変数 |
|---|---|
| セルフサインアップ | SELF_SIGNUP=true |
| メールドメイン制限 | ALLOWED_EMAIL_DOMAINS=example.com |
| Google SSO | GOOGLE_AUTH=true |
| Entra ID SSO | ENTRA_AUTH=true ENTRA_TENANT_ID=xxx |
| SSO 専用モード | SSO_ONLY=true |
| WAF IP 制限 | ALLOWED_IPV4_CIDRS=203.0.113.0/24(IPv6 は ALLOWED_IPV6_CIDRS) |
SSO 専用モードにすればパスワードログインを無効化できるので、社内 Google Workspace や Entra ID と連携する運用もできます。
ひとつ補足すると、SSO のクライアント ID・クライアントシークレットは環境変数ではなくシークレットとして渡します。sandbox なら npx ampx sandbox secret set GOOGLE_CLIENT_ID のようにコマンドで、本番(Amplify Hosting)なら Amplify コンソールの「ホスティング」→「シークレット」に同名キーで設定します。sandbox で設定した値は本番に引き継がれないので、両方の環境でそれぞれ設定が必要な点に注意してください。
SSO や WAF は AWS 側だけで完結しない設定(Google Cloud や Entra ID 側の作業)もあるので、リポジトリの docs 配下にセットアップ手順書を用意しています。
- Harness のセットアップ(コンソールでの作成手順)
- Google SSO の設定(Google Cloud 側の OAuth クライアント作成から)
- Entra ID SSO の設定(アプリ登録・email クレームの設定まで)
- WAF による IP 制限(テンプレート WAF と Amplify Firewall の使い分けガイド付き)
README と合わせて読めば、コンソール操作を含めて設定できるはずです!
なお、自分の環境専用にデプロイする場合は、環境変数の代わりに amplify/parameters.ts の値を直接書き換えても OK です。
export const parameters = {
harnessArn: process.env.HARNESS_ARN ?? "",
// 環境変数の代わりに直接書き換えてもよい(例: selfSignUp: true)
selfSignUp: flag(process.env.SELF_SIGNUP),
...
};
パラメータは全部このファイルに説明コメント付きで集約しているので、何が変えられるかはここを見れば一目でわかります。直接書き換えれば環境変数の設定漏れを防げますし、設定がコードとして残るのも利点です。ただし、ARN やテナント ID などアカウント固有の情報を書いたまま、パブリックリポジトリへコミットしないよう注意してください。
IP 制限の使い分け
IP 制限は、どこのアクセスを制限・防御したいかで選択肢が分かれます。
| テンプレートの WAF | Amplify コンソールの Firewall | |
|---|---|---|
| 守る対象 | Cognito(ログイン) | Amplify Hosting(フロントエンドの配信) |
| 設定方法 | 環境変数 ALLOWED_IPV4_CIDRS(IaC 管理) | コンソールで設定 |
| 費用 | WAF の固定費(約 $6〜7/月) | Amplify Firewall の利用料が別途発生 |
テンプレートの WAF は CDK で Cognito に紐付けているので、許可 IP 外からはログインできなくなります。ただしログイン画面自体は見えます。許可 IP 外には画面の存在すら見せたくない、という要件がある場合は、Amplify コンソールの Firewall でフロントエンド配信側にも IP 制限をかけてください。Hosting アプリは IaC 管理外のため、こちらはコンソールでの設定になります。
明確な要件がなければ、まずはテンプレート側の WAF だけで運用でも良いかなと思いました。
コスト感
テンプレートが作るインフラ自体はほぼ従量課金で、小規模利用なら数ドル/月程度です。支配的なのは Bedrock の推論による料金で、AgentCore は基盤リソース分だけの従量課金です。料金はいずれも 2026 年 7 月時点のものです。
| リソース | 目安 |
|---|---|
| Bedrock モデル推論 | 利用量に比例(支配的なコスト) |
| AgentCore Harness | 基盤リソース分のみ従量課金 |
| Cognito | 無料枠 10,000 MAU(Entra ID など OIDC / SAML 連携は 50 MAU まで無料、以降 $0.015/MAU) |
| API Gateway REST | $3.50/100 万リクエスト |
| Lambda | ストリーミング 1 分 × ARM 128MB ≒ $0.0001/回 |
| Amplify Hosting | ビルド $0.01/分、配信$0.15/GB |
| WAF(有効時のみ) | 約 $6〜7/月の固定費 +$0.60/100 万リクエスト |
WAF だけ固定費が発生するので、IP 制限が不要なら未設定のままにしておけば WAF 自体が作成されません。Entra ID の SSO を本格的に使う場合は、Cognito の OIDC 連携分の課金($0.015/MAU)を見込んでおいてください。
おわりに
コンソールでサッと作ったエージェントを、そのままの手軽さでチームに配れるようにしました!エージェントの改善はコンソール側で完結して、アプリの再デプロイが要らないのが個人的に良いかなと思っています!ビルドの時間が長いのが難点ですが・・・
Harness で作ったエージェントを配りたいけど利用者への権限払い出しが面倒だな・・・という方は、ぜひ試してみてください。FBなどありましたらGitHubのIssueからお気軽にお申し付けください!
本記事が少しでも参考になりましたら幸いです。最後までご覧いただきありがとうございました!








