使用函數 AWS Lambda 自訂 Amazon Pinpoint 區段 - Amazon Pinpoint

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用函數 AWS Lambda 自訂 Amazon Pinpoint 區段

這是公共測試版中某個功能的預先發布文件。內容可能變動。

您可以使用 AWS Lambda 來自訂 Amazon Pinpoint 行銷活動如何吸引目標受眾。使用 AWS Lambda,您可以在 Amazon Pinpoint 傳送行銷活動訊息的那一刻修改行銷活動的區段。

AWS Lambda 是一項運算服務,您可以用來執行程式碼,而無需佈建或管理伺服器。您可以封裝程式碼,並以 Lambda 函數的形式上傳至 Lambda。Lambda 在調用函數時會執行函數,這可由您手動完成,也可以根據事件自動完成。如需詳細資訊,請參閱《AWS Lambda 開發人員指南》

若要將 Lambda 函數指派給行銷活動,您可以使用 Amazon Pinpoint 中的行銷活動資源來定義行銷活動CampaignHook的設定API。這些設定包括 Lambda 函數名稱,以及 CampaignHook 模式,該模式指定 Amazon Pinpoint 是否接收函數的回傳值。

您指派給行銷活動的 Lambda 函數稱為 Amazon Pinpoint 擴充功能

定義 CampaignHook 設定後,Amazon Pinpoint 會在執行行銷活動時,自動調用 Lambda 函數,然後才傳送行銷活動訊息。Amazon Pinpoint 調用該函數時,會提供訊息交付的相關事件資料。此資料包括行銷活動的客群,也就是 Amazon Pinpoint 傳送訊息的目的地端點的清單。

如果將 CampaignHook 模式設為 FILTER,Amazon Pinpoint 在傳送訊息之前,允許該函數修改和傳回客群。例如該函數可能使用包含 Amazon Pinpoint 外部來源的資料的屬性,更新端點定義。或者,該函數可能根據您的函數程式碼中的條件來移除特定端點,以篩選客群。Amazon Pinpoint 收到您函數修改過的客群後,會使用行銷活動的交付管道,將訊息傳送到客群的每個端點。

透過使用 處理 區段 AWS Lambda,您可以更好地控制傳送訊息的對象以及這些訊息包含的內容。您可以在傳送行銷活動訊息時,即時修改您的行銷活動。篩選客群可讓您吸引更嚴格定義的一部分客群。新增或更新端點屬性也能讓您提供用於訊息變數的新資料。

注意

您也可以使用 CampaignHook 設定,指派要處理訊息交付的 Lambda 函數。若要透過 Amazon Pinpoint 不支援的自訂頻道 (例如社群媒體平台) 傳遞訊息,這類函數很有用。如需詳細資訊,請參閱使用 Webhook 或 Lambda 函數在 Amazon Pinpoint 中建立自訂頻道

使用 Amazon Pinpoint 調用 Lambda 勾點時,Lambda 函數也必須位於與 Amazon Pinpoint 專案相同的區域。

若要使用 修改行銷活動區段 AWS Lambda,請先建立處理 Amazon Pinpoint 傳送之事件資料的函數,並傳回修改過的區段。接著指派 Lambda 函數政策,以授權 Amazon Pinpoint 調用函數。最後,透過定義 CampaignHook 設定來將函數指派給一或多個行銷活動。

如需更多程式碼範例,請參閱程式碼範例

事件資料

Amazon Pinpoint 調用 Lambda 函數時,會提供以下承載當作事件資料:

{ "MessageConfiguration": {Message configuration} "ApplicationId": ApplicationId, "CampaignId": CampaignId, "TreatmentId": TreatmentId, "ActivityId": ActivityId, "ScheduledTime": Scheduled Time, "Endpoints": { EndpointId: {Endpoint definition} . . . } }

AWS Lambda 會將事件資料傳遞至您的函數程式碼。事件資料可提供以下屬性:

  • MessageConfiguration – 與 Amazon Pinpoint 中訊息資源的DirectMessageConfiguration物件具有相同的結構API。

  • ApplicationId – 行銷活動所屬的 Amazon Pinpoint 專案的 ID。

  • CampaignId – 調用函數的 Amazon Pinpoint 行銷活動的 ID。

  • TreatmentId – 用於 A/B 測試的行銷活動版本的 ID。

  • ActivityId – 行銷活動正在執行的活動的 ID。

  • ScheduledTime – 將交付行銷活動訊息的日期和時間,採用 ISO 8601 格式。

  • Endpoints – 將端點IDs與端點定義建立關聯的地圖。每個事件資料承載包含最多 50 個端點。如果行銷活動客群包含超過 50 個端點,Amazon Pinpoint 會重複調用函數,一次最多呼叫 50 個端點,直到所有端點處理完畢為止。

