Amazon Lexボットのコールドスタート対策として、EventBridge Schedulerを定期実行する
はじめに
Amazon Lexでは、AWS Lambdaのコールドスタートと同様に、ボットへのリクエストが一定時間行われない場合、その後の最初のリクエストで応答に時間がかかることがあります。
Lambdaのコールドスタートとは、関数が呼び出されてから実行環境が準備され、処理が開始されるまでに発生する遅延時間を指します。
本記事では、Amazon Lexボットで発生するこの現象を、Lambdaの類似概念になぞらえ、便宜的に「コールドスタート」と呼びます。
また、ドラフトバージョンと番号付きバージョンのボットでは、リクエストの間隔によって応答時間が異なります。
- ドラフトバージョン(エイリアス名:TestBotAlias)のボットでは、1時間以上リクエストがない場合、コールドスタートが発生する
- 番号付きバージョンのボットでは、24時間以上リクエストがない場合、コールドスタートが発生する
検証内容の詳細については、以下の記事をご参照ください。
今回は、定期的にAmazon EventBridge Schedulerを実行することでAmazon Lexボットのコールドスタート対策をします。
IAMロール作成
EventBridge Schedulerで使用するIAMロールを作成します。
まず、以下の権限でIAMポリシーを作成します。
アカウントIDは各自の環境に合わせて変更してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lex:RecognizeText",
"Resource": "arn:aws:lex:ap-northeast-1:アカウントID:bot-alias/*/*"
}
]
}
IAMロールは、EventBridge Schedulerを信頼ポリシーとし、上記のIAMポリシーを適用して作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EventBridge Scheduler作成
ターゲットのエイリアスがTestBotAlias
(TSTALIASID)の場合、1時間に1回起動します。
0 * * * ? *
エイリアスがTestBotAlias
ではない場合、24時間に1回起動します。
以下は、毎日午前3時に実行するcron式です。
0 3 * * ? *
今回は、ターゲットのエイリアスがTestBotAlias
のため、1時間に一回起動させます。
Text
とSessionId
の値は任意の値で構いません。
{
"BotAliasId": "TSTALIASID",
"BotId": "OMRBM5O69M",
"LocaleId": "ja_JP",
"SessionId": "lex-bot-warm-up",
"Text": "lex-bot-warm-up"
}
先程作成したIAMロールを選択し、スケジューラ作成を作成します。LexのRecognizeTextをターゲットAPIにする場合、IAMロールの自動作成は選択できませんでした。
確認する
スケジューラを作成し定期的に実行した結果、Lexボットに遅延時間は見られませんでした。
CloudWatch Logsにも出力されていることを確認しました。
テキストログ(CloudWatch Logs)を有効化すると、ログストリーム名は以下の形式で保存されます。
- ログストリーム名:aws/lex/<LexボットID>/<エイリアスID>/<バージョン名>/<言語>/<ランダム文字列>
- 今回のログストリーム名:aws/lex/OMRBM5O69M/TSTALIASID/DRAFT/ja_JP/84896df416e76edcda082ec7776183a2
1時間ごとに起動した場合、セッションIDが同一であるため、同じログストリーム内に1時間ごとにログイベントが出力されていました。