

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Lex V2 ボットの AWS Lambda関数の作成
<a name="lambda-attach"></a>

Amazon Lex V2 ボットの Lambda 関数を作成するには、AWS マネジメントコンソールAWS Lambdaから にアクセスし、新しい関数を作成します。詳細については、 デ[AWS Lambdaベロッパーガイド](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)を参照してくださいAWS Lambda。

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) でAWS Lambdaコンソールを開きます。

1. 左側のサイドバーで **[関数]** を選択します。

1. **[Create Function]** (関数を作成) を選択します。

1. **[一から作成]** を選択して最小限のコードから始めるか、**[ブループリントの使用]** を選択してリストから一般的なユースケースのサンプルコードを選択するか、**[コンテナイメージ]** を選択して関数にデプロイするコンテナイメージを選択できます。**[一から選択]** を選択した場合は、次の手順に進んでください。

   1. 関数には、その機能を説明するわかりやすい**関数名**を付けてください。

   1. **[ランタイム]** の下のドロップダウンメニューから、関数を記述する言語を選択します。

   1. 関数の命令セット **[アーキテクチャ]** を選択します。

   1. デフォルトでは、Lambda は基本的なアクセス許可でロールを作成します。既存のロールを使用するか、AWS ポリシーテンプレートを使用してロールを作成するには、**デフォルトの実行ロールの変更**メニューを展開し、オプションを選択します。

   1. **[詳細設定]** メニューを展開して、その他のオプションを設定します。

1. **[Create Function]** (関数を作成) を選択します。

次の図は、新しい関数を最初から作成したときに表示される内容を示しています。

![新しい Lambda 関数。](http://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/images/lambda/lambda-new-function.png)


Lambda ハンドラー関数は、使用する言語によって異なります。少なくとも因数として `event` JSON オブジェクトを取ります。フィールドは、Amazon Lex V2 が [AWS LambdaLex V2 の入力イベント形式](lambda-input-format.md) で提供する `event` にあります。「[AWS LambdaLex V2 のレスポンス形式](lambda-response-format.md)」で説明されている形式と一致する `response` JSON オブジェクトが最終的に返されるように、ハンドラー関数を変更します。
+ 関数を記述し終えたら、**[デプロイ]** を選択して関数を使用できるようにします。

各ボットエイリアスは、最大で 1 つの Lambda 関数に関連付けられることに注意してください。ただし、Lambda コード内でボットに必要な数だけ関数を定義し、これらの関数を Lambda ハンドラー関数で呼び出すことができます。たとえば、同じボットエイリアスのすべてのインテントは同じ Lambda 関数を呼び出す必要がありますが、インテントごとに個別の関数を有効にするルーター関数を作成できます。次に、アプリケーションで使用または変更できるサンプルルーター関数を示します。

```
import os
import json
import boto3

# reuse client connection as global
client = boto3.client('lambda')

def router(event):
    intent_name = event['sessionState']['intent']['name']
    fn_name = os.environ.get(intent_name)
    print(f"Intent: {intent_name} -> Lambda: {fn_name}")
    if (fn_name):
        # invoke lambda and return result
        invoke_response = client.invoke(FunctionName=fn_name, Payload = json.dumps(event))
        print(invoke_response)
        payload = json.load(invoke_response['Payload'])
        return payload
    raise Exception('No environment variable for intent: ' + intent_name)

def lambda_handler(event, context):
    print(event)
    response = router(event)
    return response
```

**Amazon Lex V2 ボット会話でAWS Lambda関数を使用するタイミング**

Lambda 関数はユーザーとの会話の次の時点で使用できます。
+ インテントが認識された後の最初の応答。たとえば、ユーザーがピザを注文したいと言った後です。
+ ユーザーからスロット値を誘発した後。たとえば、ユーザーが注文したいピザのサイズをボットに伝えた後などです。
+ スロットを誘発するための各再試行の間。たとえば、認識しているサイズのピザを顧客が使用していない場合などです。
+ インテントを確認する時点。たとえば、ピザの注文を確認する場合などです。
+ インテントを達成するため。たとえば、ピザを注文する場合などです。
+ インテントの達成後、ボットが会話を終了する前。たとえば、飲み物を注文するインテントに切り替える場合などです。

**Topics**
+ [コンソールを使用して Amazon Lex V2 ボットに AWS Lambda関数をアタッチする](lambda-attach-console.md)
+ [API オペレーションを使用して Amazon Lex V2 ボットに AWS Lambda関数をアタッチする](lambda-attach-api.md)