こんにちは、SCSKの坂木です。
今回は、生成AI(Gemini3.0)を活用して、フローチャートからAmazon Lexのチャットボットを自動構築するという検証を行ってみました。
「AWSでチャットボットを作りたいけど、Lexの構築は設定項目が多くて難しい…」
「Lexのコンソール画面だけだと、会話全体の流れ(全体図)が見えづらい…」
そんな悩みを持つ方向けに、フローチャートさえあれば、あとはAIにお任せ というワークフローが可能か試してみた記録です。
Amazon Lexについて
Amazon Lexは、音声やテキストを使用した会話型チャットボットを構築するためのフルマネージドサービスです。
主な特徴
フルマネージド:サーバーのプロビジョニングや管理が不要。
他サービス連携:AWS Lambda等と統合し、会話に応じたバックエンド処理(データ取得や予約など)を簡単に実行可能。
コスト効率 :リクエスト数に応じた従量課金制。
Lexの課題:全体像の把握が難しい
一方で、Lexで開発を進める上での課題もあります。
Lexには「ビジュアルビルダー」という機能がありますが、これは特定のインテント内の細かい動きを見るのがメインです。「メニューAを選んだらBに飛び、そこからCに戻る」といったボット全体の遷移図を俯瞰して見る機能は標準ではありません。
そのため、全体像の把握にはExcelなどで別途フローチャートを作って構成を管理する必要があります。
「どうせExcelで全体図(フローチャート)を作る必要があるなら、そこからAIを使って直接ボットを作ってしまえばいいのでは?」
そう考えたのが、今回の取り組みのきっかけだったりします。
今回のアプローチ:フローチャート × Gemini
そこで今回は、構築の難易度を下げるために、人間とAIの役割を完全に分けるアプローチを試しました。
- 人間(設計者): 「どんな会話にしたいか」を考えることに集中する(Excel作成)
- AI(エンジニア): 複雑なAWSの設定やコード記述を担当する(Terraform生成)
これまでは、人間が「会話の設計」も「AWSコンソールの設定」も両方やる必要がありましたが、後者の面倒な作業を全てAIに丸投げしよう、という作戦です。
具体的な検証フローは以下の通りです。
- 【人間】設計図を作る Excelで会話の流れ(フローチャート)とセリフ(管理表)を作成する。
- 【AI】コードに変換する ExcelデータでGeminiに渡し、Lex構築用のTerraformコードを書いてもらう。
- 【AWS】デプロイ 出力されたコードを実行し、AWS上にボットを自動生成する。
このフローにより、Lexの専門知識がなくても、「Excelさえ書ければチャットボットが作れる」という状態を目指します。
Excelでフローチャート+補足の表資料を作成する
今回は、会話の流れ(遷移)を管理する「フローチャート」と、ボットのセリフを管理する「管理表」の2つを使って設計します。
1. 会話の流れを整理する(フロー図)
まずは、会話の地図となるフローチャートを作成します。「どのボタンを押したら、次にどの画面に進むか」という会話のルートは、すべてこの図の中で管理します。
Excelのセルに文字だけで「Aの次はBへ移動」と書くと複雑になりがちですが、こうして矢印を使った図にすることで、直感的に会話の流れを作ることができます。これが今回の設計のメインとなります。
2. Excelの表に落とし込む(管理表)
図で流れができたら、各場面で「ボットが何と喋るか」をExcelの表に入力します。
フローチャートの中に長いセリフを書くとゴチャゴチャしてしまうので、図をスッキリさせるために、メッセージ部分は表で分けて管理することにしました。
この表では、会話の1シーンごとに以下の3つの項目を埋めていくだけです。
| 項目 | 説明 |
| インテント名(シーンのID) | 会話の各シーンに付ける「名前」です(例:Iac_Menu) 他のシーンと区別するためのIDのようなもの |
| 応答メッセージ | そのシーンで「ボットが喋る言葉」です(例:「ご質問内容を選択してください」) |
| 次の動作 | ボタンが押された後に「次に移動するシーンの名前」を指定します (例:インストールを選んだら Iac_ZabbixInstall へ移動する、といった行き先案内です) |
GeminiにTerraformコードを書いてもらう
この章でやったことは非常にシンプルです。 前工程で作成したフローチャートと表が記載されたエクセルデータをコピーして、Geminiのチャット欄に貼り付け、以下のプロンプトを投げただけです。
#実際に使ったプロンプト 添付のフローチャート及び表から、Lexのチャットボットを作成するTerraformのコードを作成してください。 ボタンにおけるラベルと値は、フローチャートの分岐の文字列を用いてください。
ちなみに、最後の「ボタンにおける〜」という一文を加えたのには理由があります。
今回作成したExcelの管理表はシンプルさを優先し、「ボタンに表示する文字」の列を省いていました。そのため、Geminiがボタン名の実装で迷わないよう、「次の画面へつながる流れ(分岐)を見て、そこから適切なボタン名を自動で判断してね」 という意図を伝えています。
ちなにみ、GeminiはExcelには書かれていないLex構築に必要な設定を勝手に理解し、コードに落とし込んでくれました。
具体的には、以下の点を自律的に判断してくれました。
- IAMロールの自動作成 Excelには「権限」の話など書いていませんが、Geminiは「Lexが動くためにはIAMロールが必要だ」と判断し、適切なポリシー(AmazonLexFullAccess)を持ったロールを作成するコードを追加してくれました。
- ボットの基本構造(Bot / Locale)の定義 インテント(会話の中身)を作る前に、まず「ボット本体」と「言語設定(日本語)」の枠組みが必要であることを理解し、定義してくれました。
- ボタンと次の会話の「つなぎ方」 フローチャートでは「Aボタンを押すとBへ行く」としか表現していませんでしたが、Geminiはこれを「Bのインテントの発話条件(Utterance)に、Aボタンのラベルを設定する」というLex特有の実装ロジックに変換してくれました。
- レスポンスカードの適切な選択 「ボタンを表示する」という要件に対し、単なるテキストではなく、Lex V2における適切な形式である image_response_card を選択して実装してくれました。
もちろん、一発で完璧に動作したわけではありません。Terraformのプロバイダバージョンの違いによる記述エラーや、リソース名の重複エラーなどが発生しました。
しかし、ここでも専門知識は不要でした。出たエラー文をそのままコピーしてGeminiに貼り付けるだけで、「すみません、修正します」と正しいコードを書き直してくれたのです。
実際にGeminiと協力して完成させたTerraformコードの全文は、量が多いため記事の最後に掲載しています。
チャットボットの動作確認
Geminiが書いてくれたTerraformコードを実行(terraform apply)し、AWSの管理画面を確認してみました。
結果から言うと、Lexの複雑な設定画面を一切触ることなく、想定通りの動きをするチャットボットが完成していました。
1. 管理画面で「答え合わせ」
まずはAWSコンソールを開いて、作成されたボットの中身を見てみます。
私は特に指定していなかったのですが、Geminiが気を利かせて「ZabbixHelpBot」という、まさに用途にぴったりの名前を付けてくれていました。
さらに「インテント(会話のパーツ)」の一覧を確認すると、Excelのフローチャートで定義していた Iac_Menu や Iac_Server といった項目が、正しく生成されていることが分かります。
2. 実際の会話テスト
設定が合っていても動かなければ意味がありません。AWSコンソールのテスト機能を使って、実際にボットと会話してみました。
ケース①:インストール手順の案内
まずは「メニュー」から「インストール」を選び、さらに「Server」を選択するフローです。
Excelの矢印で描いた通りにボタンが次々と表示され、最終的に正しいURLが案内されました。「終了」ボタンで会話を終える動きも完璧です。
ケース②:別メニューへの遷移と「戻る」動作
次に、「ライブラリ」や「ホスト設定」といった別の質問を選んでみます。
こちらもURLの案内後に「メニューに戻る」ボタンが表示され、それを押すと最初の画面に戻るという、ループ構造も正しく機能していました。
まとめ
本ブログでは、生成AI(Gemini)を活用して、ExcelのフローチャートからAmazon Lexのチャットボットを自動構築する検証を行いました。
結果として、専門知識が必要なAWSの管理画面を一切操作することなく、直感的な「お絵描き」だけでボットを作り上げることができました。設計は人間、実装はAIという役割分担により、開発のハードルは劇的に下がります。
この手法の最大のメリットは、「正」となるドキュメントが「フローチャート(Excel)」になることです。 Lexのコンソールは設定が複雑でブラックボックス化しがちですが、この方法なら「Excelを見れば全体の動きがわかる」「修正したければExcelを直してAIにコードを再生成させる」という運用が可能になります。
「会話をデザインする」ことさえできれば、あとはAIが形にしてくれる時代です。ぜひ皆さんも、手書きのメモからクラウド上のボットを作る体験を試してみてください。
▼ AWSに関するおすすめ記事



