🍽️

「渋谷でカフェ」とLINEするだけ。Claude × Google MapsでAIお店検索Botを作った

に公開

LINEで「@お店」と送るだけ!AIがお店を探してくれるBotを作った

はじめに

「渋谷で静かなカフェ探して」「新宿でデート向きの居酒屋ある?」

こんな風にLINEで聞くだけで、AIがGoogle Mapsから条件に合うお店を探して提案してくれるBotを作りました。

友達追加はこちらから
https://lin.ee/pTMQk9J

どんなサービス?

使い方はシンプル

LINEで @お店 に続けて条件を入力するだけ。

@お店 渋谷で静かなカフェ
@お店 上野で3000円以下の焼肉
@お店 品川駅近くでランチ

返ってくる情報

  • 店名
  • 距離(目安)
  • 価格帯(目安)
  • おすすめポイント
  • Google Mapsへのリンク

さらに「もっと絞り込む質問」も提案してくれるので、会話しながら理想のお店を見つけられます。


技術構成

アーキテクチャ

※作画:claude opus4.5 with aws-diagram-mcp-server

使用技術

カテゴリ 技術
AI/LLM Amazon Bedrock (Claude)
地図API Google Maps API (MCP Server)
コンピュート AWS Lambda (コンテナ)
API Amazon API Gateway
シークレット管理 AWS Systems Manager Parameter Store
IaC Terraform
言語 Python 3.14

処理フロー

1. ユーザーがLINEで「@お店 渋谷でカフェ」と送信
2. LINE PlatformがWebhookでAPI Gatewayを呼び出し
3. API GatewayがLambda関数を起動
4. Lambdaが「検索中です」と即レス(reply)
5. Bedrock (Claude) がユーザーの意図を解析
6. Google Maps APIで条件に合うお店を検索
7. Claudeが結果を整形して返答を生成
8. LINEにプッシュメッセージで結果を送信

こだわりポイント

1. 即レス + 結果は後から

お店検索には数秒かかるため、まず「検索中です」と即レスして、結果は後からプッシュメッセージで送信。ユーザーを待たせない工夫です。

# ① まず即レス
send_line_reply(reply_token, "ただいま条件に合うお店をお探ししております...")

# ② 重い処理(AI + Google Maps)
ai_response = _call_agent(query)

# ③ 結果はpushで送信
send_line_push(dest, ai_response, CHANNEL_ACCESS_TOKEN)

2. グループチャット対応

個人チャットだけでなく、グループやトークルームでも使えます。

def _get_push_destination(ev):
    source = ev.get("source", {})
    source_type = source.get("type")
    
    if source_type == "user":
        return source.get("userId")
    if source_type == "group":
        return source.get("groupId")
    if source_type == "room":
        return source.get("roomId")

3. セキュアなシークレット管理

APIキーやトークンは環境変数ではなく、AWS Parameter Store(SecureString)で管理。

def get_secret(name: str) -> str:
    ssm_prefix = os.environ.get("SSM_PREFIX")
    client = boto3.client('ssm')
    response = client.get_parameter(
        Name=f"{ssm_prefix}/{name}", 
        WithDecryption=True
    )
    return response['Parameter']['Value']

開発中にハマったこと

1. Pythonのsecretsモジュールと名前衝突

自作のsecrets.pyがPython標準ライブラリと衝突してエラーに。ssm_secrets.pyにリネームして解決。

2. Mac (Apple Silicon) でのDockerビルド

普通にビルドするとLambdaで動かない!以下のオプションが必須でした。

docker build --platform linux/amd64 --provenance=false --sbom=false -t line-shop-bot .

3. Bedrock権限の追加忘れ

LambdaからBedrockを呼び出す権限をIAMポリシーに追加し忘れてAccessDeniedException

まとめ

LINEで「@お店」と送るだけでAIがお店を探してくれるBot、ぜひ使ってみてください!

技術的には、Bedrock + Google Maps API + Lambda + API Gatewayというサーバーレス構成で、Terraformでインフラをコード管理しています。


参考リンク

Discussion