Amazon Connect の祝日判定を Lambda 経由で Systems Manager のカレンダーに問い合わせる

Amazon Connect の営業日・定休日判定について、現時点での Connect の標準機能では、曜日と時間によるコントロールしか実施できないため、コールフロー上から AWS Lambda を呼び出し、AWS Systems Manager の カレンダー機能を確認しに行く部分を実装してみました。

初めて触りました。便利。かなりつまずきましたが、、

1.Lambda 関数作成

公式ドキュメントを参考に実装してみました。
参考:SSM — Boto 3 Docs 1.11.15 documentation

import json
import boto3

def lambda_handler(event, context):
    client = boto3.client('ssm')
        
    response = client.get_calendar_state(
        CalendarNames=[
            '**ARN**',
        ]
    )

    State = response["State"]

    return {
        'statusCode': State
    }

と Python で記述、テストコードには公式を参考に以下を記述。(今回の目的にはあまり関係がなさそうですが、一応。)
参考:Lambda 関数を呼び出す – Amazon Connect

{
  "Details": {
    "ContactData": {
      "Attributes": {},
      "Channel": "VOICE",
      "ContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX",
      "CustomerEndpoint": {
        "Address": "+1234567890",
        "Type": "TELEPHONE_NUMBER"
      },
      "InitialContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXXX",
      "InitiationMethod": "INBOUND | OUTBOUND | TRANSFER | CALLBACK",
      "InstanceARN": "arn:aws:connect:aws-region:1234567890:instance/c8c0e68d-2200-4265-82c0-XXXXXXXXXX",
      "PreviousContactId": "4a573372-1f28-4e26-b97b-XXXXXXXXXX",
      "Queue": "QueueName",
      "SystemEndpoint": {
        "Address": "+1234567890",
        "Type": "TELEPHONE_NUMBER"
      }
    },
    "Parameters": {
      "sentAttributeKey": "sentAttributeValue"
    }
  },
  "Name": "ContactFlowEvent"
}

これでテストを実行したところ、“実行結果: 失敗”となりました。ログの一部に下記記載。

  "errorMessage": "'SSM' object has no attribute 'get_calendar_state'",
  "errorType": "AttributeError",

公式ドキュメントに記載がありますが、get_calendar_state が無いってどういうことでしょうか。。

検索してみると、公式にドンピシャなナレッジが。

これらのエラーは、Python 向けの Lambda ランタイムのひとつを使用するように Lambda 関数が設定されており、関数が新しい AWS サービスまたは最新バージョンの AWS API を呼び出そうとする場合に発生することがあります。Lambda の実行環境で提供されている AWS SDK for Python (Boto 3) のバージョンは最新バージョンではありません。これには、一部の AWS サービスおよび API の引数がない可能性があります。

Python (Boto 3) Lambda 関数のランタイムエラーをトラブルシューティングする

Lambda の実行環境で提供されている AWS SDK for Python (Boto 3) のバージョンは最新バージョンではありません。ということなんですね。

(略)

def lambda_handler(event, context):
    print(boto3.__version__)

(略)

としてみると、1.10.34とログに。公式のドキュメントを見ると、SSM — Boto 3 Docs 1.11.15 documentation と書いてある通り、Lambda 実行環境の SDK はやはり少し古いようですね。

実際に実装作業した日は最新が ver 1.11.9 でした。結構頻繁にアップデートされているんでしょうかねー

2.Layers 追加

公式ドキュメントを参考に最新の botocore をダウンロード、zip で固めて、アップロード。前回 AWS CLI をインストールしておいてよかった・・・
参考:AWS Systems Manager に AWS CLI からアクセスをするまでの長い道のり

3.実行ロールの設定

もうこれで大丈夫だろうと思ったのですが、Lambda を実行してみると、下記のようなエラーが・・

  "errorMessage": "An error occurred (AccessDeniedException) when calling the GetCalendarState operation: **略** is not authorized to perform: ssm:GetCalendarState on resource: **ARN**",
  "errorType": "ClientError",

実行権限が無さそうです。

IAM コンソールで

  • AmazonConnectReadOnlyAccess
  • AmazonSSMReadOnlyAccess

の2つのポリシーをアタッチしておきました。これで lambda を実行したところ

{
  "statusCode": "OPEN"
}

と返ってきました。良かった。(”statusCode”って名前は良くないですね。HTTP ステータスコードみたいで。)

4.Connect インスタンスの設定に Lambda 関数追加

作成した Lambda 関数を Connect でも利用できるように設定をします。

Amazon Connect > {POCインスタンス} > 問い合わせフロー > AWS Lambda

Connect 問合せフロー Lambda利用

作成した関数を選択。

5.Connect 問い合わせフローから Lambda を利用して分岐

Connect 問合せフロー Lambdaで休日判定

上記画像のように、ブロックを追加します。(真ん中のプロンプトはどこの分岐まで作動しているか確認のために入れています)

  1. [AWS Lambda 関数を呼び出す]ブロックを追加
  2. [関数を選択する]を選択
  3. 作成した関数を選択

インスタンスのコンソール?ホーム?で追加した Lambda 関数を呼び出して、その戻り値(属性)を利用してフローを分岐させます。

  1. [問い合わせ属性を確認する]ブロックを追加
  2. [タイプ]:外部
  3. [属性]:statusCode
  4. [チェックする条件]:
    • 等しい OPEN
    • 等しい CLOSED

Connect 問合せフロー Lambdaで休日判定

これ、微妙にハマったのですが、休日(イベントが存在する時間帯)の戻り値は CLOSED です。

これで無事にコールセンターの休業日には特別なプロンプトを流すようなフローが構築できるようになりました。ま、、そのうち標準機能として Connect に実装されそうですけどね。

コメントを残す

  • コメント欄には個人情報を入力しないようにしてください。

  • 入力いただいたメールアドレスは公開されませんがサーバーに保存されます。
  • 入力いただいた情報の他に、IPアドレスを取得させていただきます。取得した IPアドレス はスパム・荒らしコメント対処ために利用され、公開することはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください