Amazon Lex V2は、会話型インターフェースを構築するためのAWSのマネージドサービスです。本記事では、CloudFormationを使用してLex V2ボットを構築する方法を詳しく解説します。
目次
- はじめに
- アーキテクチャ概要
- 実装手順
- Lambda統合
- イベントの処理
- まとめ
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関数との統合により、より複雑な対話フローの実装が可能になります。