建立 Lambda 函數

若要了解如何建立 Lambda 函數,請參閱 AWS Lambda 開發人員指南中的入門。建立函數時,請注意以下會造成訊息交付失敗的條件:

  • Lambda 函數超過 15 秒才傳回修改過的客群。

  • Amazon Pinpoint 不能對函數的回傳值解碼。

  • 此函數需要 Amazon Pinpoint 嘗試 3 次以上,才能成功調用。

Amazon Pinpoint 只接受函數傳回值中的端點定義。函數無法修改事件資料中的其他元素。

Lambda 函數範例

您的 Lambda 函數處理 Amazon Pinpoint 傳送的事件資料,並傳回修改後的端點,如以下在 Node.js 中編寫的範例處理程序所示:

'use strict'; exports.handler = (event, context, callback) => { for (var key in event.Endpoints) { if (event.Endpoints.hasOwnProperty(key)) { var endpoint = event.Endpoints[key]; var attr = endpoint.Attributes; if (!attr) { attr = {}; endpoint.Attributes = attr; } attr["CreditScore"] = [ Math.floor(Math.random() * 200) + 650]; } } console.log("Received event:", JSON.stringify(event, null, 2)); callback(null, event.Endpoints); };

Lambda 將事件資料當作為 event 參數,傳遞給處理常式。

在這個範例中,處理常式會逐一查看 event.Endpoints 物件中的每個端點,並將新的屬性 CreditScore 新增到端點。CreditScore 屬性的值只是隨機數字。

console.log() 陳述式會在 CloudWatch Logs 中記錄事件。

callback() 陳述式會將修改過的端點傳回 Amazon Pinpoint。一般而言,callback 參數在 Node.js Lambda 函數中並非必要,但在此情境中則是必要,因為 Lambda 函數必須將更新的端點傳回 Amazon Pinpoint。

您的函數必須以事件資料提供的相同格式傳回端點,這是將端點IDs與端點定義建立關聯的映射,如下列範例所示:

{ "eqmj8wpxszeqy/b3vch04sn41yw": { "ChannelType": "GCM", "Address": "4d5e6f1a2b3c4d5e6f7g8h9i0j1a2b3c", "EndpointStatus": "ACTIVE", "OptOut": "NONE", "Demographic": { "Make": "android" }, "EffectiveDate": "2017-11-02T21:26:48.598Z", "User": {} }, "idrexqqtn8sbwfex0ouscod0yto": { "ChannelType": "APNS", "Address": "1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f", "EndpointStatus": "ACTIVE", "OptOut": "NONE", "Demographic": { "Make": "apple" }, "EffectiveDate": "2017-11-02T21:26:48.598Z", "User": {} } }

範例函數會修改並傳回事件資料中收到的 event.Endpoints 物件。

在您傳回的端點定義中,您可以選擇性包含 TitleOverrideBodyOverride 屬性。

注意

您使用此解決方案傳送訊息時,只有在端點的 ChannelType 屬性值是 ADMAPNSAPNS_SANDBOXAPNS_VOIPAPNS_VOIP_SANDBOXBAIDUGCMSMS 時,Amazon Pinpoint 才會採用 TitleOverrideBodyOverride 屬性。

若端點的 ChannelType 屬性值是 EMAIL,Amazon Pinpoint 不會採用這些屬性。

指派 Lambda 函數政策

使用 Lambda 函數處理端點之前,必須先授權 Amazon Pinpoint 調用 Lambda 函數。若要授予調用許可,請將 Lambda 函數政策指派給 Lambda 函數。Lambda 函數政策是資源型許可政策,指定哪些實體可以使用函數,以及這些實體可以執行哪些動作。

詳情請參閱 AWS Lambda 開發人員指南中的為 AWS Lambda使用資源型政策

範例函數政策

