Amazon Lexボットのコールドスタート対策として、EventBridge Schedulerを定期実行する

Amazon Lexボットのコールドスタート対策として、EventBridge Schedulerを定期実行する

Clock Icon2024.12.16

はじめに

Amazon Lexでは、AWS Lambdaのコールドスタートと同様に、ボットへのリクエストが一定時間行われない場合、その後の最初のリクエストで応答に時間がかかることがあります。

Lambdaのコールドスタートとは、関数が呼び出されてから実行環境が準備され、処理が開始されるまでに発生する遅延時間を指します。

本記事では、Amazon Lexボットで発生するこの現象を、Lambdaの類似概念になぞらえ、便宜的に「コールドスタート」と呼びます。

また、ドラフトバージョンと番号付きバージョンのボットでは、リクエストの間隔によって応答時間が異なります。

  • ドラフトバージョン(エイリアス名:TestBotAlias)のボットでは、1時間以上リクエストがない場合、コールドスタートが発生する
  • 番号付きバージョンのボットでは、24時間以上リクエストがない場合、コールドスタートが発生する

検証内容の詳細については、以下の記事をご参照ください。

https://dev.classmethod.jp/articles/amazon-lex-cold-start-response-delay/

今回は、定期的に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"
        }
    ]
}

cm-hirai-screenshot 2024-12-10 17.19.58

EventBridge Scheduler作成

ターゲットのエイリアスがTestBotAlias(TSTALIASID)の場合、1時間に1回起動します。

0 * * * ? *

cm-hirai-screenshot 2024-12-10 17.16.53

エイリアスがTestBotAliasではない場合、24時間に1回起動します。
以下は、毎日午前3時に実行するcron式です。

cron
0 3 * * ? *

今回は、ターゲットのエイリアスがTestBotAliasのため、1時間に一回起動させます。
cm-hirai-screenshot 2024-12-10 17.12.51

TextSessionIdの値は任意の値で構いません。

{
  "BotAliasId": "TSTALIASID",
  "BotId": "OMRBM5O69M",
  "LocaleId": "ja_JP",
  "SessionId": "lex-bot-warm-up",
  "Text": "lex-bot-warm-up"
}

https://docs.aws.amazon.com/ja_jp/lexv2/latest/APIReference/API_runtime_RecognizeText.html

先程作成したIAMロールを選択し、スケジューラ作成を作成します。LexのRecognizeTextをターゲットAPIにする場合、IAMロールの自動作成は選択できませんでした。
cm-hirai-screenshot 2024-12-10 17.23.36

確認する

スケジューラを作成し定期的に実行した結果、Lexボットに遅延時間は見られませんでした。

CloudWatch Logsにも出力されていることを確認しました。

テキストログ(CloudWatch Logs)を有効化すると、ログストリーム名は以下の形式で保存されます。

  • ログストリーム名:aws/lex/<LexボットID>/<エイリアスID>/<バージョン名>/<言語>/<ランダム文字列>
  • 今回のログストリーム名:aws/lex/OMRBM5O69M/TSTALIASID/DRAFT/ja_JP/84896df416e76edcda082ec7776183a2

1時間ごとに起動した場合、セッションIDが同一であるため、同じログストリーム内に1時間ごとにログイベントが出力されていました。

cm-hirai-screenshot 2024-12-12 14.27.22

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.