Help us understand the problem. What is going on with this article?

【クラウド初心者向け】営業時間の判断

概要

使用ユーザー

  • IAMユーザー

手順

営業時間テキストファイルの作成とバケットへのアップロード

  1. 営業時間と祝日を登録したテキストファイル(以下、operation-time.txt)を用意します。
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 #勤労感謝の日
  1. AWSにサインインします。

    1. アカウント、ユーザー名、パスワードを入力してサインインします。
      アカウント内(IAM)で作成したユーザーを使用してコンソールにサインインする
  2. 『AWSマネジメントコンソール』画面の右上にある《リージョン名》をクリックし、ドロップダウンます。
    image.png

  3. 『AWSマネジメントコンソール』画面にある「サービスを検索」にS3と入力し、検索結果から《S3》をクリックし、Amazon S3 コンソール(https://console.aws.amazon.com/s3/)を開きます。
    image.png

  4. S3のバケット一覧が表示されるので、《バケットを作成する》をクリックします。
    image.png

  5. 「バケット作成」画面が表示されるので、以下の項目を選択、入力して《次へ》をクリックします。
    image.png

    1. バケット名:世界中で一意になる名前を付ける
    2. リージョン:作成するを選択します。
  6. 適宜必要な設定を行い《次へ》をクリックします。
    image.png

    1. 今回はデフォルトのまま
  7. 適宜必要な設定を行い《次へ》をクリックします。
    image.png

    1. 今回はデフォルトのまま
  8. 設定内容を確認して《バケットを作成》をクリックします。
    image.png

  9. S3のバケット一覧が表示されるので、作成したバケットをクリックします。
    image.png

  10. 《フォルダの作成》をクリックします。
    image.png

  11. 以下の項目を選択、入力して《保存》をクリックします。
    image.png

    1. フォルダ名:フォルダの名前
      1. バケット名:my-baseXXXXXXXXX
    2. 暗号化:適宜必要な暗号化設定を選択
  12. 作成したフォルダをクリックします。
    image.png

  13. 《アップロード》をクリックします。
    image.png

  14. 「アップロード」画面が表示されるので、ドラッグ&ドロップまたは、《ファイルを追加》ボタンを押してoperation-time.txtをアップロードします。
    image.png

  15. 指定したファイルを確認して、《次へ》をクリックします。
    image.png

  16. アクセス許可の設定を確認して、《次へ》をクリックします。
    image.png

    1. 今回はデフォルトのまま
  17. ストレージクラスの設定を確認して、《次へ》をクリックします。
    image.png

    1. 今回はデフォルトのまま
  18. 設定を確認して、《アップロード》をクリックします。
    image.png

  19. ファイルがアップロードされました。
    image.png

営業時間判定用のLambda作成とテスト

Lambdaの作成

  • 今回作成したLambdaのコードは以下の通りで、クラスメソッドさんのコードとは以下の部分を変えています。
    • バケット直下ではなくフォルダにあるファイルを読み込む。
    • 読み込むテキストファイルの名前はConnect側(問い合わせフロー)から受け取る。
      • 営業時間が複数パターン有った場合に対応するため
    • コメント削除及び、余分な空白削除が動作しなかったので修正
    • 営業時間判定を9:00 ~ 17:00とした場合に17:00が営業時間だったのを営業時間外とした。
  • 以下のコードで各自で変える部分
    • bucket変数、key変数に指定する値
operation-time-judgment
// 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;
}

  1. AWSにサインインします。

    1. アカウント、ユーザー名、パスワードを入力してサインインします。
      アカウント内(IAM)で作成したユーザーを使用してコンソールにサインインする
  2. 『AWSマネジメントコンソール』画面の右上にある《リージョン名》をクリックし、ドロップダウンます。
    image.png

  3. 『AWSマネジメントコンソール』画面にある「サービスを検索」にLambdaと入力し、検索結果から《Lambda》をクリックし、Amazon Connect コンソール(https://console.aws.amazon.com/lambda/)を開きます。
    image.png

  4. Lambdaの関数一覧画面が表示されるので《関数の作成》をクリックします。
    image.png

  5. 「関数名」を入力して《関数の作成》をクリックします。
    image.png

  6. 関数のベースが作成されました。関数コードを入力するため下にスクロールして「関数コード」を表示します。
    image.png

  7. 「関数コード」に初期で登録されているコードを削除して、上記operation-time-judgmentをコピー&ペーストします。
    image.png

  8. 日本時間に対応させるため、画面を下にスクロールして「環境変数」に以下の値を入力し《保存》ボタンをクリックします。
    image.png

    1. キー:TZ、値:Asia/Tokyo
  9. LambdaにS3へのアクセス権を設定するため下にスクロールして「実行ロール」を表示し、《XXXXXXXXロールを表示》をクリックします。
    image.png

    1. Lambdaを作成する毎に自動的にLambda名の付いたロールが一つ作成されます。
    2. Lambdaで利用しているAPIのアクセス権を付与します。
      1. 今回は、営業時間を判断するためS3に保存したoperation-time-judgmentテキストをLambdaから読み取る権限を付与します。
  10. 選択したロールの概要が表示されるのでポリシー名の「▶」をクリックします。
    image.png

  11. 《ポリシーの編集》をクリックします。
    image.png

  12. ビジュアルエディタが表示されるので《さらにアクセス許可を追加する》をクリックします。
    image.png

    1. Lambdaの実行ログを記録するため、デフォルトでCloudWatch Logsの権限が付与されます。
  13. 《サービスの選択》をクリックします。
    image.png

  14. 「サービス」にS3と入力し、検索結果から《S3》をクリックします。
    image.png

  15. 「アクション」に今回利用するGetObjectを入力し、《GetObject》をクリックし、選択状態にします。
    image.png

  16. 《リソース》をクリックします。
    image.png

  17. 《ARNの追加》をクリックします。
    image.png

  18. 以下の項目を選択、入力して《追加》をクリックします。
    image.png

    1. Bucket name:operation-time-judgmentテキストが保存されているS3のバケット名+フォルダ名(バケット名とフォルダ名やフォルダ名とフォルダ名の間は『/』で連結する)
      1. Bucket name:my-baseXXXXXXXXX/my-operationXXXXXXX
    2. Object name:すべてにチェックを付ける(テキストボックスには*が入力される)
  19. 《ポリシーの確認》をクリックします。
    image.png

  20. 内容を確認して、《変更の保存》をクリックします。
    image.png

Lambdaのテスト

  1. Lambdaの画面に戻り、《テスト》をクリックします。
    image.png

  2. 「テストイベントの設定」画面が表示されるので、以下の項目を選択、入力します。
    image.png

    1. イベントテンプレート:Amazon Connect Contact Flow
    2. イベント名:OperationTimeJudgment
  3. テストで使用するパラメータに今回Amazon Connectから渡す値を追加して《作成》をクリックします。
    image.png

    1. パラメータ:"objectName": "operation-time.txt"
  4. テストイベント選択欄に先ほど作成したテストが選択されている状態で《テスト》をクリックします。
    image.png

  5. テストの実行結果を確認するため、画面を上にスクロールして《詳細》ボタンをクリックします。
    image.png

  6. Lambdaから返す値やログなどが表示されます。
    image.png

  7. エラーの場合はエラーの理由などが出ているのでエラーを推測して関数コード等を修正します。
    image.png

  8. さらに詳細なログを見る場合は《ログ》ボタンをクリックします。
    image.png

  9. CloudWatchの画面が表示されるので、「最終のイベント時刻」から見たいログを判断して「ログストリーム」をクリックします。
    image.png

  10. ログが表示されます。さらに詳細を見たい場合は各行をクリックします。
    image.png

    1. INFO:関数内にconsole.log(JSON.stringify(event))(Nodeの場合)を入れる事によりその時点のevent変数をログに書き出します。
    2. ERROR:実行時にエラーになったログが出力されます。

Amazon Connect問い合わせフローに営業時間判定を追加

  1. AWSにサインインします。

    1. アカウント、ユーザー名、パスワードを入力してサインインします。
      アカウント内(IAM)で作成したユーザーを使用してコンソールにサインインする
  2. 『AWSマネジメントコンソール』画面の右上にある《リージョン名》をクリックし、ドロップダウンます。
    image.png

  3. 『AWSマネジメントコンソール』画面にある「サービスを検索」にConnectと入力し、検索結果から《Amazon Connect》をクリックし、Amazon Connect コンソール(https://console.aws.amazon.com/connect/)を開きます。
    image.png

  4. Amazon Connectのインスタンス一覧が表示されるので、該当のインスタンスをクリックします。
    image.png

  5. インスタンスの概要が表示されるので左側のメニューから《問い合わせフロー》をクリックします。
    image.png

  6. 画面を下にスクロールして「AWS Lambda」の《関数》をクリックし、先ほど作成したLambdaをクリックします。
    image.png

  7. 《+Lambda関数の追加》をクリックします。
    image.png

  8. Lambda関数の一覧に登録されました。これで、Amazon Connectから操作できるようになりました。
    image.png

  9. インスタンスの概要に戻って《管理者としてログイン》をクリックします。
    image.png

  10. 左側のメニューから《問い合わせフロー》をクリックします。
    image.png

  11. お客様の選択による分岐と外線転送で作成した問い合わせフローをクリックします。
    image.png

  12. 《顧客の入力を取得する》から《キューの設定》に出ている矢印にカーソルを合わせて『×』ボタンをクリックして矢印を消し、後ろのフローを右にずらします
    image.png

  13. 左側メニューの「統合」から《AWS Lambda関数を呼び出す》をフロー部分にドラッグ&ドロップし、オブジェクト同志を矢印で接続後に《AWS Lambda関数を呼び出す》のタイトル部分をクリックします。
    image.png

  14. 右側に「AWS Lambda 関数を呼び出す」画面が表示されるので、以下の項目を選択して《パラメータを追加する》をクリックします。
    image.png

    1. 関数を選択する:作成したLambda
  15. 以下の項目を入力して《Save》をクリックします。
    image.png

    1. 宛先キー:objectName(Lambda側で値を受け取る変数名)
    2. 値:operation-time.txt(S3に保存されているオブジェクト名)
    3. タイムアウト:5
  16. 左側メニューの「ブランチ」から《問い合わせ属性を確認する》をフロー部分にドラッグ&ドロップし、オブジェクト同志を矢印で接続後に《問い合わせ属性を確認する》のタイトル部分をクリックします。
    image.png

  17. 右側に「問い合わせ属性を確認する」画面が表示されるので、以下の項目を選択、入力して《別の条件の追加》をクリックします。
    image.png

    1. タイプ:外部(Lambdaからの引数)
    2. 属性:IsOperationTime(Lambdaでの処理結果を返す変数名)
  18. 以下の項目を入力して《Save》をクリックします。
    image.png

    1. 条件:等しい、true(分岐の条件を指定する)
  19. 左側メニューの「操作」から《プロンプトの再生》をフロー部分にドラッグ&ドロップし、オブジェクト同志を矢印で接続後に《プロンプトの再生》のタイトル部分をクリックします。
    image.png

  20. 右側に「プロンプトの再生」画面が表示されるので、以下の項目を選択、入力して《Save》をクリックします。
    image.png

    1. テキスト読み上げまたはチャットテキスト:選択します。
    2. テキストの入力:選択し、音声案内する文言を入力します。
  21. オブジェクト同志を矢印で接続します。
    image.png

  22. 右上の《公開》をクリックします。
    image.png

  23. 《公開》をクリックします。
    image.png

参考サイト

目次に戻る

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした