PinpointのWebhookカスタムチャネルを試してみた

2022.09.05

こんにちは。たかやまです。

PinpointにはLambdaやWebhookを呼び出すカスタムチャネル機能があります。

Lambdaを使用したカスタムチャネルの使い方はちらほらブログがありますが、Webhookを使ったカスタムチャネルの情報がなかったので今回こちらの機能をためしてみたいと思います。

さきにまとめ

  • Webhookを利用するには対象のWebhookのレスポンスヘッダにX-Amz-Pinpoint-AccountIdにアカウントIDが含まれている必要がある
  • レスポンスヘッダの仕様もあり、直接SaaSのWebhookを呼び出す機能ではない

やってみた

Webhookカスタムチャネルの仕様確認

Webhook.site作成

冒頭で書いている通り、SaaSのWebhookは使えないのですが試しにWebhook.siteで生成したWebhookを登録してみたいと思います。

サイトを開くと自動でWebhook用のURLが生成されるのでこちらを控えます。

セグメント作成

静的セグメント作成します。
検証用にダミーのカスタムセグメントを用意します。

ChannelType,Address,User.UserAttributes.Name
CUSTOM,dummy,たかやま

キャンペーン作成

次にWebhookを呼び出すキャンペーンを作成します。

チャネルはカスタムを選択します。

セグメントはさきほど作成したものを指定します。

チャネルタイプをURL、送信先のチャネルURLに最初に作成したWebhook.siteのURLを指定します。

キャンペーンの送信タイミングは即時を選択し、キャンペーンを起動します。

この時点では、以下のエラーメッセージが出てきてキャンペーンを作成できないことがわかります。

"Message" : "Amazon Pinpoint received an invalid response from the resource at the specified URL. Verify that you specified the correct URL."

Webhook.siteを確認すると、登録時にPinpointがHEADリクエストを飛ばしていることが確認できます。

この時に、レスポンスヘッダーにX-Amz-Pinpoint-AccountIdに自身のアカウントIDが含まれていなければWebhookを登録できない仕様となっています。

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

ちなみにWebhook.siteのレスポンスヘッダーの内容はこちらです。
X-Amz-Pinpoint-AccountIdは含まれてないですね。

$curl -I https://webhook.site/9f9319f5-cdfc-4d7d-8923-d338ba35ea56
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/plain; charset=UTF-8
Vary: Accept-Encoding
X-Request-Id: 5c44e8b1-93d1-4fd1-9b4e-0592a9515499
X-Token-Id: 9f9319f5-cdfc-4d7d-8923-d338ba35ea56
Cache-Control: no-cache, private
Date: Sun, 04 Sep 2022 14:30:00 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: *
Access-Control-Expose-Headers: Content-Length,Content-Range

Webhookを作成してカスタムチャネルに登録してみる

今度はレスポンスヘッダーを設定したWebhookを用意して、カスタムチャネルに登録していきたいと思います。

API Gateway

API GatewayでレスポンスヘッダーにX-Amz-Pinpoint-AccountIdを設定したWebhookを用意します。

REST APIで作成していきます。

プロトコルの選択では、RESTで新規APIを作成します。

レスポンスヘッダーを設定したいだけなので、MockHEADメソッドを作成していきます。

メソッドレスポンスX-Amz-Pinpoint-AccountIdヘッダーを設定します。

統合レスポンスにさきほど設定した X-Amz-Pinpoint-AccountId ヘッダーに自身のアカウントIDを設定します。
※この時マッピングの値はシングルクォート''で囲んでください。

Webhook受け用のPOSTメソッドを設定していきます。

事前にeventをログ出力するLambdaを作成しておきます。

セットアップで作成したLambdaを指定します。

HEAD、POSTメソッド設定後、デプロイを実施します。

作成されたURLをメモします。

Pinpoint

再度キャンペーン作成を行い、送信先のチャネルURLに作成したAPI GatwayのURLを指定します。

キャンペーン作成を実施すると、今回は無事作成できることが確認できます。

Lambdaのログを確認すると、キャンペーン作成時に指定したセグメント情報が送られていることがわかります。

{
    "Message": {},
    "ApplicationId": "8b18ad998c564f3083b15099ce86feef",
    "CampaignId": "eb25534521024be2ae1b2f557ee3c18a",
    "TreatmentId": "0",
    "ActivityId": "f59bf0736d674e949b9151fffc1bfc78",
    "ScheduledTime": "2022-09-05T04:40:29.390Z",
    "Endpoints": {
        "gpw4beabbyf3d3puqv4wjadl5xs": {
            "ChannelType": "CUSTOM",
            "Address": "dummy",
            "EndpointStatus": "ACTIVE",
            "OptOut": "NONE",
            "EffectiveDate": "2022-09-04T08:25:00.784Z",
            "User": {
                "UserAttributes": {
                    "Name": [
                        "たかやま"
                    ]
                }
            },
            "CohortId": "96",
            "CreationDate": "2022-09-04T08:00:24.731Z"
        }
    }
}

あとは、Lambda側でこのセグメント情報をもとによしなに処理する実装をしていく形になります。

やってみて

試した通りレスポンスヘッダーの仕様もあるため、外部SaaSを直接呼び出すといった使い方はできません。

すでに管理しているWebhookがあり、Pinpointと連携したいといったユースケースがある場合にはこちらのWebhookカスタムチャネルをご活用できるのかなと思います。
(他にいいユースケースがあれば教えて下さい!)

新規にカスタムチャネルを利用する場合には、Lambdaを直接呼び出すのが簡単で良いかと思います。

最後に

カスタムチャネルのユースケースでLambdaを使うパターンはいくつかありますが、Webhookの使ったケースがなかったのでブログにしてみました。

当初はSaaSのWebhookを呼び出せるものかと思ってましたが、そういうものではないと使ってみてわかりました。

ぜひ、Webhookカスタムチャネルを試してみたい方の参考になれば幸いです。

以上、たかやまで(@nyan_kotaroo)した。