AWS SDK for Python を使用してAmazon Connectのキューを別のインスタンスにコピーしてみた

2024.06.28

こんにちは。
繁松です。

はじめに

AWS SDK for Python (Boto3) を使用して、同一アカウント、同一リージョン内のAmazon Connectにキューをコピーしてみました。

キューを同様の設定で作成したい場合、インポート/エクスポートの機能がないため、手作業で一つ一つ作成する必要があります。AWS SDK for Python (Boto3) を使用することで、同様の設定のキューを簡単に作成できました。
キューをコピーしたいケースとしては、開発環境で作成したキューを本番環境でも同じ設定で利用したい場合や、Amazon Connectのユーザー認証方式を変更したい場合等、新たに作成したインスタンスでも既存のインスタンスと同様の設定が使いたいといったケースが考えられます。

本ブログでコピーされる設定値は、「キュー名」「説明」「オペレーション時間」です。

やってみた

コピー元のインスタンスのIDと、コピー先のインスタンスのIDを確認しスクリプト内で指定します。

コピー元のインスタンスからキューのリストを取得し、設定されているオペレーション時間名や説明等の詳細情報を取得します。
コピー元とコピー先に同じ名前のキューがある場合は、設定値をアップデートするようにしています。

前提条件

import boto3

def copy_queue(source_instance_id, target_instance_id, region_name='ap-northeast-1'):
    connect = boto3.client('connect', region_name=region_name)

    # コピー元のインスタンスからキューのリストを取得
    list_queues = connect.list_queues(
        InstanceId=source_instance_id,
        QueueTypes=[
            'STANDARD'
        ]
    )['QueueSummaryList']

    for queue in list_queues:
        queue_id = queue['Id']

        # 詳細なキュー情報を取得
        queue_details = connect.describe_queue(
            InstanceId=source_instance_id,
            QueueId=queue_id
        )['Queue']

        # コピー元のキューに設定されたオペレーション時間名を取得
        queue_hours_name = connect.describe_hours_of_operation(
            InstanceId=source_instance_id,
            HoursOfOperationId=queue_details['HoursOfOperationId']
        )['HoursOfOperation']

        # コピー先のインスタンスで同じ名前のオペレーション時間のIDを検索
        hours_id = connect.search_hours_of_operations(
            InstanceId=target_instance_id,
            SearchCriteria={
                'StringCondition': {
                    'FieldName': 'Name',
                    'Value': queue_hours_name['Name'],
                    'ComparisonType': 'EXACT'
                }
            }
        )['HoursOfOperations'][0]['HoursOfOperationId']

        # コピー元のキューを確認
        existing_queues = connect.list_queues(
            InstanceId=target_instance_id,
            QueueTypes=[
                'STANDARD'
            ]
        )['QueueSummaryList']

        # 説明が空の場合は空の文字列を使用
        description = queue_details.get('Description', '')

        for existing_queue in existing_queues:
            # 同じ名前のキューが存在する場合はアップデートを実施
            # 説明とオペレーション時間が更新される
            if existing_queue['Name'] == queue['Name']:
                update_params = {
                    'InstanceId': target_instance_id,
                    'QueueId': existing_queue['Id']
                }
                if description:
                    # キューの説明を更新
                    update_params['Description'] = description
                    connect.update_queue_name(**update_params)
                    print(f"Updated Queue Description: {existing_queue['Name']}")                    
                    del update_params['Description']

                # キューのオペレーション時間を更新
                update_params['HoursOfOperationId'] = hours_id
                connect.update_queue_hours_of_operation(**update_params)
                print(f"Update Queue Hours of Operation: {existing_queue['Name']}")
                break
        else:
            # キューを作成
            create_params = {
                'InstanceId': target_instance_id,
                'Name': queue_details['Name'],
                'HoursOfOperationId': hours_id,
                'Tags': queue_details.get('Tags', {})
            }
            if description:
                create_params['Description'] = description
            
            connect.create_queue(**create_params) 
            print(f"Copied Queue: {queue['Name']}")
        
# コピー元とコピー先のインスタンスIDを指定
source_instance_id = 'source_instance_idを指定'
target_instance_id = 'target_instance_idを指定'

copy_queue(source_instance_id, target_instance_id)
  • 注意点
    同じ名前のキューがあった場合、設定値のアップデートでtagの項目は含まれません。

実行前

コピー元インスタンス

コピー先インスタンス

実行後

コピー先インスタンス

test1,test2のキューが追加されました。

さいごに

AWS SDK for Python (Boto3) を使ったキューのコピーをやってみました。
コンソールを確認しながら実施するよりも簡単に同様のキューの作成が実施できると思います。
コピー元とコピー先の指定を間違えないように気を付けてください。
キューに設定されたクイック接続は、クイック接続の作成後に実施する必要がある為、また次回以降に書きます。

次回はルーティングプロファイルのコピーについて書きます。