この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
1 はじめに
AIソリューション部の平内(SIN)です。
Amazon Connect(以下、Connect)では、オペレーション時間を設定し、営業時間内と時間外で処理を分けることが一般的に行われています。
参考:[Amazon Connect] 着信した時間によって処理を分岐する 〜営業時間外は、丁重にお断りして電話を切る感じ〜
しかし、このオペレーション期間は、曜日と時間しか設定できないため、祝日などに対応するには、別に仕組みを用意する必要あります。
参考:[Amazon Connect] 着信した時間によって処理を分岐する 〜日本の祝祭日は、お休みとする〜
会社の営業日は、必ず祝日と一致するとは限らないし、もっと手軽に運用できるようにと考え、今回は、このオペレーション時間と同じ意味となる設定ファイルをS3に置いて、運用できる仕組みを簡単に作ってみました。
S3上の設定ファイルを編集して上書きすることで、簡単に営業時間が変更できる感じです。
2 設定ファイル
設定ファイルは、エンジニア以外でも編集しやすいようにと考え、あえてJSONを避けてみました。
設定要領は、曜日ごとの営業時間及び、休日の2種類あります。
(1) 曜日ごとの営業時間
カンマ区切りで下記のとおり
曜日,始業時間,就業時間
(2) 休日
1行に1件で設定
月/日
なお、空行や、#以降(コメント)は、無視されます。
OperationTime.txt
月,09:00,19:00
火,09:00,19:00
水,09:00,19:00
木,09:00,19:00
金,09:00,19:00
1/13 # 会社の創立記念日
1/1 #元旦
1/8 #成人の日
# 2/11 #建国記念日
2/12 #建国記念日(振替)
3/21 #春分の日
# 4/29 #昭和の日
4/30 #昭和の日(振替)
5/3 #憲法記念日
5/4 #みどりの日
5/5 #こどもの日
7/16 #海の日
8/11 #山の日
9/17 #敬老の日(9月第三月曜日)
# 9/23 #秋分の日
9/24 #秋分の日(振替)
10/8 #体育の日
11/3 #文化の日
11/23 #勤労感謝の日
# 12/23 #天皇誕生日
12/24 #天皇誕生日(振替)
このような設定ファイルをS3のバケットに配置します。
3 コンタクトフロー
テスト用に簡単なフローを用意しました。Lambdaを呼び出して、その戻り値で分岐しているだけです。
Lambdaの戻り値は、inTimeというキーがtrueがどうかを見ています。
4 Lambda
作成したLambdaのコードは以下のとおりです。設定ファイル(OperationTime.txt)をS3からgetして、設定内容から現在時が、営業時間内か外かを返します。
※ 2024/02/08 AWS SDK v3で動作するように修正しました
index.mjs
import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3";
const bucket = 'devio-blog';
const key = 'OperationTime.txt';
export const handler = async (event) => {
console.log(JSON.stringify(event));
const client = new S3Client({});
// オペレーション時間の取得
const data = await client.send(new GetObjectCommand({
Bucket: bucket,
Key: key
}));
const operationTime = await data.Body.transformToString('utf-8');
// const data = await s3.getObject({Bucket: bucket,Key: key}).promise();
// const operationTime = data.Body.toString();
var lines = operationTime.split('\n');
// コメント削除及び、余分な空白削除
lines = lines.map( line => {
return line.replace(/#.*$/, '').replace(/\s+$/, '');
});
// 無効(空白)行の削除
lines = lines.filter( line => {
return line != '';
});
// 時間内かどうかのチェック
const inTime = CheckInTime(lines);
return { inTime: inTime };
}
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;
}
時間の処理なので、タイムゾーンの設定をAsia/Tokyoにすることを忘れないでください。
5 最後に
今回は、オペレーション時間の設定を独自の設定ファイルで自由に変更できるようにしてみました。
Connectのオペレーション時間の設定には、曜日と時間しか無いため、このような何らかの処置は、運用上必須かも知れません。
弊社では、「Amazon Connect」の導入を検討している方を対象とした無料相談会を毎週開催中です。
また、音声を利用した各種ソリューションの導入支援を行っております。お気軽にお問い合わせください。