Amazon Pinpoint を使用したカスタムチャネルの作成 - Amazon Pinpoint

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

Amazon Pinpoint には、プッシュ通知、E メール、SMS、音声チャネルによるメッセージの送信の組み込みサポートが含まれています。カスタムチャネルを作成することで、Amazon Pinpoint が他のチャネル経由でメッセージを送信するように設定することもできます。Amazon Pinpoint のカスタムチャネルを使用すると、サードパーティーサービスを含む、API を持つサービスを通じてメッセージを送信できます。Webhook を使用するか、AWS Lambda 関数を呼び出して API を操作できます。

カスタムチャネルキャンペーンを送信するセグメントには、すべてのタイプのエンドポイント (つまり、ChannelType 属性の値が EMAL、VOICE、SMS、CUSTOM、またはさまざまなプッシュ通知エンドポイントタイプの 1 つであるエンドポイント) を含めることができます。

カスタムチャネル経由でメッセージを送信するキャンペーンの作成

Lambda 関数または Webhook を個別のキャンペーンに割り当てるには、Amazon Pinpoint API を使用してキャンペーンオブジェクトを作成または更新します。

キャンペーン内の MessageConfiguration オブジェクトには CustomMessage オブジェクトも含まれている必要があります。このオブジェクトには、1 つのメンバー (Data) があります。Data の値は、カスタムチャネルに送信するメッセージペイロードを含む JSON 文字列です。

キャンペーンには CustomDeliveryConfiguration オブジェクトが含まれている必要があります。CustomDeliveryConfiguration オブジェクト内で、以下を指定します。

  • EndpointTypes – カスタムチャネルキャンペーンの送信先となるすべてのエンドポイントタイプを含む配列。このチャネルには、次のチャネルタイプのいずれか、またはすべてを含めることができます。

    • ADM

    • APNS

    • APNS_SANDBOX

    • APNS_VOIP

    • APNS_VOIP_SANDBOX

    • BAIDU

    • CUSTOM

    • EMAIL

    • GCM

    • SMS

    • VOICE

  • DeliveryUri – エンドポイントの送信先。以下のいずれかを 1 つだけ指定できます。

    • キャンペーンの実行時に実行する Lambda 関数の Amazon リソースネーム (ARN)。

    • キャンペーンの実行時にエンドポイントデータを送信する Webhook の URL。

注記

Campaign オブジェクトには、Hook オブジェクトを含めることもできます。このオブジェクトは、キャンペーンが実行されたときに Lambda 関数によってカスタマイズされるセグメントを作成するためにのみ使用されます。詳細については、「AWS Lambda を使用したセグメントのカスタマイズ」を参照してください。

Amazon Pinpoint がカスタムチャネルに送信するイベントデータについて

カスタムチャネル経由でメッセージを送信する Lambda 関数を作成する前に、Amazon Pinpoint が送信するデータについて理解しておく必要があります。Amazon Pinpoint キャンペーンがカスタムチャネル経由でメッセージを送信すると、次の例のようなターゲット Lambda 関数にペイロードが送信されます。