下列政策授予 Amazon Pinpoint 服務主體許可,以針對特定行銷活動使用 lambda:InvokeFunction動作 (campaign-id):

{ "Sid": "sid", "Effect": "Allow", "Principal": { "Service": "pinpoint.us-east-1.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "{arn:aws:lambda:us-east-1:account-id:function:function-name}", "Condition": { "StringEquals": { "AWS:SourceAccount": "111122223333" }, "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:account-id:apps/application-id/campaigns/campaign-id" } } }

您的函數政策需要 Condition 區塊,其包含一個 AWS:SourceArn 金鑰。此程式碼指明允許哪個 Amazon Pinpoint 行銷活動調用函數。在此範例中,政策會授予僅單一行銷活動的許可。Condition 區塊也必須包含金鑰,該AWS:SourceAccount金鑰可控制哪些 AWS 帳戶可以叫用 動作。

若要編寫較一般的政策,請使用多字元比對萬用字元 (*)。例如,您可以使用下列Condition區塊來允許特定 Amazon Pinpoint 專案 (application-id) 來叫用函數:

... "Condition": { "StringEquals": { "AWS:SourceAccount": "111122223333" }, "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:account-id:apps/application-id/campaigns/*" } } ...

如果您要將 Lambda 函數設成專案中所有行銷活動的預設函數,建議您以上述方式設定政策的 Condition 區塊。如需將 Lambda 函數設為專案中所有行銷活動的預設函數的相關資訊,請參閱 將 Lambda 函數指派給行銷活動

授予 Amazon Pinpoint 調用許可

您可以使用 AWS Command Line Interface (AWS CLI) 將許可新增至指派給 Lambda 函數的 Lambda 函數政策。若要允許 Amazon Pinpoint 調用特定行銷活動的函數,請使用 Lambda add-permission 命令,如以下範例所示:

$ aws lambda add-permission \ > --function-name function-name \ > --statement-id sid \ > --action lambda:InvokeFunction \ > --principal pinpoint.us-east-1.amazonaws.com \ > --source-account 111122223333 > --source-arn arn:aws:mobiletargeting:us-east-1:account-id:apps/application-id/campaigns/campaign-id

您可以使用 中的 IDs get-campaigns 命令來查詢行銷活動 AWS CLI。您也可以使用 get-apps 命令,尋找您的應用程式 ID。

當您執行 Lambda add-permission 命令時,Lambda 會傳回以下輸出:

{ "Statement": "{\"Sid\":\"sid\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"pinpoint.us-east-1.amazonaws.com\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:function-name\", \"Condition\": {\"ArnLike\": {\"AWS:SourceArn\": \"arn:aws:mobiletargeting:us-east-1:111122223333:apps/application-id/campaigns/campaign-id\"}} {\"StringEquals\": {\"AWS:SourceAccount\": \"111122223333\"}}} }

Statement值是新增至 Lambda 函數政策的陳述式的JSON字串版本。

將 Lambda 函數指派給行銷活動

您可以將 Lambda 函數指派給個別 Amazon Pinpoint 行銷活動。或者,您可以將 Lambda 函數設為專案中所有行銷活動的預設值 (個別指派函數的行銷活動除外)。

若要將 Lambda 函數指派給個別行銷活動,請使用 Amazon Pinpoint API 建立或更新Campaign物件,並定義其CampaignHook屬性。若要將 Lambda 函數設為專案中所有行銷活動的預設值,請建立或更新該專案的 Settings 資源,並定義其 CampaignHook 物件。

在這兩種情況下,設定下列 CampaignHook 屬性:

  • LambdaFunctionName – Amazon Pinpoint 在傳送行銷活動的訊息之前叫用 ARN Lambda 函數的名稱或 。

  • Mode – 設為 FILTER。在此模式下,Amazon Pinpoint 調用函數並等待函數傳回修改過的端點。等到收到端點,Amazon Pinpoint 再傳送訊息。Amazon Pinpoint 等待最多 15 秒,才確認訊息交付失敗。

Amazon Pinpoint 在傳送行銷活動訊息之前,會使用為行銷活動定義的 CampaignHook 設定,調用指定的 Lambda 函數。Amazon Pinpoint 等待從函數接收修改過的端點。如果 Amazon Pinpoint 收到已更新的端點,會使用已更新的端點資料,繼續訊息交付。