Amazon Connectに、LexボットとLambda関数をCloudFormationや AWS CLIで関連付けしてみた

Amazon Connectに、LexボットとLambda関数をCloudFormationや AWS CLIで関連付けしてみた

Clock Icon2024.09.04

はじめに

本記事では、Amazon Connectインスタンスに、Amazon LexボットやAWS Lambda関数をAWS CloudFormationおよびAWS CLIを使って関連付ける方法を解説します。

Amazon Connectのフロー内でLexボットやLambda関数を呼び出すには、Connectインスタンスにそれぞれ関連付けが必要です。

手動で関連付けを行う場合、AWSマネジメントコンソールのConnectインスタンスページから設定可能ですが、本記事ではCloudFormationやCLIを使用した方法を紹介します。

cm-hirai-screenshot 2024-09-02 16.06.29
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を入力します。

cm-hirai-screenshot 2024-09-02 16.10.15

スタックの作成が完了すると、以下のように、新しく作成されたLexボット(test-lex)とLambda関数(test-lambda)がConnectインスタンスに正しく関連付けられていることを確認できます。

cm-hirai-screenshot 2024-09-02 16.18.52
cm-hirai-screenshot 2024-09-02 16.18.30

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-connect-integrationassociation.html

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の仕様によるものです。

https://docs.aws.amazon.com/cli/latest/reference/connect/associate-bot.html

https://docs.aws.amazon.com/cli/latest/reference/connect/associate-lambda-function.html

最後に

本記事では、Amazon Connectインスタンスに対するLexボットやLambda関数の関連付けを、CloudFormationやAWS CLIを使用して自動化する方法を紹介しました。

Lexボットの関連付けは、v1とv2で異なりますので、注意が必要です。

参考になれば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/guidelines.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.