Amazon Pinpoint
開発者ガイド

AWS Lambda を使用したカスタムチャネルの作成

これはパブリックベータリリースの機能に関するプレリリースドキュメントです。このドキュメントは変更される可能性があります。

Amazon Pinpoint はモバイルプッシュ、E メール、および SMS 用のチャネルをサポートします。ただし、一部のメッセージングユースケースでは、サポートされていないチャネルが必要になる場合もあります。たとえば、Facebook Messenger などのインスタントメッセージングサービスにメッセージを送信したり、ウェブアプリケーション内で通知を表示したりしたい場合があります。このような場合は、AWS Lambda を使用して、Amazon Pinpoint 外部でメッセージ配信を実行するカスタムチャネルを作成します。

AWS Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行するために使用できるコンピューティングサービスです。コードをパッケージ化して Lambda 関数として Lambda にアップロードします。Lambda は関数が呼び出されたときに関数を実行します。この操作は手動で行うことも、イベントへの応答で自動的に行うこともできます。

詳細については、『AWS Lambda Developer Guide』の「Lambda 関数」を参照してください。

カスタムチャネルを作成するには、Amazon Pinpoint キャンペーンのメッセージ配信を処理する Lambda 関数を定義します。次に、キャンペーンの CampaignHook 設定 (キャンペーンリソース) を定義して、関数をキャンペーンに割り当てます。これらの設定には、Lambda 関数名と CampaignHook モードが含まれます。モードを DELIVERY に設定することで、Amazon Pinpoint の代わりに Lambda 関数がメッセージの配信を処理することを指定します。

キャンペーンに割り当てる Lambda 関数を、Amazon Pinpoint の拡張機能と呼びます。

CampaignHook 設定が定義されると、Amazon Pinpoint はキャンペーンを実行するときに、キャンペーンのメッセージを標準チャネルに送信することなく、自動的に Lambda 関数を呼び出します。その代わり、Amazon Pinpoint はメッセージ配信に関するイベントデータを関数に送信し、それにより関数は配信を処理できます。このイベントデータには、メッセージ本文と、メッセージの配信先のエンドポイントのリストが含まれます。

Amazon Pinpoint は、関数を正常に呼び出すと、キャンペーンの送信成功イベントを生成します。

注記

また、CampaignHook 設定を使用して、Amazon Pinpoint がキャンペーンのメッセージを配信する前に、キャンペーンのセグメントを変更して返す Lambda 関数を割り当てることもできます。詳細については、「AWS Lambda を使用したセグメントのカスタマイズ」を参照してください。

AWS Lambda を使用してカスタムチャネルを作成するには、Amazon Pinpoint によって送信されたイベントデータを受け取り、メッセージ配信を処理する関数を最初に関数を作成します。次に、Lambda 関数ポリシーを割り当てて関数を呼び出すことを Amazon Pinpoint に許可します。最後に、CampaignHook 設定を定義して、1 つ以上のキャンペーンに関数を割り当てます。

イベントデータ

Amazon Pinpoint が Lambda 関数を呼び出すときに、イベントデータとして次のペイロードを提供します。

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

イベントデータは次の属性を提供します。

  • MessageConfiguration – Amazon Pinpoint API の メッセージリソースDirectMessageConfiguration オブジェクトと同じ構造を持つ。

  • ApplicationId – キャンペーンが属する Amazon Pinpoint プロジェクトの ID。

  • CampaignId – 関数が呼び出される Amazon Pinpoint プロジェクトの ID。

  • TreatmentId – A/B テストに使用されるキャンペーンバリエーションの ID。

  • ActivityId – キャンペーンによって実行中のアクティビティの ID。

  • ScheduledTime – キャンペーンのメッセージが ISO 8601 形式で配信されるスケジュール時間。

  • Endpoints – エンドポイント ID をエンドポイント定義と関連付けるマップ。各イベントデータのペイロードには最大 50 のエンドポイントが含まれます。キャンペーンセグメントに 50 以上のエンドポイントが含まれる場合、Amazon Pinpoint はすべてのエンドポイントが処理されるまで、繰り返し関数を呼び出します (最大で一度に 50 のエンドポイント)。

Lambda 関数の作成

Lambda 関数を作成するには、『AWS Lambda Developer Guide』の「Lambda 関数のビルド」を参照してください。

Lambda 関数の例

次の例では、Amazon Pinpointがキャンペーンを実行するときに Lambda 関数がイベントデータを受け取り、キャンペーンのメッセージを Facebook Messenger に送信します。

