0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon Lex V2 をCloudFormationで構築する実践ガイド

Posted at

Amazon Lex V2は、会話型インターフェースを構築するためのAWSのマネージドサービスです。本記事では、CloudFormationを使用してLex V2ボットを構築する方法を詳しく解説します。

目次

  1. はじめに
  2. アーキテクチャ概要
  3. 実装手順
  4. Lambda統合
  5. イベントの処理
  6. まとめ

1. はじめに

Amazon Lex V2のボットをCloudFormationで構築することで、以下のメリットが得られます:

  • インフラのコード化(IaC)による再現性の確保
  • 環境間の一貫性維持
  • デプロイメントの自動化
  • バージョン管理の容易さ

2. アーキテクチャ概要

基本的なLex V2ボットの構成要素は以下の通りです:

  • Bot本体(AWS::Lex::Bot)
  • ボットバージョン(AWS::Lex::BotVersion)
  • ボットエイリアス(AWS::Lex::BotAlias)
  • IAMロール
  • Lambda関数(オプション)

3. 実装手順

3.1 IAMロールの設定

まず、Lex V2ボットが使用するIAMロールを作成します:

LexServiceRole:
  Type: 'AWS::IAM::Role'
  Properties:
    AssumeRolePolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Effect: Allow
          Principal:
            Service: lexv2.amazonaws.com
          Action: sts:AssumeRole
    Policies:
      - PolicyName: LexV2BasicPermissions
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Action:
                - polly:SynthesizeSpeech
                - comprehend:DetectSentiment
                - lambda:InvokeFunction
              Resource: '*'

3.2 ボットの定義

次に、ボット本体を定義します:

SimpleChatBot:
  Type: 'AWS::Lex::Bot'
  Properties:
    Name: SimpleChatBot
    Description: 'A simple chatbot created with CloudFormation'
    RoleArn: !GetAtt LexServiceRole.Arn
    DataPrivacy:
      ChildDirected: false
    IdleSessionTTLInSeconds: 300
    AutoBuildBotLocales: true
    BotLocales:
      - LocaleId: ja_JP
        NluConfidenceThreshold: 0.40
        VoiceSettings:
          VoiceId: Mizuki
        Intents:
          - Name: HelloIntent
            SampleUtterances:
              - Utterance: こんにちは
              - Utterance: はじめまして

3.3 バージョンとエイリアスの設定

ボットのバージョンとエイリアスを設定します:

BotVersion:
  Type: 'AWS::Lex::BotVersion'
  DependsOn: SimpleChatBot
  Properties:
    BotId: !Ref SimpleChatBot
    BotVersionLocaleSpecification:
      - LocaleId: ja_JP
        BotVersionLocaleDetails:
          SourceBotVersion: DRAFT

BotAlias:
  Type: 'AWS::Lex::BotAlias'
  DependsOn: BotVersion
  Properties:
    BotAliasName: prod
    BotId: !Ref SimpleChatBot
    BotVersion: '1'

4. Lambda統合

Lambdaと統合する場合は、以下の設定が必要です:

4.1 Lambda実行ロール

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

4.2 Lambda関数の定義

HelloWorldFunction:
  Type: 'AWS::Lambda::Function'
  Properties:
    Handler: index.lambda_handler
    Role: !GetAtt LambdaExecutionRole.Arn
    Code:
      ZipFile: |
        def lambda_handler(event, context):
            return {
                'sessionState': {
                    'dialogAction': {
                        'type': 'Close'
                    },
                    'intent': {
                        'name': event['sessionState']['intent']['name'],
                        'state': 'Fulfilled'
                    }
                },
                'messages': [
                    {
                        'contentType': 'PlainText',
                        'content': 'Hello World!'
                    }
                ]
            }
    Runtime: python3.12

5. イベントの処理

Lex V2からLambdaに送信されるイベントを適切に処理するために、以下のようなPythonクラスを使用できます:

@dataclass
class IntentData:
    name: str
    state: str
    confirmation_state: str
    slots: Dict
    nlu_confidence: Optional[float] = None
    interpretation_source: Optional[str] = None

class LexResponseProcessor:
    def __init__(self, response_dict: Dict):
        self.session_id = response_dict["sessionId"]
        self.input_transcript = response_dict["inputTranscript"]
        self.interpretations = self._process_interpretations(response_dict["interpretations"])
        
    def get_highest_confidence_intent(self) -> Optional[IntentData]:
        if not self.interpretations:
            return None
        
        return max(
            self.interpretations,
            key=lambda x: x.nlu_confidence if x.nlu_confidence is not None else -1
        )

このクラスを使用することで、以下のような処理が容易になります:

  • インテントの解釈
  • 最高信頼度のインテントの取得
  • セッション状態の管理
  • フルフィルメントの判定

6. まとめ

CloudFormationを使用してLex V2ボットを構築することで、以下の利点が得られます:

  • インフラストラクチャのバージョン管理
  • 環境間の一貫性維持
  • デプロイメントの自動化
  • コード化による再利用性の向上

また、Lambda関数との統合により、より複雑な対話フローの実装が可能になります。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?