AlexaとBedrockをLambdaを使って連携してみた

AlexaとBedrockをLambdaを使って連携してみた

2026.01.20

はじめに

こんにちは、山本翔大です。
今回は自宅で使用している Alexa を Amazon Bedrock と連携して音声で AI に質問できる仕組みを構築しました。
Alexa は標準機能でもある程度 AI を活用した回答を返してくれますが、今回は Bedrock を使ってより高度な AI 応答を実現します。

1.Lambda関数の作成と権限設定

関数の作成

まずは処理を実行する Lambda 関数を作成します。
Lambda コンソール で「関数の作成」をクリックし、以下の設定で関数を作成してください。

  • 関数名: alexa-bedrock-handler(任意)
  • ランタイム: Python 3.12
  • アーキテクチャ: x86_64
  • デフォルトの実行ロールの変更 → 「基本的な Lambda 権限で新しいロールを作成」のまま作成。

IMG_4023

権限とタイムアウトの設定

次に Lambda が Bedrock にアクセスするためのポリシーを設定します。
設定タブから権限→ロール名をクリックして IAM コンソールに移動してください。
許可を追加 → ポリシーをアタッチからAmazonBedrockFullAccessを検索してアタッチします。

IMG_4025

※ 本記事では検証目的で AmazonBedrockFullAccess を使用していますが、
本番環境では最小権限の原則に従い、必要なモデルへのアクセスのみを許可する
カスタムポリシーの使用を推奨します。

次に Lambdaのデフォルトタイムアウトでは少し短いので延長します。
設定タブ → 一般設定 → 編集 から、タイムアウトを 60 秒程度に変更してください。

IMG_4026

コードの設定

「コード」タブで以下のコードを記述してください。

以下のコードは Alexa に話しかけた際に Amazon Bedrock(Claude 3 Haiku)で AI 回答を生成するコードです。

import json
import boto3
import logging

# ロガー設定
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# Bedrock クライアント
bedrock = boto3.client(service_name='bedrock-runtime', region_name='ap-northeast-1') # 使用するリージョンに応じて変えてください

def lambda_handler(event, context):
    logger.info(json.dumps(event))

    request_type = event['request']['type']

    # 1. 起動時
    if request_type == "LaunchRequest":
        return build_response("AIチャットへようこそ。何について話しますか?", should_end_session=False)

    # 2. 質問時(「○○について教えて」)
    elif request_type == "IntentRequest":
        intent_name = event['request']['intent']['name']

        if intent_name == "ChatIntent":
            # スロットからユーザーの発話を取得
            slots = event['request']['intent']['slots']
            user_input = slots['Query']['value']

            # Bedrock呼び出し
            ai_response = call_bedrock(user_input)

            # 回答してセッションを維持
            return build_response(ai_response, should_end_session=False)

        elif intent_name == "AMAZON.StopIntent" or intent_name == "AMAZON.CancelIntent":
            return build_response("終了します。", should_end_session=True)

    return build_response("すみません、よくわかりませんでした。", should_end_session=False)

def call_bedrock(prompt):
    try:
        # Claude 3 用のペイロード
        body = json.dumps({
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 300,
            "messages": [
                {
                    "role": "user",
                    "content": f"3 行程度でわかりやすく答えてください。\n\nユーザーの質問: {prompt}"
                }
            ]
        })

        response = bedrock.invoke_model(
            modelId='anthropic.claude-3-haiku-20240307-v1:0', # 使用するモデルに応じて変えてください
            body=body
        )

        response_body = json.loads(response.get('body').read())
        return response_body['content'][0]['text']

    except Exception as e:
        logger.error(e)
        return "AIの呼び出しに失敗しました。"

def build_response(output_speech, should_end_session):
    return {
        "version": "1.0",
        "response": {
            "outputSpeech": {
                "type": "PlainText",
                "text": output_speech
            },
            "shouldEndSession": should_end_session
        }
    }

2.Alexa Developer Consoleでの設定

スキルの作成

次に Alexa 側の設定をします。
Alexa Developer Console に Alexa で使用しているアカウントでログインしてください。
「スキルの作成」をクリックし以下の設定でスキルを作成してください。

  • スキル名:AIChat
  • プライマリロケールの選択:日本語
  • エクスペリエンスのタイプ:その他
  • モデルの選択:カスタム
  • ホスティングサービス:独自のプロビジョニング
  • Templates:スクラッチで作成

IMG_4027

