S3に祝日データ(csvファイル)をアップロードしてAmazon Connectの祝日判定(オーバーライド)を設定する方法を考えてみた
こんにちは。
繁松です。
はじめに
前回のブログで「国民の祝日:日本」のAPIを利用してAmazon Connectのオーバーライドに祝日を設定する方法について紹介しました。
今回は祝日データのcsvファイルをS3にアップロードしたことをトリガーにLambdaを実行しAmazon Connectの祝日判定の設定を行う方法を考えてみました。
やってみた
前提
- Amazon Connectインスタンスは構築済み
- オペレーション時間は作成済
- Lambdaのboto3のバージョンは最新バージョン
Lambda
Lambda関数の作成
Lambdaを作成します。
ロールポリシーの追加
LambdaのロールにAmazon Connectの設定更新に必要な以下のポリシーを追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"connect:ListHoursOfOperationOverrides",
"connect:DeleteHoursOfOperationOverride",
"connect:CreateHoursOfOperationOverride"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "*"
}
]
}
Boto3のバージョン更新
以下のブログを参考にLambdaで使用するboto3を最新バージョンに更新します。
トリガー設定
LambdaのトリガーにS3を設定します。
csvファイルを配置する用のバケットを指定します。
コード
Amazon ConnectのインスタンスID、オペレーション時間IDを設定します。
設定済みのオーバーライドをすべて削除して、csvに記載されている日付をすべて設定するようにしています。
import boto3
from datetime import datetime
import json
import csv
from io import StringIO
def delete_holiday_overrides(connect_client, instance_id, hours_of_operation_id):
# 既存のオーバーライドをリスト化
response = connect_client.list_hours_of_operation_overrides(
InstanceId=instance_id,
HoursOfOperationId=hours_of_operation_id
)
# 各オーバーライドを削除
for override in response['HoursOfOperationOverrideList']:
override_id = override['HoursOfOperationOverrideId']
try:
connect_client.delete_hours_of_operation_override(
InstanceId=instance_id,
HoursOfOperationId=hours_of_operation_id,
HoursOfOperationOverrideId=override_id
)
print(f"Deleted override: {override_id}")
except Exception as e:
print(f"Error deleting override {override_id}: {str(e)}")
def process_holiday_data(connect_client, instance_id, hours_of_operation_id, csv_content):
today = datetime.now().date()
csv_file = StringIO(csv_content)
csv_reader = csv.DictReader(csv_file)
for row in csv_reader:
date_str = row['date']
name = row['name']
# 過去の日付はスキップ
holiday_date = datetime.strptime(date_str, '%Y-%m-%d').date()
if holiday_date < today:
continue
try:
# オーバーライドを作成
connect_client.create_hours_of_operation_override(
InstanceId=instance_id,
HoursOfOperationId=hours_of_operation_id,
Name=f"{date_str[:4]}-{name}",
Config=[], # 空の設定(営業時間なし)
EffectiveFrom=date_str,
EffectiveTill=date_str
)
print(f"Created override for {name} on {date_str}")
except Exception as e:
print(f"Error creating override for {date_str}: {str(e)}")
def lambda_handler(event, context):
try:
# S3イベント情報の取得
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
# AWS クライアントの初期化
s3_client = boto3.client('s3')
connect_client = boto3.client('connect')
# 設定値
instance_id = 'インスタンスID'
hours_of_operation_id = 'オペレーション時間ID'
# S3からCSVファイルを読み込み
response = s3_client.get_object(Bucket=bucket, Key=key)
csv_content = response['Body'].read().decode('utf-8')
# 既存のオーバーライドを削除
delete_holiday_overrides(connect_client, instance_id, hours_of_operation_id)
# 新しいオーバーライドを作成
process_holiday_data(connect_client, instance_id, hours_of_operation_id, csv_content)
return {
'statusCode': 200,
'body': json.dumps('Holiday overrides processed successfully')
}
except Exception as e:
print(f"Error: {str(e)}")
return {
'statusCode': 500,
'body': json.dumps(f'Error: {str(e)}')
}
csvファイルはdateとnameの列を追加した以下の形式で作成します。
date,name
2026-01-01,元日
2026-02-12,テスト
2026-02-13,テスト2
動作確認
- 実行前
オーバーライドに登録されている祝日はありません。
以下のcsvデータをS3にアップロードしてみました。
date,name
2026-01-01,元日
2026-02-12,テスト
2026-02-13,テスト2
- 実行後
オーバーライドにcsvで指定した祝日が設定されています。
以上、S3にCSVファイルをアップロードすることで、Amazon Connectの祝日オーバーライドを設定する方法をご紹介しました。
参考情報