AWS Lambda を Amazon Lex に使用する - AWS Lambda

AWS Lambda を Amazon Lex に使用する

Amazon Lex を使用して、会話ボットをアプリケーションに統合できます。Amazon Lex ボットには、ユーザーとの会話型インターフェイスが用意されています。Amazon Lex では、Lambda との統合が事前に構築されています。これにより、Lambda 関数を Amazon Lex ボットで使用できます。

Amazon Lex ボットを設定するときに、検証、応答、またはその両方を行う Lambda 関数を指定できます。検証の場合、Amazon Lex は、ユーザーからの各レスポンスの後に Lambda 関数を呼び出します。Lambda 関数はレスポンスを検証し、必要に応じてユーザーに修正フィードバックを提供できます。応答の場合、Amazon Lex は、ボットが必要なすべての情報を正常に収集し、ユーザーから確認を受け取った後、Lambda 関数を呼び出してユーザーからのリクエストに応答します。

Lambda 関数の同時実行数を管理して、提供する同時ボット会話の最大数を制御できます。関数の同時実行数が最大になった場合、Amazon Lex API は HTTP 429 ステータスコード (リクエストが多すぎる) を返します。

Lambda 関数が例外をスローした場合、API は HTTP 424 ステータスコード (依存関係で失敗) を返します。

Amazon Lex ボットは Lambda 関数を同期的に呼び出します。イベントパラメータには、ボットに関する情報と会話の各スロットの値が含まれます。invocationSource パラメータは、Lambda 関数が入力を検証する (DialogCodeHook) か、インテントに応答する (FulfillmentCodeHook) かを示します。

例 Amazon Lex メッセージイベント

{ "messageVersion": "1.0", "invocationSource": "FulfillmentCodeHook", "userId": "ABCD1234", "sessionAttributes": { "key1": "value1", "key2": "value2", }, "bot": { "name": "OrderFlowers", "alias": "prod", "version": "1" }, "outputDialogMode": "Text", "currentIntent": { "name": "OrderFlowers", "slots": { "FlowerType": "lilies", "PickupDate": "2030-11-08", "PickupTime": "10:00" }, "confirmationStatus": "Confirmed" } }

Amazon Lex は、以下の形式での Lambda 関数からのレスポンスを想定しています。dialogAction フィールドは必須です。sessionAttributes および recentIntentSummaryView フィールドはオプションです。

例 Amazon Lex メッセージイベント

{ "sessionAttributes": { "key1": "value1", "key2": "value2" ... }, "recentIntentSummaryView": [ { "intentName": "Name", "checkpointLabel": "Label", "slots": { "slot name": "value", "slot name": "value" }, "confirmationStatus": "None, Confirmed, or Denied (intent confirmation, if configured)", "dialogActionType": "ElicitIntent, ElicitSlot, ConfirmIntent, Delegate, or Close", "fulfillmentState": "Fulfilled or Failed", "slotToElicit": "Next slot to elicit } ], "dialogAction": { "type": "Close", "fulfillmentState": "Fulfilled", "message": { "contentType": "PlainText", "content": "Thanks, your pizza has been ordered." }, "responseCard": { "version": integer-value, "contentType": "application/vnd.amazonaws.card.generic", "genericAttachments": [ { "title":"card-title", "subTitle":"card-sub-title", "imageUrl":"URL of the image to be shown", "attachmentLinkUrl":"URL of the attachment to be associated with the card", "buttons":[ { "text":"button-text", "value":"Value sent to server on button click" } ] } ] } } }

dialogAction に必要な追加のフィールドは、type フィールドの値によって異なります。イベントとレスポンスのフィールドの詳細については、Amazon Lex 開発者ガイドの「Lambda のイベントとレスポンスの形式」を参照してください。Amazon Lex で Lambda を使用する方法を示すサンプルチュートリアルについては、Amazon Lex 開発者ガイドの「演習 1: 設計図を使用して Amazon Lex ボットを作成する」を参照してください。

ロールとアクセス許可

サービスにリンクされたロールを関数の実行ロールとして設定する必要があります。Amazon Lex は、事前定義されたアクセス許可を持つサービスにリンクされたロールを定義します。コンソールを使用して Amazon Lex ボットを作成すると、サービスにリンクされたロールが自動的に作成されます。AWS CLI でサービスにリンクされたロールを作成するには、create-service-linked-role コマンドを使用します。

$ aws iam create-service-linked-role --aws-service-name lex.amazonaws.com

このコマンドは以下のロールを作成します。

{ "Role": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "lex.amazonaws.com" } } ] }, "RoleName": "AWSServiceRoleForLexBots", "Path": "/aws-service-role/lex.amazonaws.com/", "Arn": "arn:aws:iam::account-id:role/aws-service-role/lex.amazonaws.com/AWSServiceRoleForLexBots" }

Lambda 関数が他の AWS のサービスを使用する場合、対応するアクセス許可をサービスにリンクされたロールに追加する必要があります。

リソースベースのアクセス許可ポリシーを使用して、Amazon Lex インテントに Lambda 関数の呼び出しを許可します。Amazon Lex コンソールを使用する場合、アクセス許可ポリシーが自動的に作成されます。AWS CLI から、Lambda add-permission コマンドを使用してアクセス許可を設定します。以下の例では、OrderFlowers インテントのアクセス許可を設定しています。

aws lambda add-permission \ --function-name OrderFlowersCodeHook \ --statement-id LexGettingStarted-OrderFlowersBot \ --action lambda:InvokeFunction \ --principal lex.amazonaws.com \ --source-arn "arn:aws:lex:us-east-1:123456789012 ID:intent:OrderFlowers:*"