Amazon Connect ユーザーの管理をされている方、一度は思ったことあるはずです。「オフラインにするの忘れる人多すぎ…」と。
今回はそんな方のために、決まった時間(終業時間など)になったらエージェントのステータスをオフラインにします。
最初にまとめ
- PutUserStatus APIを使います
- Linux のCronやEventBridge などを使って決まった時間にこのAPIで「Offline」というステータスをPutしてあげます
- 様々やり方がありますがAWS CLI で行う方法とAWS SDK Python(boto3)で行う方法を紹介します
(没案)EventBridge Scheduler でPutUserStatus API を直接叩く
EventBridge のスケジューラという機能を使うと、Cron/Rate形式でAWS API を叩く指定が出来ます。
Amazon EventBridge のスケジュール から「スケジュールを作成」で新しいジョブを作成します。
cron形式で毎日18時にAPI を叩く場合はこんな感じです。
PutUserStatusを選択して、パラメーターをJson形式で指定します。
{
"AgentStatusId": "[OfflineのステータスID]", ### list-agent-statuses CLI で事前に取得
"InstanceId": "[connectインスタンスのARN]", ### Connectコンソールで確認
"UserId": "[対象ユーザーのID]" ### list-users CLI で事前に取得
}
アクセス許可で指定するIAMロールは別途作成する必要があります。(自動では作成されない)
今回コールするAPIのアクセス権限を持った、Principal(信頼されたエンティティ)がscheduler.amazonaws.com
のIAMロールを作成してください。
なぜ没になったのか
シンプルに、JsonパラメーターのUserId
がStringである必要があり、List形式で複数指定することが出来ませんでした…
これではユーザーの人数分スケジュールを作成する必要があり、現実的ではなかった…
5人くらいなら、ありかも。
EC2 にスクリプトを置いてcrondで叩く
AWS CLI を使ってお一人お一人に対して丁寧にOfflineステータスを置いていくスタイルです。脳筋ですが一番シンプル。ただ超ナンセンスですのでお勧めはしません。
#!/bin/bash
aws connect put-user-status --instance-id arn:aws:connect:ap-northeast-1:766*********:instance/********* --user-id [対象ユーザーのID 1] --agent-status-id [OfflineのステータスID]
aws connect put-user-status --instance-id arn:aws:connect:ap-northeast-1:766*********:instance/********* --user-id [対象ユーザーのID 2] --agent-status-id [OfflineのステータスID]
aws connect put-user-status --instance-id arn:aws:connect:ap-northeast-1:766*********:instance/********* --user-id [対象ユーザーのID 3] --agent-status-id [OfflineのステータスID]
aws connect put-user-status --instance-id arn:aws:connect:ap-northeast-1:766*********:instance/********* --user-id [対象ユーザーのID 4] --agent-status-id [OfflineのステータスID]
・
・
・
余談ですがAmazon Linux 2023 にはcrontab がインストールされていないので自分で入れる必要があります。
https://jainsaket-1994.medium.com/installing-crontab-on-amazon-linux-2023-ec2-98cf2708b171
AWS SDK Python(boto3)を使ってAPI を叩くLambdaをEventBridge Scheduler で実行
同じくPutUserStatus API をboto3で呼び出します。パラメーターなどはドキュメントを確認してください。
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/connect/client/put_user_status.html
今回サンプルコードを用意しようと思ったのですが、Pythonの知識が赤ちゃんレベルの僕には難しかった…
ChatGPTさんに聞きながら色々試したのですがギブアップ。実際ちゃんと動作しない(OfflineステータスのユーザーにOfflineステータスをPutするな!と怒られてしまう)のですが一応貼っておきます。どなたかアドバイスをください…
本当は、①全てのユーザー状態を取得②そこからAvailableのユーザーをフィルタして③そいつらにOfflineステータスをPutする をやりたかった…
以下のコードはChatGPTを使って生成したコードを元にしています。
import boto3
import json
import os
connect = boto3.client("connect")
def lambda_handler(event, context):
instance_id = os.environ['INSTANCE_ID']
agent_status_id = os.environ['OFFLINE_ID']
agent_list = get_agent_list(instance_id)
for agent in agent_list:
set_agent_state_to_offline(instance_id, agent,agent_status_id)
return {
"statusCode": 200,
"body": json.dumps(f"{len(agent_list)} agents set to offline")
}
def get_agent_list(instance_id):
response = connect.list_users(InstanceId=instance_id)
return response["UserSummaryList"]
def set_agent_state_to_offline(instance_id, agent,agent_status_id):
connect.put_user_status(
InstanceId=instance_id,
UserId=agent["Id"],
AgentStatusId=agent_status_id
)
あとはEventBridge Scheduler で 没案と同じようにLambda Invoke を設定すればOKです。
Lambda実行ロールにAmazon Connect 実行のためのIAMポリシー(Amazon Connect Full Accessなど)を付与するのを忘れないでください。