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 の引数がない可能性があります。
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 はやはり少し古いようですね。
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
作成した関数を選択。
5.Connect 問い合わせフローから Lambda を利用して分岐
上記画像のように、ブロックを追加します。(真ん中のプロンプトはどこの分岐まで作動しているか確認のために入れています)
- [AWS Lambda 関数を呼び出す]ブロックを追加
- [関数を選択する]を選択
- 作成した関数を選択
インスタンスのコンソール?ホーム?で追加した Lambda 関数を呼び出して、その戻り値(属性)を利用してフローを分岐させます。
- [問い合わせ属性を確認する]ブロックを追加
- [タイプ]:外部
- [属性]:statusCode
- [チェックする条件]:
- 等しい OPEN
- 等しい CLOSED
これ、微妙にハマったのですが、休日(イベントが存在する時間帯)の戻り値は CLOSED です。
これで無事にコールセンターの休業日には特別なプロンプトを流すようなフローが構築できるようになりました。ま、、そのうち標準機能として Connect に実装されそうですけどね。