呼び出し名の設定

次に AI を呼び出すための呼び出し名を設定します。
左メニューの Invocation から Skill Invocation Name を選択してください。
呼び出し名は任意で設定できますが、Alexa が認識しやすい名前にすることをおすすめします。最初に「エーアイチャット」と設定したところうまく動作しなかったため、今回は「マイチャット」に変更しました。

IMG_4037

インテントの作成

次にインテントを作成します。
左メニューの Interaction Model を選択し Intents をクリックしてください。
現在作成しているインテントの一覧が表示されるので「Add Intent」をクリックします。
名前を「ChatIntent」と設定しインテントを作成します。

作成したら Intent Slots に以下の設定でスロットを作成します。

  • NAME:Query
  • SLOT TYPE:AMAZON.SearchQuery

スロットを作成したら Sample Utterances を設定します。
以下のように設定してください。

{Query} 教えて
{Query} とは
{Query} して
{Query} やって

IMG_4043

スキルのエンドポイント設定

左メニューから Endpoint を選択します。
Service Endpoint Type の AWS Lambda ARN を選択してください。
Default Resion が空白になっているのでここに Lambda の ARN を貼り付けます。なお Lambda の ARN はマネジメントコンソールで対象の Lambda を開いて右上の 「ARN をコピー」から取得できます。

また、この画面に表示されている Skill ID は後で使用するためメモしておいてください。

IMG_4035

モデルのビルド

全ての設定が終わったら右上の Build skill を押してください。

3.Lambda トリガーの設定

最後にトリガーの設定をします。
マネジメントコンソールで Lambda を開き、トリガーを追加から Alexa を選択します。
次に Alexa Skills kit を選択し、スキル ID 検証を有効化します。
スキル ID には先ほどエンドポイントを設定したときにメモしたスキル ID を入力してください。

IMG_4036

4.テスト

最後にテストを行います。
Alexa Developer Console の テストタブでテキストによるテストを行うことができます。
スキルテストが有効になっているステージを「非公開」から「開発中」に変更します。
呼び出し名を「マイチャット」に設定したため「マイチャットを開いて」と入力すると「AIチャットへようこそ。何について話しますか?」と返答されます。
その後「〇〇について教えて」と入力すると AI で生成された回答が返ってきます。

以下の画像はデフォルトの回答と Bedrock を利用した回答の比較です。
IMG_4044

5.補足情報

モデルアクセスの有効化

今回は Claude 3 Haiku を使用しました。
Bedrock で Anthropic 社のモデルを使用する際は、初回にユースケースの詳細を提出する必要があります。
Bedrock → モデルカタログ → Claude 3 Haiku → プレイグラウンドを選択するとフォームが表示されるので、適宜入力してください。

https://dev.classmethod.jp/articles/tsnote-bedrock-anthropic-usecase-submit/

モデル、プロンプトの変更方法

コード内の以下の ID 部分を変更することでモデルの変更が可能です。

modelId='anthropic.claude-3-haiku-20240307-v1:0',

変更する際はリージョンの制限にもご注意ください。

また、以下の部分を変更することでプロンプトの変更も可能です。

"content": f"3 行程度でわかりやすく答えてください。\n\nユーザーの質問: {prompt}"

Echo 端末で実行する方法

Echo 端末で利用するには Alexa アプリでスキルの有効化を選択する必要があります。

1.Alexa アプリを開いて 3 本線のメニューから「スキル・ゲーム」を選択してください
2.最下部までスクロールしマイスキルを選択します
3.開発タブから作成したスキルを選択しスキルを有効化してください

なお、私の環境ではデフォルトで有効化されていましたが、正常に動作しなかったため、一度無効化してから再度有効化することで機能するようになりました。

おわりに

今回は Alexa と Amazon Bedrock を連携して、音声で AI に質問できる仕組みを構築しました。
本記事では安価で高速な Claude 3 Haiku を使用しましたが、用途に応じて他のモデルに変更することも可能です。お好みのモデルでカスタマイズしてみてください。
また、今回実装したのは 1 問 1 答形式のシンプルな構成ですが、コードを変更することで会話をすることも可能です。興味のある方はお試しください。

参考資料

https://aws.amazon.com/jp/bedrock/?sec=aiapps&pos=2&refid=1f887566-8561-4bf2-a30b-f383e290b094

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。

運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。

当社は様々な職種でメンバーを募集しています。

「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

FacebookHatena blogX

関連記事