【发布时间】:2021-07-09 16:28:18
【问题描述】:
我有一个 AWS AppFlow 流设置,旨在接收 Salesforce 更改事件并在 Redshift 表上进行处理,以便在 Salesforce 全天发生更改时保持 Redshift 表处于最新状态。
仅使用 AppFlow 并将源映射到 Redshift 中的目标字段似乎并没有达到我想要的效果,因为它似乎只是将更改附加到目标 Redshift 表 - 没有更新、删除等。
我想解决这个问题的方法是将 AppFlow 的目标更改为 Amazon EventBridge,设置一个规则来侦听更改,以 Lambda 函数为目标,并根据事件详细信息在适当的表上执行 Redshift 操作。
但是,在 Lambda 中进行这些更改和测试后,我遇到了事件问题。根据 Salesforce 的说法,Change Event Message 应该如下所示:
{
"data": {
"schema": "<schema_ID>",
"payload": {
"ChangeEventHeader": {
"entityName" : "...",
"recordIds" : "...",
"changeType" : "...",
"changedFields": [...],
"changeOrigin" : "...",
"transactionKey" : "...",
"sequenceNumber" : "...",
"commitTimestamp" : "...",
"commitUser" : "...",
"commitNumber" : "..."
},
"field1":"...",
"field2":"...",
. . .
},
"event": {
"replayId": <replayID>
}
},
"channel": "/data/<channel>"
}
当我进入 Salesforce 并更新记录时,发送到 Lambda 的事件如下所示:
{
'account': '111111111111',
'detail': {'my_custom_field__c': 'my updated text'},
'detail-type': 'AccountChangeEvent',
'id': '7b205b55-879a-1wt2-br8d-227da614b205',
'region': 'my-region',
'resources': [],
'source': 'aws.partner/appflow/salesforce.com/111111111111/aws.partner/appflow/salesforce.com/222222222222',
'time': '2021-07-09T15:29:21Z',
'version': '0',
}
detail 键中唯一的 Salesforce 相关信息是没有任何 ChangeEventHeader 信息的字段。只是这些字段本身没有用,我需要这些 ID 来知道在 Redshift 中要更新哪一行。
字段是否在某处被过滤掉了?关于在哪里获取整个事件有效负载的任何想法?我期待整个有效载荷,而不仅仅是部分。
-update- 我将流的目标更改为 S3 并检查 JSON 输出,它完全符合我的需要。所以问题似乎是从 EventBridge 接收事件时:
{
'ChangeEventHeader': {
'changeOrigin': 'com/salesforce/api/soap/52.0;client=SfdcInternalAPI/',
'changeType': 'UPDATE',
'changedFields': ['LastModifiedDate', 'my_custom_field__c'],
'commitNumber': 34143472625437,
'commitTimestamp': 1655870833010,
'commitUser': '0044r00000a5VaPcdv',
'entityName': 'Account',
'recordIds': ['0034t00003bOPtuSJs'],
'sequenceNumber': 1,
'transactionKey': '02030d57-6dd7-82f8-482r-7pou3bb58769',
},
'my_custom_field__c': 'my updated text',
'LastModifiedDate': '2021-07-09T17:02:13.000Z',
}
【问题讨论】:
标签: amazon-web-services aws-lambda salesforce aws-event-bridge