"use strict"; var https = require("https"); var q = require("q"); var VERIFY_TOKEN = "my_token"; var PAGE_ACCESS_TOKEN = "EAF...DZD"; /* this constant can be put in a constants file and shared between this function and your Facebook Messenger webhook code */ var FACEBOOK_MESSENGER_PSID_ATTRIBUTE_KEY = "facebookMessengerPsid"; exports.handler = function(event, context, callback) { var deliverViaMessengerPromises = []; if (event.Message && event.Endpoints) { for (var endpoint in event.Endpoints) { if (isFbookMessengerActive(event.Endpoints[endpoint])) { deliverViaMessengerPromises.push(deliverViaMessenger(event.Message, event.Endpoints[endpoint].User)); } } } /* default OK response */ var response = { body: "ok", statusCode: 200 }; if (deliverViaMessengerPromises.length > 0) { q.all(deliverViaMessengerPromises).done(function() { callback(null, response); }); } else { callback(null, response); } } /** Example Pinpoint Endpoint User object where we've added custom attribute facebookMessengerPsid to store the PSID needed by Facebook's API { "UserId": "7a9870b7-493c-4521-b0ca-08bbbc36e595", "UserAttributes": { "facebookMessengerPsid": [ "1667566386619741" ] } } **/ function isFbookMessengerActive(endpoint) { return endpoint.User && endpoint.User.UserAttributes && endpoint.User.UserAttributes[FACEBOOK_MESSENGER_PSID_ATTRIBUTE_KEY]; } /** Sample message object from Pinpoint. This sample was an SMS so it has "smsmessage" attribute but this will vary for each messaging channel { "smsmessage": { "body": "This message should be intercepted by a campaign hook." } } **/ function deliverViaMessenger(message, user) { var deferred = q.defer(); var messageText = message["smsmessage"]["body"]; var pinpointUserId = user.UserId; var facebookPsid = user.UserAttributes[FACEBOOK_MESSENGER_PSID_ATTRIBUTE_KEY][0]; console.log("Sending message for user %s and page %s with message:", pinpointUserId, facebookPsid, messageText); var messageData = { recipient: { id: facebookPsid }, message: { text: messageText } }; var body = JSON.stringify(messageData); var path = "/v2.6/me/messages?access_token=" + PAGE_ACCESS_TOKEN; var options = { host: "graph.facebook.com", path: path, method: "POST", headers: { "Content-Type": "application/json" } }; var req = https.request(options, httpsCallback); req.on("error", function(e) { console.log("Error posting to Facebook Messenger: " + e); deferred.reject(e); }); req.write(body); req.end(); return deferred.promise; function httpsCallback(response) { var str = ""; response.on("data", function(chunk) { str += chunk; }); response.on("end", function() { console.log(str); deferred.resolve(response); }); } }

Lambda 関数ポリシーの割り当て

Lambda 関数を使用してエンドポイントを処理する前に、Amazon Pinpoint に Lambda 関数の呼び出しを許可する必要があります。呼び出しのアクセス許可を付与するには、関数に Lambda 関数ポリシーを割り当てます。Lambda 関数ポリシーはリソースベースのアクセス許可ポリシーで、関数を使用できるエンティティと、それらのエンティティが実行できるアクションを指定します。

詳細については、『AWS Lambda Developer Guide』の「AWS Lambda でリソースベースのポリシーを使用する (Lambda 関数ポリシー)」を参照してください。

関数ポリシーの例

次のポリシーでは、lambda:InvokeFunction アクションを使用するアクセス許可を、Amazon Pinpoint サービスプリンシパルに付与します。

{ "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": { "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:account-id:/apps/application-id/campaigns/campaign-id" } } }

関数ポリシーは、Condition キーを含む AWS:SourceArn ブロックを必要とします。このコードは、関数を呼び出すために許可される Amazon Pinpoint キャンペーンを指定します。この例では、ポリシーは 1 つのキャンペーン ID のみにアクセス許可を付与します。より一般的なポリシーを記述するには、複数文字に一致するワイルドカード (*) を使用します。たとえば、次の Condition ブロックを使用して、AWS アカウントの任意の Amazon Pinpoint キャンペーンに関数の呼び出しを許可できます。

"Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:account-id:/apps/*/campaigns/*" } }

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-arn arn:aws:mobiletargeting:us-east-1:account-id:/apps/application-id/campaigns/campaign-id

--source-arn パラメータのキャンペーン ID を指定する場合は、Amazon Pinpoint の get-campaigns コマンドと AWS CLI を使用して、キャンペーン ID を参照できます。このコマンドには、--application-id パラメータが必要です。アプリケーション ID を参照するには、https://console.aws.amazon.com/pinpoint/ で Amazon Pinpoint コンソールにサインインし、[Projects] ページに移動します。コンソールには各プロジェクトの [ID] が表示されます。これはプロジェクトのアプリケーション ID です。

Lambda の add-permission コマンドを実行すると、AWS 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\"}}}" }

Statement 値は Lambda 関数ポリシーに追加されたステートメントの JSON 文字列バージョンです。

キャンペーンへの Lambda 関数の割り当て

Lambda 関数は個別の Amazon Pinpoint キャンペーンに割り当てることができます。または、個別に関数を割り当てるキャンペーンを除いて、プロジェクトのすべてのキャンペーンで使用されるデフォルトとして、Lambda 関数を設定できます。

Lambda 関数を個別のキャンペーンに割り当てるには、Amazon Pinpoint API を使用して キャンペーン オブジェクトを作成または更新し、その CampaignHook 属性を定義します。プロジェクトのすべてのキャンペーン用にデフォルトとして Lambda 関数を設定するには、そのプロジェクト用の設定リソースを作成または更新し、その CampaignHook オブジェクトを定義します。

いずれの場合も、次の CampaignHook 属性を設定します。

  • LambdaFunctionName – キャンペーンのメッセージを送信するために Amazon Pinpoint が呼び出す Lambda 関数の名前または ARN。

  • Mode – 「DELIVERY」に設定します。このモードでは、Amazon Pinpoint は関数を使用してキャンペーンのメッセージを配信します。標準チャネルを通じたメッセージの送信は試みません。