Amazon Connectに、LexボットとLambda関数をCloudFormationや AWS CLIで関連付けしてみた
はじめに
本記事では、Amazon Connectインスタンスに、Amazon LexボットやAWS Lambda関数をAWS CloudFormationおよびAWS CLIを使って関連付ける方法を解説します。
Amazon Connectのフロー内でLexボットやLambda関数を呼び出すには、Connectインスタンスにそれぞれ関連付けが必要です。
手動で関連付けを行う場合、AWSマネジメントコンソールのConnectインスタンスページから設定可能ですが、本記事ではCloudFormationやCLIを使用した方法を紹介します。
AWSマネジメントコンソールからLexボットやLambdaを関連付け
前提条件
- Amazon Connectインスタンスが作成されていること
CloudFormationで関連付ける
今回使用するCloudFormationテンプレートは、以下の通りです。
このテンプレートでは、Lexボット(名前:test-lex
)とLambda関数(名前:test-lambda
)を作成し、既存のConnectインスタンスに関連付けます。
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Create Lambda, Lex bot, and associate them with Connect instance'
Parameters:
ConnectInstanceARN:
Type: String
Description: The Amazon Resource Name (ARN) of the instance.
Resources:
MyLambdaFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: test-lambda
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Code:
ZipFile: |
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Runtime: python3.12
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
MyLexBot:
Type: AWS::Lex::Bot
Properties:
Name: test-lex
DataPrivacy:
ChildDirected: false
IdleSessionTTLInSeconds: 300
RoleArn: !GetAtt LexBotRole.Arn
BotLocales:
- LocaleId: ja_JP
NluConfidenceThreshold: 0.40
VoiceSettings:
VoiceId: Kazuha
Intents:
- Name: FallbackIntent
ParentIntentSignature: AMAZON.FallbackIntent
- Name: yes
SampleUtterances:
- Utterance: はい
- Utterance: そうです
# IAM role for Lex
LexBotRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lexv2.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: lexv2-bot-policy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- polly:SynthesizeSpeech
Resource: '*'
# Associate Lex V2 with Connect
ConnectLexAssociation:
Type: AWS::Connect::IntegrationAssociation
Properties:
InstanceId: !Ref ConnectInstanceARN
IntegrationType: LEX_BOT
IntegrationArn: !Sub arn:aws:lex:${AWS::Region}:${AWS::AccountId}:bot-alias/${MyLexBot}/TSTALIASID
# Associate Lambda with Connect
ConnectLambdaAssociation:
Type: AWS::Connect::IntegrationAssociation
Properties:
InstanceId: !Ref ConnectInstanceARN
IntegrationType: LAMBDA_FUNCTION
IntegrationArn: !GetAtt MyLambdaFunction.Arn
TestBotAliasは自動的に作成されるため、CloudFormationで明示的に作成する必要はありません。
TestBotAliasのIDは常にTSTALIASID
となるため、以下のようにしてLexボットのARNを示しています。
IntegrationArn: !Sub arn:aws:lex:${AWS::Region}:${AWS::AccountId}:bot-alias/${MyLexBot}/TSTALIASID
エイリアスを自作する場合、以下のように設定します。
MyLexBotAlias:
Type: AWS::Lex::BotAlias
Properties:
BotAliasName: dev
~中略~
ConnectLexAssociation:
Type: AWS::Connect::IntegrationAssociation
Properties:
InstanceId: !Ref ConnectInstanceARN
IntegrationType: LEX_BOT
IntegrationArn: !GetAtt MyLexBotAlias.Arn
このテンプレートを使用してCloudFormationスタックを作成します。
スタック作成時、パラメータとしてConnectインスタンスのARNを入力します。
スタックの作成が完了すると、以下のように、新しく作成されたLexボット(test-lex
)とLambda関数(test-lambda
)がConnectインスタンスに正しく関連付けられていることを確認できます。
AWS CLIで関連付ける
次に、AWS CLIを使用した関連付け方法を説明します。
この例では、AWS CloudShellを使用してコマンドを実行します。ローカル環境でAWS CLIが設定されている場合は、直接そちらを使用することも可能です。
Lambda関数の場合、関連付けコマンドは以下の通りです。Connect インスタンスとLambda関数のARNを指定します。
$ aws connect associate-lambda-function \
--instance-id <value> \
--function-arn <value>
// コマンド例
$ aws connect associate-lambda-function \
--instance-id arn:aws:connect:ap-northeast-1:123456789012:instance/xxx-xxxx-xxx-xxx \
--function-arn arn:aws:lambda:ap-northeast-1:123456789012:function:test-lambda
Lexボットの関連付けには以下のコマンドを使用します。なお、Lexのバージョンによってコマンドが異なるため注意が必要です。
以下は、Lex V2用のコマンドです。Connect インスタンスとLexボットのエイリアスのARNを指定します。
$ aws connect associate-bot \
--instance-id <value> \
--lex-v2-bot <value>
// コマンド例 (エイリアスIDは、ABCDEFGHIJ)
$ aws connect associate-bot \
--instance-id arn:aws:connect:ap-northeast-1:123456789012:instance/xxx-xxxx-xxx-xxx \
--lex-v2-bot AliasArn=arn:aws:lex:ap-northeast-1:123456789012:bot-alias/ABCDEFGHIJ/TSTALIASID
エイリアス名が「TestBotAlias」の場合、対応するエイリアスIDは常に「TSTALIASID」となります。これはAmazon Lexの仕様によるものです。
最後に
本記事では、Amazon Connectインスタンスに対するLexボットやLambda関数の関連付けを、CloudFormationやAWS CLIを使用して自動化する方法を紹介しました。
Lexボットの関連付けは、v1とv2で異なりますので、注意が必要です。
参考になれば幸いです。
参考