Amazon Connectの DISCONNECTEDイベントをEventBridgeで検知してLambdaを実行する

# はじめに
本記事では、amazonConnectのセッションが終わった際に、`DISCONNECTED`イベントをEventBrigeで検知してLambdaを動かす処理を実装します。

# ゴール
- Connectのセッションが切断された際に、LambdaがコールされてることをCWログから確認する
- Lambdaでコンタクト属性が取得できてることをCWログから確認する


# 構成

![connect (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/0a329d01-cb76-ca60-49cf-121bd2847133.jpeg)

Connectの`Disconnect`イベントを検知するEventBrigeのルールを事前に作成しておきます。イベントが発生したらLambdaをコールします。

## 作るもの
- Connectのフロー：1つ
- EventBrigeのルール：1つ
- Lambda：1つ


# Connectのフロー

プロンプトの再生ブロックで文言を3回チャット表示するだけの簡単なフローを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/d3d2b799-7141-5d8b-0aee-58d0c048816d.png)


<details><summary>プロンプトの再生ブロックの設定</summary>

コンタクト属性のうち、ユーザの定義属性を表示するように設定します。
本記事では、ユーザの定義属性の値はConnectのテストチャットの際に入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/6b024c25-7104-e9ab-1d94-ad3eaff84db3.png)

 > ユーザの定義属性：$.Attributes.name_of_your_destination_key

参考：https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-attrib-list.html#user-defined-attributes

</details>

# Lambda

eventの中身とコンタクト属性を出力するLambdaを作成します。
取得したcontactIdをもとにセッション内で使用したコンタクト属性を取得します。

```python
import json
import logging
import boto3

logger = logging.getLogger()
logger.setLevel(logging.INFO)
connect = boto3.client('connect')

def lambda_handler(event, context):
    logger.info("=== Event ===")
    logger.info(json.dumps(event, indent=2, ensure_ascii=False))

    contactId = event['detail']['contactId']
    instanceId = event['detail']['tags']['aws:connect:instanceId']

    try:
        # 属性の取得
        response = connect.get_contact_attributes(
            InstanceId=instanceId,
            InitialContactId=contactId
        )
        # 取得した属性のログ出力
        logger.info("=== Contact Attributes ===")
        logger.info(json.dumps(response.get('Attributes', {}), indent=2, ensure_ascii=False))
    
    except Exception as e:
        logger.error(f"Error getting contact attributes: {str(e)}")

    return {
        'statusCode': 200,
        'body': 'hoge'
    }
```

- 参考：https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/connect/client/get_contact_attributes.html
- https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-attrib-list.html#user-defined-attributes

:::note info

LambdaのIAM ポリシーには、`GetContactAttributes` のアクションを追加しました。

参考：https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonconnect.html

:::

# EventBrigeのルール作成

- イベントパターンを構築
イベントソース  > その他 を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/650700d9-d57e-b3aa-777e-d06458ef7efd.png)


　作成のメソッド  > カスタムパターン (JSON エディタ)を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/bb518a69-43fe-cc3c-2165-e181565f35d6.png)


以下のルールを設定します。

```json:イベントパターン
{
  "source": ["aws.connect"],
  "detail-type": ["Amazon Connect Contact Event"],
  "resources": ["arn:～～"],
  "detail": {
    "eventType": ["DISCONNECTED"]
  }
}
```

イベントパターンの設定には以下のドキュメントが参考になります。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/contact-events.html#subscribe-contact-events

- ターゲットを選択
EvnetBrigeからコールするLambdaを選択しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/cac639e3-9252-83d7-f964-fb3a3809fdbe.png)

Lambdaを確認するとEventBrigeと連携できてる事が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/423c57e0-ca91-7a02-3c1a-0feebfc954c1.png)


# 動作の確認

## Connectのテストチャット


テストの設定からコンタクト属性を設定し、Connectのテストチャットを試してみます。

```json:問い合わせ属性（オプション）:
{"fruit1":"apple","fruit2":"orange"}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/55f0e21f-70c7-7dc2-07c7-58f42b239d0b.png)


## LambdaのCloudWatchログを確認

`event`パラメータの中身を確認します。
こちらにはコンタクト属性の値は入ってなかったです。

```json-doc:event
{
    "version": "0",
    "id": "～～",
    "detail-type": "Amazon Connect Contact Event",
    "source": "aws.connect",
    "account": "～～",
    "time": "2025-01-13T05:49:34Z",
    "region": "～～",
    "resources": [
        "arn:aws:connect:～～", // Connectのインスタンス
        "arn:aws:connect:～～"  // Connectのフロー
    ],
    "detail": {
        "eventType": "DISCONNECTED",
        "contactId": "～～",
        "channel": "CHAT",
        "instanceArn": "～～",
        "initiationMethod": "API",
        "initiationTimestamp": "2025-01-13T05:49:29.237Z",
        "connectedToSystemTimestamp": "2025-01-13T05:49:30.537Z",
        "disconnectTimestamp": "2025-01-13T05:49:34.502Z",
        "tags": {
            "aws:connect:instanceId": "～～"
        },
        "segmentAttributes": {
            "connect:Subtype": {
                "valueString": "～～"
            }
        }
    }
}
```

boto3の`get_contact_attributes`で取得した属性を確認すると、テストチャットで入力した2つのパラメータがあることを確認できました。

```json-doc:Attributes
{
    "fruit2": "orange",
    "fruit1": "apple"
}
```

# 参考

- https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-attrib-list.html#user-defined-attributes

- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/connect/client/get_contact_attributes.html

- https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-attrib-list.html#user-defined-attributes

- https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonconnect.html

- https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/contact-events.html#subscribe-contact-events