Amazon Connect Analytics Data Lake を試してみた！

## はじめに
Amazon Connect Analytics Data Lakeとは、Amazon 
Connectのさまざまな種類のデータを一元的にクエリする場所として使用する機能です。

データには、問い合わせレコード、Contact Lens会話分析などが含まれており、これらに対してSQLクエリを実行して分析を行うことができます。

本記事では、Amazon Connect Analytics Data Lake（以下 ADL）を使って、Athena＋QuickSightでの可視化を行うまでの構築手順・検証結果をまとめます。

:::note info
これは2025年4月時点での情報です。
機能が追加されることが予想され、UIも変更される可能性があります。
:::

## 全体アーキテクチャと目的
- 利用構成：Connect → Analytics Data Lake → Glue Catalog → Athena → QuickSight
![Amazon_Connect_Analytics_Data_Lake_Architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/5bdbe645-3e44-44dd-af4a-28d18f7b6b75.png)

- 目的：
  - ADLを活用して何がどこまでできるのかを検証
      - Athenaのクエリで取得可能な情報の範囲
      - QuickSightでどのようにグラフ化・可視化できるのか確認

## 前提
ADLを使用する前に、以下の設定を行っておく必要があります。
- Amazon Connectインスタンスの作成

## 構築手順（データの共有〜QuickSight連携）

### データ共有の追加（Amazon Connect側）
- Amazon Connectインスタンス > 分析ツール > データレイクから「データ共有の追加」
    - 共有するAWS account IDを記述
    - 例：データ型 `Contact record`、`Agent queue statistic record`などを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/70a2f77b-8680-4d22-a7e7-1524c0147539.png)


### Resource Access Manager (RAM) の招待承諾
- 自分と共有 > リソースの共有
- 注意点
    - 同一アカウント内で共有する場合も**RAMでの共有承諾が必要**

![RAM承諾_image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/a70e8a15-1741-4064-99be-8e162437e990.png)

![RAM承諾_image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/295bc87d-e308-4c0d-bf3b-e2f0d43faf26.png)

### Lake Formation の設定
- Data Lake Administrator に操作ユーザー（IAM）を明示的に登録する必要があります
- `AdministratorAccess` や `AWSLakeFormationDataAdmin` だけでは不十分です
:::note warn
注意
`AWSLakeFormationDataAdmin` ポリシーをIAMユーザーにアタッチしたままだと`Lake Formation許可エラー`が発生するのため、事前に外しておくことを推奨します。[1]
:::

### データベース・リソースリンクテーブルの作成（Lake Formation）
- Databasesを作成
- Resource linkとして共有用のテーブルを作成
    - Resource link name
        - 任意の文字列
    - Destination catalog
        - 自アカウントID
    - Database
        - 作成したデータベース名
    - Shared table's region
        - Amazon Connectインスタンスを作成しているリージョン
    - Shared table
        - データ共有の追加で追加したレコードが表示される
    - Shared table's database
        - Shared tableを選択すると自動的に追加される
    - Shared table's catalog ID
        - Shared tableを選択すると自動的に追加される
![リソースリンクテーブル作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/b5d64e82-9843-4f84-beb4-c68e167c3747.png)
- テーブルが作成されたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/c973bcac-0cd1-4e00-a27d-3145f1f05eaf.png)


### Athena接続
- 上記で共有したテーブルをAthenaで参照可能になる
- 出力先S3を設定してクエリを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/9c3c65ca-18ea-4c69-b84e-63d15a263249.png)

- 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/a4ebd35d-e68b-492d-926b-3c8ef9ee0f67.png)

### QuickSight利用のためのLake Formation設定
- QuickSightユーザーのアクセス許可
    - Lake Formationで作成したテーブル(`connect_record`)を開き、「Actions」から「Grant」を選択
![スクリーンショット 2025-04-02 18.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/c82cba44-6d6a-45d3-abf2-734fba0e3a36.png)
    - principals
        - QuickSightユーザーのARN
        - 以下のAWS CLIコマンドによってARN情報の取得が可能
            ```sh
            aws quicksight list-users --aws-account-id [Account_id] --namespace default
            ```
    - LF-Tags or catalog resources
        - 「Named Data Catalog resources」を選択
    - Catalogs
        - 特に設定していなければデフォルト
    - Databases
        - 作成したデータベース
    - Tables
        - 作成したテーブル
    - Resource link premissions
        - Describe

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/9ac04962-7c9c-4630-837e-d43387be8f1e.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/310d96a9-ee4d-445f-aac6-a5a3bb6f4879.png)
- QS Userの権限が新規に作成されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/2c4dfc82-d885-40e9-a628-6670e1da0307.png)
- データへのアクセス権限を追加
    - 「QuickSightユーザーのアクセス許可」と同じような手順で設定
    - 「Table permissions」は「Select」のみ許可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/bdbd8420-b6eb-4afe-80bc-e6bb50d02963.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/7e65a12d-5c6f-4954-bb46-0d958587cc08.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/dc992d88-2973-491d-be2f-b10fe0d546ab.png)

