AmazonConnect 営業時間判断をlambdaでやってみた

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について勉強を頑張りたいです。

参考記事

[Amazon Connect] オペレーション時間の設定ファイルをS3に置くだけで制御する

この記事をシェアする
著者:hashimoto
2023年5月入社。AWSについて日々勉強中。