概要
- Amazon Connectにあるオペレーション時間では休日判断等ができないためLambda(ラムダ)を利用して休日を判断できるようにします。
- 基本の考え方等は『[Amazon Connect] オペレーション時間の設定ファイルをS3に置くだけで制御する』をもとにしています。
使用ユーザー
- IAMユーザー
手順
営業時間テキストファイルの作成とバケットへのアップロード
- 営業時間と祝日を登録したテキストファイル(以下、operation-time.txt)を用意します。
月,09:00,17:00
火,09:00,17:00
水,09:00,17:00
木,09:00,18:00
金,09:00,17:00
1/1 #元旦
1/2 #銀行休業日
1/3 #銀行休業日
1/14 #成人の日
2/11 #建国記念日
2/23 #天皇誕生日
3/21 #春分の日
4/29 #昭和の日
5/3 #憲法記念日
5/4 #みどりの日
5/5 #こどもの日
5/6 #振替休日
7/15 #海の日
8/12 #山の日
9/16 #敬老の日(9月第三月曜日)
9/23 #秋分の日
10/14 #体育の日
11/3 #文化の日
11/4 #振替休日
11/23 #勤労感謝の日
-
AWSにサインインします。
- アカウント、ユーザー名、パスワードを入力してサインインします。
アカウント内(IAM)で作成したユーザーを使用してコンソールにサインインする
- アカウント、ユーザー名、パスワードを入力してサインインします。
-
『AWSマネジメントコンソール』画面にある「サービスを検索」にS3と入力し、検索結果から《S3》をクリックし、Amazon S3 コンソール(https://console.aws.amazon.com/s3/)を開きます。
-
「バケット作成」画面が表示されるので、以下の項目を選択、入力して《次へ》をクリックします。
- バケット名:世界中で一意になる名前を付ける
- リージョン:作成するを選択します。
-
- 今回はデフォルトのまま
-
- 今回はデフォルトのまま
-
- フォルダ名:フォルダの名前
- バケット名:my-baseXXXXXXXXX
- 暗号化:適宜必要な暗号化設定を選択
- フォルダ名:フォルダの名前
-
「アップロード」画面が表示されるので、ドラッグ&ドロップまたは、《ファイルを追加》ボタンを押してoperation-time.txtをアップロードします。
-
- 今回はデフォルトのまま
-
ストレージクラスの設定を確認して、《次へ》をクリックします。
- 今回はデフォルトのまま
営業時間判定用のLambda作成とテスト
Lambdaの作成
- 今回作成したLambdaのコードは以下の通りで、クラスメソッドさんのコードとは以下の部分を変えています。
- バケット直下ではなくフォルダにあるファイルを読み込む。
- 読み込むテキストファイルの名前はConnect側(問い合わせフロー)から受け取る。
- 営業時間が複数パターン有った場合に対応するため
- コメント削除及び、余分な空白削除が動作しなかったので修正
- 営業時間判定を9:00 ~ 17:00とした場合に17:00が営業時間だったのを営業時間外とした。
- 以下のコードで各自で変える部分
- bucket変数、key変数に指定する値
// AWSのSDKを使う宣言
const aws_sdk = require('aws-sdk');
// S3を使う宣言
const s3 = new aws_sdk.S3();
const bucket = 'my-baseXXXXXXXXX';
// フォルダが階層の場合は"/"で連結 例:folder1/folder2/folder3/
// 最後は"/"で終了する
const key = 'my-operationXXXXXXX/';
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;
}
-
AWSにサインインします。
- アカウント、ユーザー名、パスワードを入力してサインインします。
アカウント内(IAM)で作成したユーザーを使用してコンソールにサインインする
- アカウント、ユーザー名、パスワードを入力してサインインします。
-
『AWSマネジメントコンソール』画面にある「サービスを検索」にLambdaと入力し、検索結果から《Lambda》をクリックし、Amazon Connect コンソール(https://console.aws.amazon.com/lambda/)を開きます。
-
「関数コード」に初期で登録されているコードを削除して、上記operation-time-judgmentをコピー&ペーストします。
-
日本時間に対応させるため、画面を下にスクロールして「環境変数」に以下の値を入力し《保存》ボタンをクリックします。
- キー:TZ、値:Asia/Tokyo
-
LambdaにS3へのアクセス権を設定するため下にスクロールして「実行ロール」を表示し、《XXXXXXXXロールを表示》をクリックします。
- Lambdaを作成する毎に自動的にLambda名の付いたロールが一つ作成されます。
- Lambdaで利用しているAPIのアクセス権を付与します。
- 今回は、営業時間を判断するためS3に保存したoperation-time-judgmentテキストをLambdaから読み取る権限を付与します。
-
ビジュアルエディタが表示されるので《さらにアクセス許可を追加する》をクリックします。
- Lambdaの実行ログを記録するため、デフォルトでCloudWatch Logsの権限が付与されます。
-
- Bucket name:operation-time-judgmentテキストが保存されているS3のバケット名+フォルダ名(バケット名とフォルダ名やフォルダ名とフォルダ名の間は『/』で連結する)
- Bucket name:my-baseXXXXXXXXX/my-operationXXXXXXX
- Object name:すべてにチェックを付ける(テキストボックスには*が入力される)
- Bucket name:operation-time-judgmentテキストが保存されているS3のバケット名+フォルダ名(バケット名とフォルダ名やフォルダ名とフォルダ名の間は『/』で連結する)
Lambdaのテスト
-
「テストイベントの設定」画面が表示されるので、以下の項目を選択、入力します。
- イベントテンプレート:Amazon Connect Contact Flow
- イベント名:OperationTimeJudgment
-
テストで使用するパラメータに今回Amazon Connectから渡す値を追加して《作成》をクリックします。
- パラメータ:"objectName": "operation-time.txt"
-
CloudWatchの画面が表示されるので、「最終のイベント時刻」から見たいログを判断して「ログストリーム」をクリックします。
-
ログが表示されます。さらに詳細を見たい場合は各行をクリックします。
- INFO:関数内に
console.log(JSON.stringify(event))
(Nodeの場合)を入れる事によりその時点のevent変数をログに書き出します。 - ERROR:実行時にエラーになったログが出力されます。
- INFO:関数内に
Amazon Connect問い合わせフローに営業時間判定を追加
-
AWSにサインインします。
- アカウント、ユーザー名、パスワードを入力してサインインします。
アカウント内(IAM)で作成したユーザーを使用してコンソールにサインインする
- アカウント、ユーザー名、パスワードを入力してサインインします。
-
『AWSマネジメントコンソール』画面にある「サービスを検索」にConnectと入力し、検索結果から《Amazon Connect》をクリックし、Amazon Connect コンソール(https://console.aws.amazon.com/connect/)を開きます。
-
お客様の選択による分岐と外線転送で作成した問い合わせフローをクリックします。
-
《顧客の入力を取得する》から《キューの設定》に出ている矢印にカーソルを合わせて『×』ボタンをクリックして矢印を消し、後ろのフローを右にずらします
-
左側メニューの「統合」から《AWS Lambda関数を呼び出す》をフロー部分にドラッグ&ドロップし、オブジェクト同志を矢印で接続後に《AWS Lambda関数を呼び出す》のタイトル部分をクリックします。
-
右側に「AWS Lambda 関数を呼び出す」画面が表示されるので、以下の項目を選択して《パラメータを追加する》をクリックします。
- 関数を選択する:作成したLambda
-
- 宛先キー:objectName(Lambda側で値を受け取る変数名)
- 値:operation-time.txt(S3に保存されているオブジェクト名)
- タイムアウト:5
-
左側メニューの「ブランチ」から《問い合わせ属性を確認する》をフロー部分にドラッグ&ドロップし、オブジェクト同志を矢印で接続後に《問い合わせ属性を確認する》のタイトル部分をクリックします。
-
右側に「問い合わせ属性を確認する」画面が表示されるので、以下の項目を選択、入力して《別の条件の追加》をクリックします。
- タイプ:外部(Lambdaからの引数)
- 属性:IsOperationTime(Lambdaでの処理結果を返す変数名)
-
- 条件:等しい、true(分岐の条件を指定する)
-
左側メニューの「操作」から《プロンプトの再生》をフロー部分にドラッグ&ドロップし、オブジェクト同志を矢印で接続後に《プロンプトの再生》のタイトル部分をクリックします。
-
右側に「プロンプトの再生」画面が表示されるので、以下の項目を選択、入力して《Save》をクリックします。
- テキスト読み上げまたはチャットテキスト:選択します。
- テキストの入力:選択し、音声案内する文言を入力します。
参考サイト
- [Amazon Connect] オペレーション時間の設定ファイルをS3に置くだけで制御する
- [Amazon Connect] 超便利 Lambdaへのパーミッション追加がGUIからできるようになった(新機能)