S3に祝日データ(csvファイル)をアップロードしてAmazon Connectの祝日判定(オーバーライド)を設定する方法を考えてみた

S3に祝日データ(csvファイル)をアップロードしてAmazon Connectの祝日判定(オーバーライド)を設定する方法を考えてみた

Clock Icon2025.01.31

こんにちは。
繁松です。

はじめに

前回のブログで「国民の祝日:日本」のAPIを利用してAmazon Connectのオーバーライドに祝日を設定する方法について紹介しました。
今回は祝日データのcsvファイルをS3にアップロードしたことをトリガーにLambdaを実行しAmazon Connectの祝日判定の設定を行う方法を考えてみました。

https://dev.classmethod.jp/articles/amazon-connect-holiday-override-sdk/

やってみた

前提

Lambda

Lambda関数の作成

Lambdaを作成します。

2024-10-29_23h52_32

ロールポリシーの追加

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を最新バージョンに更新します。

https://dev.classmethod.jp/articles/use-layers-to-set-the-version-of-boto3/

トリガー設定

LambdaのトリガーにS3を設定します。
csvファイルを配置する用のバケットを指定します。

2025-01-31_23h17_02

コード

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

動作確認

  • 実行前

オーバーライドに登録されている祝日はありません。
2025-01-31_23h39_50

以下のcsvデータをS3にアップロードしてみました。

date,name
2026-01-01,元日
2026-02-12,テスト
2026-02-13,テスト2
  • 実行後

オーバーライドにcsvで指定した祝日が設定されています。

2025-01-31_23h41_00

以上、S3にCSVファイルをアップロードすることで、Amazon Connectの祝日オーバーライドを設定する方法をご紹介しました。

参考情報

https://dev.classmethod.jp/articles/amazon-connect-operating-hours-holiday-update/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.