Amazon Connect Customer Profilesのデータソース自動更新と更新時間変更について

密かな推しサービス、Amazon Connect Customer Profilesのデータソース自動更新の話です
2024.04.24

こんにちは、洲崎です。
Amazon Connect Customer Profilesで同期しているデータソースの自動更新と、更新時間の変更について調べてみたので紹介します。

Amazon Connect Customer Profliesとは

Amazon Connect Customer Profilesは、各顧客の情報を一元管理し、エージェントが通話しながらその顧客情報を確認することができる機能です。
複数システムの顧客情報をAmazon Connect Customer Profilesにまとめることができます。

Amazon Connect Customer Profilesの詳細や、ワークショップについてはこちらの記事を参照ください。

Amazon Connect Customer Profilesと別のデータソース(今回はAmazon S3)で同期をした際、データソースにある顧客データは自動でAmazon Connect Customer Profilesに更新(反映)されるのか、また更新されるのであれば頻度はどのぐらいか、更新頻度は変更はできるのかについて調べました。

データソースの自動更新

結論から書くと、Amazon Connect Customer Profilesと連携したデータソースは一定の間隔で自動同期(Amazon Connect Customer Profiles側に反映)されます。
データソースからAmazon Connect Customer Profilesのデータの取り込みは、Amazon AppFlowが利用されています。

その為、設定情報についてはAmazon Appflowのコンソール または APIを利用して確認します。
以下は、APIでの設定情報の確認方法です。

Amazon Connect Customer Profilesのコンソール画面に移動します。

画面下の「データソースの統合」から、確認したいデータソース(今回はAmazon S3)を選択します。

データソースの「フロー名」をコピーします。

AWS CLIで、以下のコマンドを実行します。(私はCloudShellで実行しました)

aws appflow describe-flow --flow-name <コピーしたフロー名>

