📝

Amazon Connect でオペレーション時間を制御する方法をやってみた

に公開

[Amazon Connect] オペレーション時間の設定ファイルをS3に置くだけで制御する | DevelopersIO
上記ブログを以下の内容に変更してやってみました。

  • 祝日は 2025 年にあわせる
  • 現在時刻を日本時間に変更
  • AWS SDK for JavaScript v3 を使用

前提

  • 使用リージョン: バージニア北部リージョン
  • Amazon Connect インスタンスを作成済み
  • Amazon Connect インスタンスで電話番号取得済み

OperationTime.txt の内容

2025 年の祝日に合わせて以下の内容で定義しました。

月,09:00,19:00
火,09:00,19:00
水,09:00,19:00
木,09:00,19:00
金,09:00,19:00

1/1 #元旦
1/13 #成人の日

2/11 #建国記念日
2/23 #天皇誕生日

3/20 #春分の日

4/29 #昭和の日

5/3 #憲法記念日
5/4 #みどりの日
5/5 #こどもの日

7/21 #海の日

8/11 #山の日

9/15 #敬老の日
9/23 #秋分の日

10/13 #スポーツの日

11/3 #文化の日
11/23 #勤労感謝の日

上記ファイルを任意の S3 バケットにアップロードしておきます。

Lambda 関数

  • 現在時刻を日本時間に変更
  • AWS SDK for JavaScript v3 を使用

冒頭のブログから上記の内容に変更したバージョンです。
その他、以下の設定で作成しました。

  • ランタイム: Node.js 22.x
  • Lambda 実行ロールの権限: AdministratorAccess
const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3');

const s3Client = new S3Client({ region: process.env.AWS_REGION || 'us-east-1' });
const bucket = 'my-bucket-name';
const key = 'OperationTime.txt';

exports.handler = async function (event, context) {
  console.log(JSON.stringify(event));

  try {
    // オペレーション時間の取得
    const command = new GetObjectCommand({ Bucket: bucket, Key: key });
    const response = await s3Client.send(command);

    // レスポンスボディをストリームから文字列に変換
    const operationTime = await streamToString(response.Body);
    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 };
  } catch (error) {
    console.error('Error:', error);
    throw error;
  }
}

// ストリームを文字列に変換するヘルパー関数
async function streamToString(stream) {
  const chunks = [];
  for await (const chunk of stream) {
    chunks.push(chunk);
  }
  return Buffer.concat(chunks).toString('utf-8');
}

function CheckInTime(lines) {
  // 現在時間
  const now = new Date();
  const japanTime = new Date(now.toLocaleString("en-US", { timeZone: "Asia/Tokyo" }));

  const month = japanTime.getMonth() + 1;
  const day = japanTime.getDate();
  const week = japanTime.getDay();
  const hour = japanTime.getHours();
  const miniute = japanTime.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(':');
          console.log(t)
          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;
}

Amazon Connect インスタンスの設定

Amazon Connect インスタンスの設定で Lambda 関数を問い合わせフローに紐づけます。

問い合わせフローの設定

以下のように定義しました。

ログ記録動作の設定は有効です。

音声の設定では日本語を選択しました。

AWS Lambda 関数で上述の関数を選択します。

コンタクト属性を確認するで以下の設定します。

  • 確認する属性: 外部
  • キー: inTime
  • チェックする条件
    • 条件: 次と等しい
    • 値: true

プロンプトの再生を 2 つ用意し、コンタクト属性を確認するの結果で分岐させます。
プロンプト内容は任意のメッセージです。

動作確認

フローログで Lambda 関数の呼び出しの戻り値である inTime が ture なら営業時間内のプロンプト、false なら営業時間外のプロンプトが再生されることを確認します。

{
    "ContactId": "6af90d58-e0cc-4a6c-bfcd-c4bbaad14555",
    "ContactFlowId": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/contact-flow/da080d4b-6ae1-4151-a9cf-2c2d97183399",
    "ContactFlowName": "ope",
    "ContactFlowModuleType": "InvokeExternalResource",
    "Identifier": "8cb25322-de72-4f99-8f3d-4af15dd08854",
    "Timestamp": "2025-07-01T01:10:02.239Z",
    "ExternalResults": {
        "inTime": "true"
    },
    "Parameters": {
        "FunctionArn": "arn:aws:lambda:us-east-1:012345678901:function:test",
        "ResponseValidation": "ResponseType=STRING_MAP",
        "InvocationType": "SYNCHRONOUS",
        "TimeLimit": "3000"
    }
}

想定通りに動作しない場合にはフローログや Lambda の実行ログを確認してください。

まとめ

今回は Amazon Connect でオペレーション時間を制御する方法をやってみました。
どなたかの参考になれば幸いです。

参考資料

Discussion