本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
要了解如何创建 Lambda 函数,请参阅《AWS Lambda 开发人员指南》中的入门。在设计和开发函数时,请牢记以下要求和准则。
输入事件数据
在 Amazon Pinpoint 为推荐器模型调用 Lambda 函数时,它发送一个负载,其中包含发送消息的活动或旅程的配置和其他设置。负载包含一个 Endpoints
对象,该对象是将端点 ID 与消息接收人的端点定义关联的映射。
端点定义使用由 Amazon Pinpoint API 的端点资源定义的结构。不过,它们还包含一个名为 RecommendationItems
的动态建议属性字段。RecommendationItems
字段包含从 Amazon Personalize 活动返回的一个或多个端点建议项目。该字段的值是由 1–5 个建议的项目(作为字符串)组成的有序数组。数组中的项目数取决于您配置 Amazon Pinpoint 以便为每个端点或用户检索的建议项目数。
例如:
"Endpoints": {
"endpointIDexample-1":{
"ChannelType":"EMAIL",
"Address":"sofiam@example.com",
"EndpointStatus":"ACTIVE",
"OptOut":"NONE",
"EffectiveDate":"2020-02-26T18:56:24.875Z",
"Attributes":{
"AddressType":[
"primary"
]
},
"User":{
"UserId":"SofiaMartínez",
"UserAttributes":{
"LastName":[
"Martínez"
],
"FirstName":[
"Sofia"
],
"Neighborhood":[
"East Bay"
]
}
},
"RecommendationItems":[
"1815",
"2009",
"1527"
],
"CreationDate":"2020-02-26T18:56:24.875Z"
},
"endpointIDexample-2":{
"ChannelType":"EMAIL",
"Address":"alejandror@example.com",
"EndpointStatus":"ACTIVE",
"OptOut":"NONE",
"EffectiveDate":"2020-02-26T18:56:24.897Z",
"Attributes":{
"AddressType":[
"primary"
]
},
"User":{
"UserId":"AlejandroRosalez",
"UserAttributes":{
"LastName ":[
"Rosalez"
],
"FirstName":[
"Alejandro"
],
"Neighborhood":[
"West Bay"
]
}
},
"RecommendationItems":[
"1210",
"6542",
"4582"
],
"CreationDate":"2020-02-26T18:56:24.897Z"
}
}
在前面的示例中,相关的 Amazon Pinpoint 设置为:
-
配置推荐器模型,以便为每个端点或用户检索三个建议的项目。(
RecommendationsPerMessage
属性的值设置为3
。) 在使用该设置时,Amazon Pinpoint 为每个端点或用户检索并仅添加第一、第二和第三个建议的项目。 -
配置项目以使用自定义用户属性,这些属性存储每个用户的名字、姓氏以及他们居住的社区。(
UserAttributes
对象包含这些属性的值。) -
配置项目以使用自定义端点属性 (
AddressType
),该属性指示端点是否为用户从项目中接收消息的首选地址(渠道)。(Attributes
对象包含该属性的值。)
在 Amazon Pinpoint 调用 Lambda 函数并将该负载作为事件数据发送时,AWS Lambda 将该数据传递给 Lambda 函数以进行处理。
每个负载最多可以包含 50 个端点的数据。如果分段包含超过 50 个端点,则 Amazon Pinpoint 反复调用该函数(每次最多处理 50 个端点),直到该函数处理了所有数据。
响应数据和要求
在设计和开发 Lambda 函数时,请牢记机器学习模型的限额。如果函数不满足这些限额定义的条件,则 Amazon Pinpoint 无法处理和发送消息。
还要牢记以下要求:
-
函数必须使用输入事件数据提供的相同格式返回更新的端点定义。
-
每个更新的端点定义可以包含端点或用户的 1–10 个自定义建议属性。这些属性的名称必须与在 Amazon Pinpoint 中配置推荐器模型时指定的属性名称匹配。
-
必须在单个
Recommendations
对象中为每个端点或用户返回所有自定义建议属性。该要求有助于确保不会发生命名冲突。您可以将Recommendations
对象添加到端点定义中的任何位置。 -
每个自定义建议属性的值必须是一个字符串(单个值)或字符串数组(多个值)。如果值是字符串数组,我们建议您保持 Amazon Personalize 返回的建议项目的顺序,如
RecommendationItems
字段中所示。否则,您的内容可能无法反映模型为端点或用户提供的预测。 -
函数不应修改事件数据中的其他元素,包括端点或用户的其他属性值。它应该只添加和返回自定义推荐属性的值。Amazon Pinpoint 不接受对函数响应中任何其他值的更新。
-
函数必须托管在与调用函数的 Amazon Pinpoint 项目相同的 AWS 区域中。如果函数和项目不在同一个区域中,则 Amazon Pinpoint 无法将事件数据发送到函数。
如果不满足任何上述要求,则 Amazon Pinpoint 无法处理消息并将其发送到一个或多个端点。这可能会导致活动或旅程活动失败。
最后,我们建议您为函数保留 256 个并发执行。
总体而言,Lambda 函数应处理 Amazon Pinpoint 发送的事件数据,并返回修改的端点定义。它可以遍历 Endpoints
对象中的每个端点,并为每个端点创建和设置要使用的自定义建议属性值以做到这一点。以下示例处理程序(使用 Python 编写并继续前面的输入事件数据示例)说明了这一点:
import json
import string
def lambda_handler(event, context):
print("Received event: " + json.dumps(event))
print("Received context: " + str(context))
segment_endpoints = event["Endpoints"]
new_segment = dict()
for endpoint_id in segment_endpoints.keys():
endpoint = segment_endpoints[endpoint_id]
if supported_endpoint(endpoint):
new_segment[endpoint_id] = add_recommendation(endpoint)
print("Returning endpoints: " + json.dumps(new_segment))
return new_segment
def supported_endpoint(endpoint):
return True
def add_recommendation(endpoint):
endpoint["Recommendations"] = dict()
customTitleList = list()
customGenreList = list()
for i,item in enumerate(endpoint["RecommendationItems"]):
item = int(item)
if item == 1210:
customTitleList.insert(i, "Hanna")
customGenreList.insert(i, "Action")
elif item == 1527:
customTitleList.insert(i, "Catastrophe")
customGenreList.insert(i, "Comedy")
elif item == 1815:
customTitleList.insert(i, "Fleabag")
customGenreList.insert(i, "Comedy")
elif item == 2009:
customTitleList.insert(i, "Late Night")
customGenreList.insert(i, "Drama")
elif item == 4582:
customTitleList.insert(i, "Agatha Christie\'s The ABC Murders")
customGenreList.insert(i, "Crime")
elif item == 6542:
customTitleList.insert(i, "Hunters")
customGenreList.insert(i, "Drama")
endpoint["Recommendations"]["Title"] = customTitleList
endpoint["Recommendations"]["Genre"] = customGenreList
return endpoint
在前面的示例中,AWS Lambda 将事件数据作为 event
参数传递给处理程序。处理程序遍历 Endpoints
对象中的每个端点,并设置名为 Recommendations.Title
和 Recommendations.Genre
的自定义建议属性的值。return
语句将每个更新的端点定义返回到 Amazon Pinpoint。
继续前面的输入事件数据示例,更新的端点定义为:
"Endpoints":{
"endpointIDexample-1":{
"ChannelType":"EMAIL",
"Address":"sofiam@example.com",
"EndpointStatus":"ACTIVE",
"OptOut":"NONE",
"EffectiveDate":"2020-02-26T18:56:24.875Z",
"Attributes":{
"AddressType":[
"primary"
]
},
"User":{
"UserId":"SofiaMartínez",
"UserAttributes":{
"LastName":[
"Martínez"
],
"FirstName":[
"Sofia"
],
"Neighborhood":[
"East Bay"
]
}
},
"RecommendationItems":[
"1815",
"2009",
"1527"
],
"CreationDate":"2020-02-26T18:56:24.875Z",
"Recommendations":{
"Title":[
"Fleabag",
"Late Night",
"Catastrophe"
],
"Genre":[
"Comedy",
"Comedy",
"Comedy"
]
}
},
"endpointIDexample-2":{
"ChannelType":"EMAIL",
"Address":"alejandror@example.com",
"EndpointStatus":"ACTIVE",
"OptOut":"NONE",
"EffectiveDate":"2020-02-26T18:56:24.897Z",
"Attributes":{
"AddressType":[
"primary"
]
},
"User":{
"UserId":"AlejandroRosalez",
"UserAttributes":{
"LastName ":[
"Rosalez"
],
"FirstName":[
"Alejandro"
],
"Neighborhood":[
"West Bay"
]
}
},
"RecommendationItems":[
"1210",
"6542",
"4582"
],
"CreationDate":"2020-02-26T18:56:24.897Z",
"Recommendations":{
"Title":[
"Hanna",
"Hunters",
"Agatha Christie\'s The ABC Murders"
],
"Genre":[
"Action",
"Drama",
"Crime"
]
}
}
}
在前面的示例中,函数修改了它收到的 Endpoints
对象并返回了结果。现在,每个端点的 Endpoint
对象包含一个新 Recommendations
对象,其中包含 Title
和 Genre
字段。其中的每个字段存储由三个值(作为字符串)组成的有序数组,其中的每个值为 RecommendationItems
字段中的相应建议项目提供改进的内容。