AWS CLIの出力結果から "triggerConfig" オブジェクトを確認します。

    "triggerConfig": {
        "triggerType": "Scheduled",
        "triggerProperties": {
            "Scheduled": {
                "scheduleExpression": "rate(1hours)",
                "dataPullMode": "Incremental",
                "scheduleStartTime": "2024-01-17T01:38:29.309000+00:00"
                "Notes"
            ],
            "connectorOperator": {
                "S3": "PROJECTION"
            },
            "taskType": "Filter",
            "taskProperties": {}
        },

上のハイライトされている箇所になりますが、1時間ごとに自動更新される設定になっていました。

なお、Amazon AppFlowコンソールで、実行履歴を見ると、きっちり1時間おきに実行されている確認がとれました。

自動更新時間の変更

次に、下記ドキュメントを参考に、自動更新時間を1時間から15分に変更してみます。
(ドキュメントによると、自動更新の最小値は15分とのことでした)

AWS CLIで下記コマンドを実行します。

aws appflow describe-flow --flow-name <コピーしたフロー名>

出力された内容から、KmsArnSourceFlowConfigDomainNameObjectTypeNameTasksの内容をコピーして控えます。

{
    "flowArn": "arn:aws:appflow:ap-northeast-1:xxxxxxxxxxxx:flow/Customer_Profiles_suzaki-test-workshop_S3_AutoMap-S3-customerprofilestest20240117-customerprofiles",
    "description": "Created by Customer Profiles",
    "flowName": "Customer_Profiles_suzaki-test-workshop_S3_AutoMap-S3-customerprofilestest20240117-customerprofiles",
    "kmsArn": "arn:aws:kms:ap-northeast-1:xxxxxxxxxxxx:key/xxxxxxxxxxxxxxxxxxxxxxxx",
    "flowStatus": "Active",
    "sourceFlowConfig": {
        "connectorType": "S3",
        "sourceConnectorProperties": {
            "S3": {
                "bucketName": "customer-profiles-test-20240117",
                "bucketPrefix": "customer-profiles/"
            }
        }
    },
    "destinationFlowConfigList": [
        {
            "connectorType": "CustomerProfiles",
            "destinationConnectorProperties": {
                "CustomerProfiles": {
                    "domainName": "suzaki-test-workshop",
                    "objectTypeName": "AutoMap-S3-customerprofilestest20240117-customerprofiles"
                }
            }
        }
    ],
    "lastRunExecutionDetails": {
        "mostRecentExecutionTime": "2024-04-24T10:38:42.412000+00:00",
        "mostRecentExecutionStatus": "Successful"
    },
    "triggerConfig": {
        "triggerType": "Scheduled",
        "triggerProperties": {
            "Scheduled": {
                "scheduleExpression": "rate(1hours)",
                "dataPullMode": "Incremental",
                "scheduleStartTime": "2024-01-17T01:38:29.309000+00:00"
            }
        }
    },
    "tasks": [
        {
            "sourceFields": [
                "CustomerId",
                "FirstName",
                "LastName",
                "ReferenceId",
                "PhoneNumber",
                "ServiceDate",
                "ServiceType",
                "AssignedAgent",
                "CompletionDate",
                "Notes"
            ],
            "connectorOperator": {
                "S3": "PROJECTION"
            },
            "taskType": "Filter",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "CustomerId"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "CustomerId",
            "taskType": "Map",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "FirstName"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "FirstName",
            "taskType": "Map",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "LastName"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "LastName",
            "taskType": "Map",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "ReferenceId"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "ReferenceId",
            "taskType": "Map",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "PhoneNumber"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "PhoneNumber",
            "taskType": "Map",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "ServiceDate"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "ServiceDate",
            "taskType": "Map",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "ServiceType"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "ServiceType",
            "taskType": "Map",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "AssignedAgent"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "AssignedAgent",
            "taskType": "Map",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "CompletionDate"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "CompletionDate",
            "taskType": "Map",
            "taskProperties": {}
        },
        {
            "sourceFields": [
                "Notes"
            ],
            "connectorOperator": {
                "S3": "NO_OP"
            },
            "destinationField": "Notes",
            "taskType": "Map",
            "taskProperties": {}
        }
    ],
    "createdAt": "2024-01-17T01:33:31.366000+00:00",
    "lastUpdatedAt": "2024-01-17T01:33:31.786000+00:00",
    "createdBy": "arn:aws:sts::xxxxxxxxxxxx:assumed-role/xxxxxxxxxxxxxx",
    "lastUpdatedBy": "arn:aws:sts::xxxxxxxxxxxx:assumed-role/xxxxxxxxxxxxxx",
    "tags": {},
    "metadataCatalogConfig": {},
    "schemaVersion": 1
}

 控えたパラメーターを参考に、以下のJSONファイルを作成します。
FlowNameは任意で名前を入れます。ScheduleExpressionでは、最短の15分で設定してみます。
ハイライトしている部分に、先ほど控えた内容を入力します。

{
    "DomainName": "suzaki-test-workshop",
    "ObjectTypeName": "AutoMap-S3-customerprofilestest20240117-customerprofiles",
    "FlowDefinition": {
        "FlowName": "任意のフロー名",
        "KmsArn": "arn:aws:kms:ap-northeast-1:xxxxxxxxxxxxx:key/xxxxxxxxxxxxxxxxxxxxxx",
        "Description": "Created by Customer Profiles",
        "TriggerConfig": {
            "TriggerType": "Scheduled",
            "TriggerProperties": {
                "Scheduled": {
                    "ScheduleExpression": "rate(15minutes)",
                    "DataPullMode": "Incremental",
                    "FirstExecutionFrom": 1594166400
                }
            }
        },
        "SourceFlowConfig": {
            "ConnectorType": "S3",
            "SourceConnectorProperties": {
                "S3": {
                    "BucketName": "customer-profiles-test-20240117",
                    "BucketPrefix": "customer-profiles/"
                }
            }
        },
        "Tasks": [
            {
                "SourceFields": [
                    "CustomerId",
                    "FirstName",
                    "LastName",
                    "ReferenceId",
                    "PhoneNumber",
                    "ServiceDate",
                    "ServiceType",
                    "AssignedAgent",
                    "CompletionDate",
                    "Notes"
                ],
                "ConnectorOperator": {
                    "S3": "PROJECTION"
                },
                "TaskType": "Filter",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "CustomerId"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "CustomerId",
                "TaskType": "Map",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "FirstName"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "FirstName",
                "TaskType": "Map",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "LastName"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "LastName",
                "TaskType": "Map",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "ReferenceId"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "ReferenceId",
                "TaskType": "Map",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "PhoneNumber"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "PhoneNumber",
                "TaskType": "Map",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "ServiceDate"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "ServiceDate",
                "TaskType": "Map",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "ServiceType"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "ServiceType",
                "TaskType": "Map",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "AssignedAgent"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "AssignedAgent",
                "TaskType": "Map",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "CompletionDate"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "CompletionDate",
                "TaskType": "Map",
                "TaskProperties": {}
            },
            {
                "SourceFields": [
                    "Notes"
                ],
                "ConnectorOperator": {
                    "S3": "NO_OP"
                },
                "DestinationField": "Notes",
                "TaskType": "Map",
                "TaskProperties": {}
            }
        ]
    }
}

JSONファイルができたら、CloudShellにアップロードし、以下のコマンドを実行します。

aws customer-profiles put-integration --cli-input-json file://{JSONのファイル名}

以下の応答が返ってくることを確認します。

{
    "DomainName": "suzaki-test-workshop",
    "Uri": "arn:aws:appflow:ap-northeast-1:xxxxxxxxxxxx:flow/suzaki-test-20240412",
    "ObjectTypeName": "AutoMap-S3-customerprofilestest20240117-customerprofiles",
    "CreatedAt": "2024-04-24T11:46:37.722000+00:00",
    "LastUpdatedAt": "2024-04-24T11:46:37.722000+00:00",
    "Tags": {}
}

Amazon Connect Customer Profilesで該当のフローから、作成されていることを確認します。

ステータスが「保留中」となっているため、Amazon AppFlowを確認します。
該当のフローをクリックします。

「フローをアクティブ化」をクリックします。

Amazon Connect Customer ProfilesとAmazon AppFlowで正常にアクティブ化されました!

Amazon Connect Customer Profiles

Amazon AppFlow

最後に

Amazon Connect Customer Profilesのデータソースの自動更新と更新タイミングの変更について試してみました。
内部ではAmazon AppFlowが利用されており、Amazon AppFlowをあまり触ったことがなかったので勉強になりました。
データの自動更新もマネージドでやっていただけるので助かりますね。

ではまた!コンサルティング部の洲崎でした。

参考