(付録)完成したTerraformコード全文
最後に、今回の検証でGeminiが生成し、修正を加えた最終的なTerraformコードを掲載します。
以下のコードを保存し、terraform apply を実行するだけで、今回のZabbixヘルプボットがお使いのAWS環境に構築されます。
#provider.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
#main.tf
# --------------------------------------------------------------------------------
# IAM Role for Lex
# --------------------------------------------------------------------------------
resource "aws_iam_role" "lex_role" {
name = "LexV2BotRole"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "lexv2.amazonaws.com"
}
}
]
})
}
resource "aws_iam_role_policy_attachment" "lex_policy_attach" {
role = aws_iam_role.lex_role.name
policy_arn = "arn:aws:iam::aws:policy/AmazonLexFullAccess"
}
# --------------------------------------------------------------------------------
# Lex Bot Definition
# --------------------------------------------------------------------------------
resource "aws_lexv2models_bot" "zabbix_bot" {
name = "ZabbixHelpBot"
role_arn = aws_iam_role.lex_role.arn
data_privacy {
child_directed = false
}
idle_session_ttl_in_seconds = 300
}
# --------------------------------------------------------------------------------
# Bot Locale (日本語)
# --------------------------------------------------------------------------------
resource "aws_lexv2models_bot_locale" "ja_jp" {
bot_id = aws_lexv2models_bot.zabbix_bot.id
bot_version = "DRAFT"
locale_id = "ja_JP"
n_lu_intent_confidence_threshold = 0.40
}
# --------------------------------------------------------------------------------
# Intent: Iac_Menu (トップメニュー)
# --------------------------------------------------------------------------------
resource "aws_lexv2models_intent" "iac_menu" {
bot_id = aws_lexv2models_bot.zabbix_bot.id
bot_version = "DRAFT"
locale_id = aws_lexv2models_bot_locale.ja_jp.locale_id
name = "Iac_Menu"
sample_utterance {
utterance = "メニュー"
}
sample_utterance {
utterance = "開始"
}
sample_utterance {
utterance = "トップ"
}
initial_response_setting {
initial_response {
message_group {
message {
plain_text_message {
value = "ご質問内容を選択してください"
}
}
}
message_group {
message {
image_response_card {
title = "選択肢"
button {
text = "Zabbixインストールに関する質問"
value = "Zabbixインストールに関する質問"
}
button {
text = "Zabbixライブラリに関する質問"
value = "Zabbixライブラリに関する質問"
}
button {
text = "ホスト設定に関する質問"
value = "ホスト設定に関する質問"
}
}
}
}
}
next_step {
dialog_action {
type = "ElicitIntent"
}
}
}
}
# --------------------------------------------------------------------------------
# Intent: Iac_ZabbixInstall (サブメニュー)
# --------------------------------------------------------------------------------
resource "aws_lexv2models_intent" "iac_zabbix_install" {
bot_id = aws_lexv2models_bot.zabbix_bot.id
bot_version = "DRAFT"
locale_id = aws_lexv2models_bot_locale.ja_jp.locale_id
name = "Iac_ZabbixInstall"
sample_utterance {
utterance = "Zabbixインストール"
}
sample_utterance {
utterance = "Zabbixインストールに関する質問"
}
initial_response_setting {
initial_response {
message_group {
message {
plain_text_message {
value = "インストールするコンポーネントを選択してください"
}
}
}
message_group {
message {
image_response_card {
title = "コンポーネント選択"
button {
text = "Server"
value = "Server"
}
button {
text = "Agent"
value = "Agent"
}
}
}
}
}
next_step {
dialog_action {
type = "ElicitIntent"
}
}
}
}
# --------------------------------------------------------------------------------
# Intent: Iac_ZabbixLibrary (末端ノード)
# --------------------------------------------------------------------------------
resource "aws_lexv2models_intent" "iac_zabbix_library" {
bot_id = aws_lexv2models_bot.zabbix_bot.id
bot_version = "DRAFT"
locale_id = aws_lexv2models_bot_locale.ja_jp.locale_id
name = "Iac_ZabbixLibrary"
sample_utterance {
utterance = "Zabbix要件"
}
sample_utterance {
utterance = "Zabbixライブラリに関する質問"
}
initial_response_setting {
initial_response {
message_group {
message {
plain_text_message {
value = "Zabbixに必要なパッケージはこちらのサイトをご確認ください。\nhttps://www.zabbix.com/documentation/current/jp/manual/installation/requirements"
}
}
}
message_group {
message {
image_response_card {
title = "次の操作"
button {
text = "メニュー"
value = "メニュー"
}
button {
text = "終了"
value = "終了"
}
}
}
}
}
next_step {
dialog_action {
type = "ElicitIntent"
}
}
}
}
# --------------------------------------------------------------------------------
# Intent: Iac_Host (末端ノード)
# --------------------------------------------------------------------------------
resource "aws_lexv2models_intent" "iac_host" {
bot_id = aws_lexv2models_bot.zabbix_bot.id
bot_version = "DRAFT"
locale_id = aws_lexv2models_bot_locale.ja_jp.locale_id
name = "Iac_Host"
sample_utterance {
utterance = "ホスト設定"
}
sample_utterance {
utterance = "ホスト設定に関する質問"
}
initial_response_setting {
initial_response {
message_group {
message {
plain_text_message {
value = "ホストの設定はこちらのサイトをご確認ください。\nhttps://www.zabbix.com/documentation/current/jp/manual/config/hosts/host"
}
}
}
message_group {
message {
image_response_card {
title = "次の操作"
button {
text = "メニュー"
value = "メニュー"
}
button {
text = "終了"
value = "終了"
}
}
}
}
}
next_step {
dialog_action {
type = "ElicitIntent"
}
}
}
}
# --------------------------------------------------------------------------------
# Intent: Iac_Server (末端ノード)
# --------------------------------------------------------------------------------
resource "aws_lexv2models_intent" "iac_server" {
bot_id = aws_lexv2models_bot.zabbix_bot.id
bot_version = "DRAFT"
locale_id = aws_lexv2models_bot_locale.ja_jp.locale_id
name = "Iac_Server"
sample_utterance {
utterance = "Server"
}
initial_response_setting {
initial_response {
message_group {
message {
plain_text_message {
value = "zabbixサーバのインストール手順はこちらをご確認ください。\nhttps://www.zabbix.com/jp/download"
}
}
}
message_group {
message {
image_response_card {
title = "次の操作"
button {
text = "メニュー"
value = "メニュー"
}
button {
text = "終了"
value = "終了"
}
}
}
}
}
next_step {
dialog_action {
type = "ElicitIntent"
}
}
}
}
# --------------------------------------------------------------------------------
# Intent: Iac_Agent (末端ノード)
# --------------------------------------------------------------------------------
resource "aws_lexv2models_intent" "iac_agent" {
bot_id = aws_lexv2models_bot.zabbix_bot.id
bot_version = "DRAFT"
locale_id = aws_lexv2models_bot_locale.ja_jp.locale_id
name = "Iac_Agent"
sample_utterance {
utterance = "Agent"
}
initial_response_setting {
initial_response {
message_group {
message {
plain_text_message {
value = "zabbixエージェントのインストール手順はこちらをご確認ください。\nhttps://www.zabbix.com/jp/download_agents"
}
}
}
message_group {
message {
image_response_card {
title = "次の操作"
button {
text = "メニュー"
value = "メニュー"
}
button {
text = "終了"
value = "終了"
}
}
}
}
}
next_step {
dialog_action {
type = "ElicitIntent"
}
}
}
}
# --------------------------------------------------------------------------------
# Intent: Iac_End (終了処理)
# --------------------------------------------------------------------------------
resource "aws_lexv2models_intent" "iac_end" {
bot_id = aws_lexv2models_bot.zabbix_bot.id
bot_version = "DRAFT"
locale_id = aws_lexv2models_bot_locale.ja_jp.locale_id
name = "Iac_End"
sample_utterance {
utterance = "終了"
}
sample_utterance {
utterance = "ありがとう"
}
closing_setting {
active = true
next_step {
dialog_action {
type = "EndConversation"
}
}
closing_response {
message_group {
message {
plain_text_message {
value = "ご利用ありがとうございました。"
}
}
}
}
}
}





