AmazonConnect 営業時間判断をlambdaでやってみた
目次
はじめに
はじめまして。スカイアーチHRソリューションズのHashimotoです。
この記事はAmazon Connect Advent Calendar 2023の21日目の記事です。
ギークフィードさん、クラスメソッドさん、スカイアーチHRソリューションズの有志によるカレンダーとなっております。
AmazonConnectの営業時間判断
AmazonConnectの標準機能「オペレーション時間を追加」で曜日の営業時間は設定できますが、祝日の設定ができないです。
AmazonConnectを構築していくうえで、祝日設定を自動化できるかが課題になったので、lambdaで営業時間を判定し、自動的に祝日もお休みできるようにしたいと思います。
イメージ
大まかな流れ
①AmazonConnectを作成する(割愛)
②S3バケットを作成し、テキストをアップロードする
③lambdaを作成する(APIアクセス権付与割愛)
④AmazonConnectフロー図を作成する
⑤AmazonConnectとlambda紐づける
手順
①営業時間と祝日を登録したテキストファイル(以下、holiday-determination.txt)を用意します。
※2023年祝日
月,09:00,18:00
火,09:00,18:00
水,09:00,19:00
木,09:00,18:00
金,09:00,18:00
1/1 #元旦
1/14 #成人の日
2/11 #建国記念日
2/23 #天皇誕生日
3/20 #春分の日
4/29 #昭和の日
5/3 #憲法記念日
5/4 #みどりの日
5/5 #こどもの日
5/6 #振替休日
7/15 #海の日
8/11 #山の日
9/18 #敬老の日(9月第三月曜日)
9/22 #秋分の日
10/14 #体育の日
11/3 #文化の日
11/23 #勤労感謝の日
② S3バケットを作成し、上記の営業時間を入力したテキストをアップロードする。
③lambda作成する
// AWSのSDKを使う宣言
const aws_sdk = require('aws-sdk');
// S3を使う宣言
const s3 = new aws_sdk.S3();
const bucket = 'amazonconnect-holidayxxxxxxxxxxxx';
// フォルダが階層の場合は"/"で連結 例:folder1/folder2/folder3/
// 最後は"/"で終了する
const key = 'amazonconnect-holidayXXXXXXX/';
exports.handler = async function(event, context) {
console.log(JSON.stringify(event))
// オペレーション時間の取得
// objectNameはAmazon Connectで指定した値を受け取ります。
// 拡張子も含めて指定 例:operation-time.txt
// s3にGetObject関数でアクセスするのでこの権限をLambdaに付与する必要がある。
const data = await s3.getObject({Bucket: bucket,Key: key + event.Details.Parameters.objectName}).promise();
const operationTime = data.Body.toString();
var lines = operationTime.split('\n');
// コメント削除及び、余分な空白削除
lines = lines.map( line => {
return line.replace(/#[\s\S]*$/g, '').replace(/\s+$/g, '');
});
// 無効(空白)行の削除
lines = lines.filter( line => {
return line != '';
});
// 時間内かどうかのチェック
const IsOperationTime = CheckInTime(lines);
return { IsOperationTime: IsOperationTime };
}
function CheckInTime(lines) {
// 現在時間
const now = new Date();
const month = now.getMonth() + 1;
const day = now.getDate();
const week = now.getDay();
const hour = now.getHours();
const miniute = now.getMinutes();
var weekdays = ["日", "月", "火", "水", "木", "金", "土"];
// 曜日指定の抽出
const weeks = lines.filter(line => {
return 0 < weekdays.indexOf(line.split(',')[0]);
});
// 祝日指定の抽出
const holidays = lines.filter(line => {
return line.split(',')[0].split('/').length == 2;
});
// 曜日チェック
let flg = false; // デフォルトで時間外(設定がない場合時間外となるため)
weeks.forEach( line => {
const tmp = line.split(',');
const w = weekdays.indexOf(tmp[0]);
if(week == w) { // 当該曜日の設定
// 始業時間以降かどうかのチェック
let t = tmp[1].split(':');
if(t.length == 2) {
if( Number(t[0]) * 60 + Number(t[1]) <= (hour * 60 + miniute )){
// 終業時間前かどうかのチェック
t = tmp[2].split(':');
if(t.length == 2) {
if((hour * 60 + miniute ) < (Number(t[0]) * 60 + Number(t[1]))){
flg = true;
}
}
}
}
}
});
// 曜日指定で時間外の場合は、祝日に関係なく時間外となる
if(!flg){
return false;
}
// 祝日のチェック
flg = true; // デフォルトで時間内(設定がない場合時間内となるため)
holidays.forEach( line => {
const tmp = line.split(',');
const date = tmp[0].split('/');
if(date.length == 2){
if(month == date[0] && day == date[1]){
flg = false;
}
}
})
return flg;
}
④lambda 時間設定をする
時間処理を設定しないと、営業時間判断が日本時間で処理されないです。
キー:TZ、値:Asia/Tokyo
⑤フロー図を作成する。
⑥AmazonConnectインスタンス「問い合わせフロー」で先ほど作ったlambda関数を追加します
⑦フロー図の「AWSLamda呼び出す」ブロック→「関数のARN」先ほどAmazonConnectインスタンスに追加したlambdaを選択します。
さいごに
Lambdaで営業時間判断を作成してみました。AmazonConnectとlambdaを紐づけるのは割と簡単にできました。
コールセンターでは祝日設定で必須だと思うので、祝日設定もAmazonConnectの標準機能になってほしいです。
lambda以外にも祝日判定できる方法(カレンダーを利用する)があるそうなので次はそれを試してみたいと思います。これからもAmazon Connectについて勉強を頑張りたいです。