{ "Message":{}, "Data":"The payload that's provided in the CustomMessage object in MessageConfiguration", "ApplicationId":"3a9b1f4e6c764ba7b031e7183example", "CampaignId":"13978104ce5d6017c72552257example", "TreatmentId":"0", "ActivityId":"575cb1929d5ba43e87e2478eeexample", "ScheduledTime":"2020-04-08T19:00:16.843Z", "Endpoints":{ "1dbcd396df28ac6cf8c1c2b7fexample":{ "ChannelType":"EMAIL", "Address":"mary.major@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "Location":{ "City":"Seattle", "Country":"USA" }, "Demographic":{ "Make":"OnePlus", "Platform":"android" }, "EffectiveDate":"2020-04-01T01:05:17.267Z", "Attributes":{ "CohortId":[ "42" ] }, "CreationDate":"2020-04-01T01:05:17.267Z" } } }

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

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

  • CampaignId – Lambda 関数を呼び出した Amazon Pinpoint プロジェクトの ID。

  • TreatmentId – キャンペーンバリアントの ID。標準キャンペーンを作成した場合、この値は常に 0 です。A/B テストキャンペーンを作成した場合、この値は 0~4 の整数です。

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

  • ScheduledTime – Amazon Pinpoint がキャンペーンを実行した時刻。ISO 8601 形式で表示されます。

  • Endpoints – キャンペーンのターゲットとなったエンドポイントのリスト。各ペイロードには、最大 50 のエンドポイントを含めることができます。キャンペーンの送信先セグメントに 50 以上のエンドポイントが含まれている場合、Amazon Pinpoint はすべてのエンドポイントが処理されるまで、繰り返し関数を呼び出します (最大で一度に 50 のエンドポイント)。

このサンプルデータは、カスタムチャネルの Lambda 関数を作成およびテストするときに使用できます。

Webhook の設定

Webhook を使用してカスタムチャネルメッセージを送信する場合、Webhook の URL は「https://」で始まる必要があります。Webhook URL には、英数字と次の記号のみを含めることができます。ハイフン (-)、ピリオド (.)、アンダースコア (_)、チルダ (~)、疑問符 (?)、スラッシュ (/)、ポンドまたはハッシュ記号 (#)、セミコロン (:)。URL は RFC3986 に準拠している必要があります。

Webhook URL を指定するキャンペーンを作成すると、Amazon Pinpoint はその URL に HTTP HEAD を発行します。HEAD リクエストに対する応答には、X-Amz-Pinpoint-AccountId というヘッダーが含まれている必要があります。このヘッダーの値は、AWS アカウント ID と同じである必要があります。

Lambda 関数の設定

このセクションでは、カスタムチャネル経由でメッセージを送信する Lambda 関数を作成するときに必要な手順の概要を説明します。まず、関数を作成します。その後、関数に実行ポリシーを追加します。このポリシーにより、Amazon Pinpoint はキャンペーンの実行時にポリシーを実行できます。

Lambda 関数の作成の概要については、AWS Lambda Developer Guideの「Lambda 関数の構築」を参照してください。

Lambda 関数の例

次のコード例では、ペイロードを処理し、CloudWatch の各エンドポイントタイプのエンドポイントの数を記録します。

import boto3 import random import pprint import json import time cloudwatch = boto3.client('cloudwatch') def lambda_handler(event, context): customEndpoints = 0 smsEndpoints = 0 pushEndpoints = 0 emailEndpoints = 0 voiceEndpoints = 0 numEndpoints = len(event['Endpoints']) print("Payload:\n", event) print("Endpoints in payload: " + str(numEndpoints)) for key in event['Endpoints'].keys(): if event['Endpoints'][key]['ChannelType'] == "CUSTOM": customEndpoints += 1 elif event['Endpoints'][key]['ChannelType'] == "SMS": smsEndpoints += 1 elif event['Endpoints'][key]['ChannelType'] == "EMAIL": emailEndpoints += 1 elif event['Endpoints'][key]['ChannelType'] == "VOICE": voiceEndpoints += 1 else: pushEndpoints += 1 response = cloudwatch.put_metric_data( MetricData = [ { 'MetricName': 'EndpointCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': len(event['Endpoints']) }, { 'MetricName': 'CustomCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': customEndpoints }, { 'MetricName': 'SMSCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': smsEndpoints }, { 'MetricName': 'EmailCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': emailEndpoints }, { 'MetricName': 'VoiceCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': voiceEndpoints }, { 'MetricName': 'PushCount', 'Dimensions': [ { 'Name': 'CampaignId', 'Value': event['CampaignId'] }, { 'Name': 'ApplicationId', 'Value': event['ApplicationId'] } ], 'Unit': 'None', 'Value': pushEndpoints }, { 'MetricName': 'EndpointCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': len(event['Endpoints']) }, { 'MetricName': 'CustomCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': customEndpoints }, { 'MetricName': 'SMSCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': smsEndpoints }, { 'MetricName': 'EmailCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': emailEndpoints }, { 'MetricName': 'VoiceCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': voiceEndpoints }, { 'MetricName': 'PushCount', 'Dimensions': [ ], 'Unit': 'None', 'Value': pushEndpoints } ], Namespace = 'PinpointCustomChannelExecution' ) print("cloudwatchResponse:\n",response)

Amazon Pinpoint キャンペーンがこの Lambda 関数を実行すると、Amazon Pinpoint はセグメントメンバーのリストを関数に送信します。この関数は、それぞれの ChannelType のエンドポイントの数をカウントします。次に、そのデータを Amazon CloudWatch に送信します。これらのメトリクスは、CloudWatch コンソールの [メトリクス] セクションで確認できます。メトリクスは、PinPointCustomChannelExecution 名前空間で使用できます。

このコード例を変更して、このサービスを通じてメッセージを送信するために、外部サービスの API に接続するようにもできます。

Lambda 関数を呼び出すための Amazon Pinpoint アクセス許可の付与

AWS Command Line Interface (AWS CLI) を使用して、Lambda 関数に割り当てられた Lambda 関数ポリシーにアクセス許可を追加できます。Amazon Pinpoint に関数の呼び出しを許可するには、次の例に示すように Lambda add-permission コマンドを使用します。

aws lambda add-permission \ --function-name myFunction \ --statement-id sid0 \ --action lambda:InvokeFunction \ --principal pinpoint.us-east-1.amazonaws.com \ --source-arn arn:aws:mobiletargeting:us-east-1:111122223333:apps/*

上記のコマンドで、次の操作を行います。

  • myFunction を Lambda 関数の名前に置き換えます。

  • us-east-1 を、Amazon Pinpoint を使用する AWS リージョンに置き換えます。

  • 111122223333 を AWS アカウント ID に置き換えます。

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:myFunction\", \"Condition\": {\"ArnLike\": {\"AWS:SourceArn\": \"arn:aws:mobiletargeting:us-east-1:111122223333:apps/*\"}}}" }

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

実行ポリシーのその他の制限

特定の Amazon Pinpoint プロジェクトに制限することで、実行ポリシーを変更できます。これを行うには、前の例にある * をプロジェクトの一意の ID に置き換えます。ポリシーを特定のキャンペーンに限定することで、ポリシーをさらに制限できます。たとえば、プロジェクト ID dbaf6ec2226f0a9a8615e3ea5example のプロジェクトで、キャンペーン ID 95fee4cd1d7f5cd67987c1436example を持つキャンペーンのみを許可するようにポリシーを制限するには、source-arn 属性に次の値を使用します。

arn:aws:mobiletargeting:us-east-1:111122223333:apps/dbaf6ec2226f0a9a8615e3ea5example/campaigns/95fee4cd1d7f5cd67987c1436example
注記

Lambda 関数の実行を特定のキャンペーンに制限する場合は、まず、制限の少ないポリシーを使用して関数を作成する必要があります。次に、Amazon Pinpoint でキャンペーンを作成し、機能を選択する必要があります。最後に、指定したキャンペーンを参照するように実行ポリシーを更新する必要があります。