### QuickSightを利用した可視化

- データソースを選択
    - Athenaを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/0415d62f-cf40-4ef6-830c-d36702699bd7.png)
- データソース作成
    - データソース名
        - 任意の文字列
    - Athena ワークグループ
        - 特に設定していなければ、「primary」
![スクリーンショット 2025-04-02 17.50.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/d4161da4-04ef-4b3d-9c9a-9b78cdcc9e0b.png)
- テーブルの選択
    - カタログ
    - データベース
    - テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/d293f769-549f-4c87-af07-a533403fa7fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/ab28c92e-e090-4756-a70c-97031253b57a.png)


## 検証項目と結果

### エージェントごとの応対時間と保留時間の相関
- QuickSight：散布図
X軸：応答時間の平均
Y軸：保留時間の平均
色：エージェント
![スクリーンショット 2025-04-02 19.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/1b6ccd44-8ece-4021-b41f-660311986bd6.png)
  
### エージェントステータス毎の時間集計
- 使用するクエリ
    - エージェント毎の各ステータスで開始時間と終了時間の差を集計
 
  ```sql
  SELECT
  agent_username,
  transition.state,
  SUM(
    CAST(
      date_diff(
        'second',
        transition.state_start_timestamp,
        transition.state_end_timestamp
      ) AS BIGINT
    )
  ) AS total_duration_sec
    FROM
  amazon_connect_test.connect_record cr
    CROSS JOIN UNNEST(agent_state_transitions) AS t (transition)
    WHERE
  transition.state IS NOT NULL
    GROUP BY
  agent_username, transition.state
    ORDER BY
  agent_username, total_duration_sec DESC;
  ```
- QuickSight：積み上げ棒グラフ
X軸：agent_username
Y軸：total_duration_sec
色（凡例）：state
![QuickSight_エージェントステータス毎の時間集計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/12135a6f-efa4-4c70-968a-81b929b7effb.png)

※今回はデータ量が少ないため傾向が見えづらいが、本来は各エージェントが「どのステータスにどれだけ時間を使っているか」を一目で把握できる

- QuickSight：ヒートマップ
X軸(列)：agent_username
Y軸(行)：state
色の濃さ(値)：total_duration_sec
![QuickSight_エージェントステータス毎の時間集計＿ヒートマップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/99dbeb87-3453-4392-b9f4-c121dcd84d9f.png)
※各エージェントのステータス毎の傾向がわかり、どのステータスで時間がかかっているのか把握しやすい
  
### コンタクト属性の抽出と集計
- 目的
    - コンタクトフロー内のどこまで到達できたのかを把握して傾向を知りたいなど
        - コンタクト属性に到達を確認できるキーを定義していない
        - よって内部で定義されていたキーを用いて実現可能かテストした
- コンタクト属性内の任意のキーの抽出
    - 使用するクエリ
    ```sql
    SELECT
      attributes['postcallTranscribeEnabled'] AS transcribe_enabled,
      COUNT(*) AS count
    FROM
      amazon_connect_test.connect_record
    WHERE
      attributes['postcallTranscribeEnabled'] IS NOT NULL
    GROUP BY
      attributes['postcallTranscribeEnabled']
    ORDER BY
      count DESC;
    ```
  - 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/2b8ff997-ee2b-4153-b2ba-512b681d703a.png)

- コンタクト属性の一覧表示
    - 使用するクエリ
    ```sql
        SELECT
          contact_id,
          attributes
        FROM
          amazon_connect_test.connect_record
        WHERE
          attributes IS NOT NULL
          AND cardinality(attributes) > 0;
    ```
   - 実行結果
![QuickSight_コンタクト属性一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843904/edd91342-9cd9-4066-9111-c270f986e49e.png)

## 結論：Amazon Connect Analytics Data Lakeを使うことの優位性
- Amazon Connect側からLake Formationへのデータの連携が簡単！
    -  Glue定義済＋構造化済＋S3連携済み
- Athenaによるクエリ実行からQuickSightなどのBI連携もしやすい

### 参考記事
- [[アップデート]Amazon ConnectでゼロETLを利用した分析ができるようになりました](https://dev.classmethod.jp/articles/amazon-connect-zero-etl-data-lake-ga/)
- [[1] Set up AWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin)
- [Amazon Connect 分析データレイク](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/data-lake.html)

## 感想

Amazon Connect から ETL の構築を行うことなく、分析までスムーズに進められるということで、実際に使用してみました。

Lake Formation の設定などでは少しつまずく部分もありましたが、一度設定を済ませてしまえば、Athena や QuickSight を用いて簡単に分析ができるようになりました。

フロー内の情報やコンタクトレコードを内部的に取得し、可視化までできることにとても驚きました。

特に IAM や Lake Formation 周りの権限設定には注意が必要だと感じたので、環境構築時にはあらかじめ確認しておくことをおすすめします。