📝
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