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 を使用して Campaign オブジェクトを作成または更新します。

キャンペーン内の 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 デベロッパーガイド』の「Building Lambda functions」を参照してください。

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 console. メトリクスは、PinPointCustomChannelExecution 名前空間で使用できます。

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

Lambda 関数レスポンス形式 Amazon Pinpoint

カスタムチャネルアクティビティの後にジャーニー多変量または yes/no 分割を使用してエンドポイントパスを決定する場合は、Lambda 関数の応答を Amazon Pinpoint が理解できる形式に構成し、エンドポイントを正しいパスに送信する必要があります。

レスポンスの構造は次のようになります。

{ 
    <Endpoint ID 1>:{
        EventAttributes: {
            <Key1>: <Value1>,
            <Key2>: <Value2>, 
            ...
        } 
    }, 
    <Endpoint ID 2>:{ 
        EventAttributes: {
            <Key1>: <Value1>,
            <Key2>: <Value2>, 
            ...
        } 
    }, 
... 
}

これにより、エンドポイントのパスを決定するキーと値を選択できます。

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/* --source-account 111122223333

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

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

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

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

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

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

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

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

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

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