はじめに
こんにちは!株式会社ギークフィードのエンジニアのダマルです。
この記事は、Amazon Connect Advent Calendar 2023の20日目の記事となります。
ギークフィードとクラスメソッドさんの有志が著者となっているアドベントカレンダーです。
ゴール
電話関連のヒストリカルレポートテストのため、5年分の1600万件CTRデータをプログラムで作ってみました。今回はPythonでソースコードを書きました。ローカルのデータベースに一日1万、一ヶ月28日の月ごとのファイルを保存して、s3バケットにアップロードしました。
10,000件 x 28日 x 12月 x 5年 = 16,800,000件データーを作成しました。
前提条件
- Amazon Connectアカウント
- Kinesis Data Streams
- Kinesis Data Firehose
- Amazon S3
- Athena
- Python
利用するサービス
- Amazon Connectアカウント
- Amazon S3
- Athena
実際にやってみた
まず、Amazon Connectアカウントに電話して着信のJSON形式のコールログをコピーペーストしました。CTRデーターにカスタム変数(祝日休みフラグ、など)がある場合には、同じようなデーターを作成するためにをサンプルデーターを取得しました。
Pythonコードはこちらになります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import json from datetime import datetime, timedelta def increment_timestamps(data, output_file_name): # JSONデーターをパースする parsed_data = json.loads(data) # CTRデーターの時刻を取得 start_connected_to_system_timestamp = datetime.strptime(parsed_data.get("ConnectedToSystemTimestamp", ""), "%Y-%m-%dT%H:%M:%SZ") start_after_contact_work_end_timestamp = datetime.strptime(parsed_data.get("Agent", {}).get("AfterContactWorkEndTimestamp", ""), "%Y-%m-%dT%H:%M:%SZ") start_after_contact_work_start_timestamp = datetime.strptime(parsed_data.get("Agent", {}).get("AfterContactWorkStartTimestamp", ""), "%Y-%m-%dT%H:%M:%SZ") start_connected_to_agent_timestamp = datetime.strptime(parsed_data.get("Agent", {}).get("ConnectedToAgentTimestamp", ""), "%Y-%m-%dT%H:%M:%SZ") start_disconnect_timestamp = datetime.strptime(parsed_data.get("DisconnectTimestamp", ""), "%Y-%m-%dT%H:%M:%SZ") start_initiation_timestamp = datetime.strptime(parsed_data.get("InitiationTimestamp", ""), "%Y-%m-%dT%H:%M:%SZ") start_last_update_timestamp = datetime.strptime(parsed_data.get("LastUpdateTimestamp", ""), "%Y-%m-%dT%H:%M:%SZ") # ファイル名を設定するための取得 year = int(output_file_name.split('-')[0]) month = int(output_file_name.split('-')[1].split('_')[0]) # ログ作成ループ with open(output_file_name, "w") as output_file: for j in range(28): # 1 から 28日 for i in range(10): # 0 から 9 時 for k in range(1000): # 0 から 999 件 # JSONデーターを更新する parsed_data["ConnectedToSystemTimestamp"] = (start_connected_to_system_timestamp.replace(year=year, month=month) + timedelta(hours=i, days=j)).strftime("%Y-%m-%dT%H:%M:%SZ") parsed_data["Agent"]["AfterContactWorkEndTimestamp"] = (start_after_contact_work_end_timestamp.replace(year=year, month=month) + timedelta(hours=i, days=j)).strftime("%Y-%m-%dT%H:%M:%SZ") parsed_data["Agent"]["AfterContactWorkStartTimestamp"] = (start_after_contact_work_start_timestamp.replace(year=year, month=month) + timedelta(hours=i, days=j)).strftime("%Y-%m-%dT%H:%M:%SZ") parsed_data["Agent"]["ConnectedToAgentTimestamp"] = (start_connected_to_agent_timestamp.replace(year=year, month=month) + timedelta(hours=i, days=j)).strftime("%Y-%m-%dT%H:%M:%SZ") parsed_data["DisconnectTimestamp"] = (start_disconnect_timestamp.replace(year=year, month=month) + timedelta(hours=i, days=j)).strftime("%Y-%m-%dT%H:%M:%SZ") parsed_data["InitiationTimestamp"] = (start_initiation_timestamp.replace(year=year, month=month) + timedelta(hours=i, days=j)).strftime("%Y-%m-%dT%H:%M:%SZ") parsed_data["LastUpdateTimestamp"] = ( start_last_update_timestamp.replace(year=year, month=month) + timedelta(hours=i, days=j)).strftime("%Y-%m-%dT%H:%M:%SZ") # データーをコピー duplicated_data = parsed_data.copy() # コピーしたデーターをファイルに記入 output_file.write(json.dumps(duplicated_data, separators=(',', ':')).replace('\n', '') + "\n") if __name__ == "__main__": # Amazon ConnectのJSONデーター original_data = ''' ''' # 2018から2022年までのデーター作成、ファイル名を設定 for year in range(2018, 2022): for month in range(1, 13): file_name = f"{year:04d}-{month:02d}_280k_test_data" increment_timestamps(original_data, file_name) |
時間があまりなかったですので、日付と電話の時刻をfor loopで書きました。まず、取得したサンプルコードのJSONデーターをjson.loadsでパースして、電話時刻、ACWデーター、切断時刻をデーターから取得して、月ごと、日ごと、時間ごとでデーターを作ってみました。アウトプットファイルもs3のデーターのファイルに合わせてopen() writeで作成しました。
CTRのサンプルコードを設定した後に、プログラムを実行すると15分ぐらい時間がかかります。終わったら12月x5年=60のファイルがローカルに作りました。作り終わったらs3にファイルを直接にアップロードしました。アップロードする時間は1年分のファイルは30分ほどかかりました。
アップロード完了しましたらAmazon Athenaのクエリーで確認しました。
まとめ
ヒストリカルレポートをテストするためにpythonプログラムでAmazon ConnectのCTRデーターを作成してみました。s3のアップロードは、まだ手作業が必要ですので、今度はAWS Lambdaで全てプログラムで作ってみたいかと思います。
The following two tabs change content below.
インドネシアから来日し、東洋大学情報連携学科最優等で卒業し、最優秀卒業論文賞を受賞しました。元々プログラミングとイノベーションに興味をもち、大学時代に、チームと一緒に2020 Infinity Blockathon国際大会と2020三菱FUSO Case Challengeを優勝しました。趣味はスポーツ、特に野球。高校時代にインドネシア代表としてアメリカのU-18 CWS野球大会に参加しました。教育にも興味をもち、2022年にIEEE Education SocietyのIEEE EDUCONに”A Tangible-Tool-Based Lesson Plan on
Cypher Key Exchange Protocol for Early-Stage Learners”の大学卒業論文を出版しました。
- AWS Builder Cards:楽しみながらAWSを学ぶカードゲーム - 2024-09-17
- Amazon ConnectのCTRデータをPythonで1600万件作ってみた - 2023-12-20
- re:Invent 2023 5kランに参加しました - 2023-12-12
- Amazon Connect が提供する新しいオムニチャネル機能の概要 (re:Invent 2023) - 2023-12-10
- AmazonConnectとAWSLambdaの環境変数で休日休みを設定を試してみた – Amazon Connect アドベントカレンダー 2022 - 2022-12-07