AWS Lambda を使用した推奨事項のカスタマイズ - Amazon Pinpoint

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Lambda を使用した推奨事項のカスタマイズ

Amazon Pinpoint では、推奨モデルからパーソナライズされた推奨事項を取得して、キャンペーンおよびジャーニーから送信するメッセージに追加できます。推奨モデルは、データ内のパターンを検出し、検出されたパターンに基づいて予測と推奨事項を生成する機械学習 (ML) モデルの一種です。これにより、特定のユーザーが製品や商品の特定のセットから好むものが予測され、その情報がユーザーに対する推奨事項のセットとして提供されます。

Amazon Pinpoint で推奨モデルを使用して、各受信者の属性と動作に基づいてパーソナライズされた推奨事項をメッセージ受信者に送信できます。また、AWS Lambdaでは、これらの推奨事項をカスタマイズおよび強化することもできます。たとえば、推奨事項を 1 つのテキスト値 (製品名や ID など) からより洗練されたコンテンツ (製品名、説明、イメージ画像など) に動的に変換できます。さらに、Amazon Pinpoint がメッセージを送信するときにその変換をリアルタイムで実行できます。

この機能は以下の AWS リージョンで利用できます。米国東部 (バージニア北部)、米国西部 (オレゴン)、アジアパシフィック (ムンバイ)、アジアパシフィック (シドニー)、欧州 (アイルランド)

メッセージで推奨事項を使用する

Amazon Pinpoint で推奨モデルを使用するには、まず Amazon Personalize ソリューションを作成し、そのソリューションを Amazon Personalize キャンペーンとしてデプロイします。次に、Amazon Pinpoint で推奨モデルの構成を作成します。構成では、Amazon Personalize キャンペーンから推奨事項データを取得して処理する方法を決定する設定を指定します。これには、取得したデータの追加処理を実行する AWS Lambda 関数を呼び出すかどうかが含まれます。

Amazon Personalize は、アプリケーションを利用する顧客に対して、リアルタイムでパーソナライズされた推奨事項を提供するMLモデルの作成を支援するための AWS サービスです。Amazon Personalize では、ML モデルを作成してトレーニングし、Amazon Personalize キャンペーンとしてモデルを準備してデプロイするプロセスを説明します。その後、キャンペーンからパーソナライズされたリアルタイムの推奨事項を取得できます。Amazon Personalize の詳細については、『Amazon Personalize デベロッパーガイド』を参照してください。。

AWS Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行するために使用できるコンピューティングサービスです。コードをパッケージ化し、[Lambda 関数] として AWS Lambda にアップロードします。関数が呼び出されると AWS Lambda は関数を実行します。関数は、ユーザーが手動で呼び出したり、イベントに応答して自動的に呼び出したり、Amazon Pinpoint などのアプリケーションやサービスからのリクエストに応答したりすることができます。Lambda 関数の作成および呼び出しについては、『AWS Lambda デベロッパーガイド』を参照してください。

推奨モデルの Amazon Pinpoint 構成を作成した後、キャンペーンおよびジャーニーから送信するメッセージにモデルからの推奨事項を追加できます。これを行うには、推奨属性のメッセージ変数を含むメッセージテンプレートを使用します。推奨属性は、推奨事項データを保存するよう設計された動的エンドポイントまたはユーザー属性です。これらの属性は、推奨モデルの構成を作成するときに定義します。

次のタイプのメッセージテンプレートでは、推奨属性の変数を使用できます。

  • メールテンプレート。キャンペーンまたはジャーニーから送信する E メールメッセージ用。

  • プッシュ通知テンプレート。キャンペーンから送信するプッシュ通知用。

  • SMS テンプレート。キャンペーンから送信する SMS テキストメッセージ用。

Amazon Pinpoint での推奨モデルの使用に関する詳細は、『Amazon Pinpoint ユーザーガイド』の「機械学習モデル」を参照してください。

推奨事項データを処理する Lambda 関数を呼び出すよう Amazon Pinpoint を設定した場合、Amazon Pinpoint は、キャンペーンまたはジャーニーのメッセージでパーソナライズされた推奨事項を送信するたびに、次の一般的なタスクを実行します。

  1. メッセージおよびメッセージテンプレートの構成設定と内容を評価して処理します。

  2. メッセージテンプレートが推奨モデルに接続されていることを判断します。

  3. モデルに接続してそれを使用するための構成設定を評価します。これらは、モデルの「推奨モデル」リソースによって定義されます。

  4. モデルの構成設定で定義されている推奨属性のメッセージ変数を 1 つ以上検出します。

  5. モデルの構成設定で指定された Amazon Personalize キャンペーンから推奨事項データを取得します。このタスクを実行するために、Amazon Personalize Runtime API のGetRecommendations オペレーションを使用します。

  6. 各メッセージ受信者の動的な推奨属性 (RecommendationItems) に適切な推奨事項データを追加します。

  7. Lambda 関数を呼び出して、処理のために各受信者の推奨事項データをその関数に送信します。

    データは、各受信者のエンドポイント定義を含む JSON オブジェクトとして送信されます。各エンドポイント定義には、1~5 個の値の順序付き配列を含む RecommendationItems フィールドが含まれます。配列の値の数は、モデルの構成設定によって異なります。

  8. Lambda 関数がデータを処理して結果を返すのを待機します。

    結果は、各受信者の更新されたエンドポイント定義を含む JSON オブジェクトです。更新された各エンドポイント定義には、新しい Recommendations オブジェクトが含まれます。このオブジェクトは、モデルの構成設定で定義したカスタム推奨属性ごとに 1〜10 個のフィールドを含んでいます。これらの各フィールドには、エンドポイントの強化された推奨事項データが保存されます。

  9. 各受信者の更新されたエンドポイント定義を使用して、各メッセージ変数をその受信者の適切な値に置き換えます。

  10. メッセージ受信者ごとにパーソナライズされた推奨事項を含むメッセージのバージョンを送信します。

この方法で推奨事項をカスタマイズおよび強化するには、最初に、Amazon Pinpoint から送信されたエンドポイント定義を処理し、更新されたエンドポイント定義を返す Lambda 関数を作成します。次に、Lambda 関数ポリシーを関数に割り当てて、関数を呼び出すことを Amazon Pinpoint に許可します。その後、Amazon Pinpoint で推奨モデルを設定します。モデルを設定する際に、呼び出す関数を指定し、使用する推奨属性を定義します。

Lambda 関数の作成

Lambda 関数の作成方法については、『AWS Lambda デベロッパーガイド』の「開始方法」を参照してください。関数を設計および開発する際には、次の要件とガイドラインに留意してください。

入力イベントデータ

Amazon Pinpoint が推奨モデルの Lambda 関数を呼び出すと、メッセージを送信しているキャンペーンまたはジャーニーの構成およびその他の設定を含むペイロードが送信されます。ペイロードには、Endpoints オブジェクトが含まれます。このオブジェクトは、エンドポイント ID をメッセージ受信者のエンドポイント定義に関連付けるマップです。

エンドポイント定義は、Amazon Pinpoint API のエンドポイントリソースで定義された構造を使用します。ただし、RecommendationItems という名前の動的な推奨属性のフィールドも含まれます。この RecommendationItems フィールドには、Amazon Personalize キャンペーンから返された、エンドポイントに対する推奨商品が 1 つ以上含まれます。このフィールドの値は、1~5 の推奨項目の順序付き配列(文字列)です。配列内の商品数は、エンドポイントまたはユーザーごとに取得するよう Amazon Pinpoint を設定した推奨商品の数によって異なります。

例:

"Endpoints": { "endpointIDexample-1":{ "ChannelType":"EMAIL", "Address":"sofiam@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "EffectiveDate":"2020-02-26T18:56:24.875Z", "Attributes":{ "AddressType":[ "primary" ] }, "User":{ "UserId":"SofiaMartínez", "UserAttributes":{ "LastName":[ "Martínez" ], "FirstName":[ "Sofia" ], "Neighborhood":[ "East Bay" ] } }, "RecommendationItems":[ "1815", "2009", "1527" ], "CreationDate":"2020-02-26T18:56:24.875Z" }, "endpointIDexample-2":{ "ChannelType":"EMAIL", "Address":"alejandror@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "EffectiveDate":"2020-02-26T18:56:24.897Z", "Attributes":{ "AddressType":[ "primary" ] }, "User":{ "UserId":"AlejandroRosalez", "UserAttributes":{ "LastName ":[ "Rosalez" ], "FirstName":[ "Alejandro" ], "Neighborhood":[ "West Bay" ] } }, "RecommendationItems":[ "1210", "6542", "4582" ], "CreationDate":"2020-02-26T18:56:24.897Z" } }

上記の例では、関連する Amazon Pinpoint 設定は次のとおりです。

  • 推奨モデルは、エンドポイントまたはユーザーごとに 3 つの推奨商品を取得するよう設定されています (RecommendationsPerMessage プロパティの値は 3 に設定されます)。この設定では、Amazon Pinpoint は、各エンドポイントまたはユーザーの 1 番目、2 番目、および 3 番目の推奨商品のみを取得して追加します。

  • プロジェクトは、各ユーザーの名、姓、およびユーザーの住んでいる近辺を保存するカスタムユーザー属性を使用するよう設定されます (UserAttributes オブジェクトには、これらの属性の値が含まれます)。

  • プロジェクトは、エンドポイントがプロジェクトからメッセージを受信するためのユーザーの優先アドレス (チャネル) かどうかを示すカスタムエンドポイント属性 (AddressType) を使用するよう設定されます (Attributes オブジェクトには、この属性の値が含まれます)。

Amazon Pinpoint が Lambda 関数を呼び出し、このペイロードをイベントデータとして送信すると、AWS Lambda は処理のためにそのデータを Lambda 関数に渡します。

各ペイロードには、最大 50 のエンドポイントのデータを含めることができます。セグメントに 50 以上のエンドポイントが含まれる場合、Amazon Pinpoint はすべてのデータが処理されるまで、繰り返し関数を呼び出します (最大で一度に 50 のエンドポイント)。

レスポンスデータと要件

Lambda 関数を設計および開発する際には、「機械学習モデルのクォータ」に注意してください。関数がこれらのクォータで定義された条件を満たしていない場合、Amazon Pinpoint はメッセージを処理して送信できません。

また、次の要件にも注意してください。

  • 関数は、更新されたエンドポイント定義を、入力イベントデータによって提供されたものと同じ形式で返す必要があります。

  • 更新された各エンドポイント定義には、エンドポイントまたはユーザーに対する 1~10 のカスタム推奨属性を含めることができます。これらの属性の名前は、Amazon Pinpoint で推奨モデルを設定するときに指定した属性名と一致する必要があります。

  • すべてのカスタム推奨属性は、エンドポイントまたはユーザーごとに 1 つの Recommendations オブジェクトに返す必要があります。この要件は、名前の競合が発生しないようにするのに役立ちます。Recommendations オブジェクトは、エンドポイント定義の任意の場所に追加できます。

  • 各カスタム推奨属性の値は、文字列 (1 つの値) または文字列の配列 (複数の値) である必要があります。値が文字列の配列である場合は、 RecommendationItems フィールドに示されているように、Amazon Personalize が返した推奨商品の順序を維持することをお勧めします。そうでない場合は、エンドポイントまたはユーザーに対するモデルの予測がコンテンツに反映されないことがあります。

  • 関数は、エンドポイントまたはユーザーの他の属性値を含む、イベントデータ内の他の要素を変更しないようにします。カスタム推奨属性の値のみを追加し、返すようにする必要があります。Amazon Pinpoint は、関数のレスポンスに含まれる他の値の更新を受け付けません。

  • 関数は、関数を呼び出している Amazon Pinpoint プロジェクトと同じ AWS リージョンでホストされている必要があります。関数とプロジェクトが同じリージョンにない場合、Amazon Pinpoint はイベントデータを関数に送信できません。

上記の要件のいずれかが満たされていない場合、Amazon Pinpoint はメッセージを処理して 1 つ以上のエンドポイントに送信できません。これにより、キャンペーンやジャーニーアクティビティが失敗する可能性があります。

最後に、関数に対して 256 回の同時実行数を予約することをお勧めします。

全体として、Lambda 関数は Amazon Pinpoint によって送信されたイベントデータを処理し、変更されたエンドポイント定義を返す必要があります。関数は、これを行うために Endpoints オブジェクト内の各エンドポイントを反復処理し、各エンドポイントに対して、使用するカスタム推奨属性の値を作成して設定します。Python で記述され、前述の入力イベントデータの例を続行する次の例のハンドラーで、これを示します。

import json import string def lambda_handler(event, context): print("Received event: " + json.dumps(event)) print("Received context: " + str(context)) segment_endpoints = event["Endpoints"] new_segment = dict() for endpoint_id in segment_endpoints.keys(): endpoint = segment_endpoints[endpoint_id] if supported_endpoint(endpoint): new_segment[endpoint_id] = add_recommendation(endpoint) print("Returning endpoints: " + json.dumps(new_segment)) return new_segment def supported_endpoint(endpoint): return True def add_recommendation(endpoint): endpoint["Recommendations"] = dict() customTitleList = list() customGenreList = list() for i,item in enumerate(endpoint["RecommendationItems"]): item = int(item) if item == 1210: customTitleList.insert(i, "Hanna") customGenreList.insert(i, "Action") elif item == 1527: customTitleList.insert(i, "Catastrophe") customGenreList.insert(i, "Comedy") elif item == 1815: customTitleList.insert(i, "Fleabag") customGenreList.insert(i, "Comedy") elif item == 2009: customTitleList.insert(i, "Late Night") customGenreList.insert(i, "Drama") elif item == 4582: customTitleList.insert(i, "Agatha Christie\'s The ABC Murders") customGenreList.insert(i, "Crime") elif item == 6542: customTitleList.insert(i, "Hunters") customGenreList.insert(i, "Drama") endpoint["Recommendations"]["Title"] = customTitleList endpoint["Recommendations"]["Genre"] = customGenreList return endpoint

前述の例では、AWS Lambda はイベントデータを event パラメータとしてハンドラーに渡します。ハンドラーは、Endpoints オブジェクトの各エンドポイントを反復処理し、Recommendations.Title および Recommendations.Genre という名前のカスタム推奨属性の値を設定します。return ステートメントは、更新された各エンドポイント定義を Amazon Pinpoint に返します。

前述の入力イベントデータの例を続行して、更新されたエンドポイント定義は次のとおりです。

"Endpoints":{ "endpointIDexample-1":{ "ChannelType":"EMAIL", "Address":"sofiam@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "EffectiveDate":"2020-02-26T18:56:24.875Z", "Attributes":{ "AddressType":[ "primary" ] }, "User":{ "UserId":"SofiaMartínez", "UserAttributes":{ "LastName":[ "Martínez" ], "FirstName":[ "Sofia" ], "Neighborhood":[ "East Bay" ] } }, "RecommendationItems":[ "1815", "2009", "1527" ], "CreationDate":"2020-02-26T18:56:24.875Z", "Recommendations":{ "Title":[ "Fleabag", "Late Night", "Catastrophe" ], "Genre":[ "Comedy", "Comedy", "Comedy" ] } }, "endpointIDexample-2":{ "ChannelType":"EMAIL", "Address":"alejandror@example.com", "EndpointStatus":"ACTIVE", "OptOut":"NONE", "EffectiveDate":"2020-02-26T18:56:24.897Z", "Attributes":{ "AddressType":[ "primary" ] }, "User":{ "UserId":"AlejandroRosalez", "UserAttributes":{ "LastName ":[ "Rosalez" ], "FirstName":[ "Alejandro" ], "Neighborhood":[ "West Bay" ] } }, "RecommendationItems":[ "1210", "6542", "4582" ], "CreationDate":"2020-02-26T18:56:24.897Z", "Recommendations":{ "Title":[ "Hanna", "Hunters", "Agatha Christie\'s The ABC Murders" ], "Genre":[ "Action", "Drama", "Crime" ] } } }

前述の例では、関数は受け取った Endpoints オブジェクトを変更し、結果を返しています。各エンドポイントの Endpoint オブジェクトに、Title フィールドと Genre フィールドを含む新しい Recommendations オブジェクトが含まれています。これらの各フィールドには、3 つの値の順序付き配列 (文字列として) が保存されます。各値により、RecommendationItems フィールド内の対応する推奨商品の強化されたコンテンツが提供されます。

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

Lambda 関数を使用して推奨事項データを処理する前に、Amazon Pinpoint に関数の呼び出しを許可する必要があります。呼び出しのアクセス許可を付与するには、関数に Lambda 関数ポリシーを割り当てます。Lambda 関数ポリシーはリソースベースのアクセス許可ポリシーで、関数を使用できるエンティティと、それらのエンティティが実行できるアクションを指定します。詳細については、『AWS Lambda デベロッパーガイド』の「AWS Lambda のリソースベースのポリシーを使用する」を参照してください。

次のポリシーの例では、Amazon Pinpoint サービスプリンシパルが、特定の Amazon Pinpoint プロジェクト (projectId) 内の特定の Amazon Pinpoint キャンペーン (campaignId) に対して lambda:InvokeFunction アクションを使用することを許可しています。

{ "Sid": "sid", "Effect": "Allow", "Principal": { "Service": "pinpoint.us-east-1.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "{arn:aws:lambda:us-east-1:accountId:function:function-name}", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:accountId:recommenders/*" } } }

関数ポリシーは、AWS:SourceArn キーを含む Condition ブロックを必要とします。このキーは、関数を呼び出すことができるリソースを指定します。前述の例では、ポリシーにより、1 つの特定のキャンペーンで関数を呼び出すことが許可されています。

また、特定のAmazon Pinpointプロジェクト (projectId) 内のすべてのキャンペーンとジャーニーに対して、Amazon Pinpointサービスプリンシパルが lambda:InvokeFunction アクションを使用できるようにするポリシーを記述することができます。次のポリシー例でこれを示します。

{ "Sid": "sid", "Effect": "Allow", "Principal": { "Service": "pinpoint.us-east-1.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "{arn:aws:lambda:us-east-1:accountId:function:function-name}", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:accountId:recommenders/*" } } }

最初の例とは異なり、この例の Condition ブロックの AWS:SourceArn キーは、1 つの特定のプロジェクトで関数を呼び出すことができます。この許可は、プロジェクト内のすべてのキャンペーンおよびジャーニーに適用されます。

より一般的なポリシーを記述するには、複数文字に一致するワイルドカード (*) を使用します。たとえば、次の Condition ブロックを使用して、任意の Amazon Pinpoint プロジェクトで関数を呼び出すことができます。

"Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:accountId:recommenders/*" } }

Amazon Pinpoint アカウントのすべてのプロジェクトで Lambda 関数を使用する場合は、上記の方法でポリシーの Condition ブロックを設定することをお勧めします。ただし、ベストプラクティスとして、特定のリソースに対して特定のアクションを実行するために必要なアクセス許可のみを含むポリシーを作成する必要があります。

Amazon Pinpoint に対する関数の呼び出しの許可

Lambda 関数ポリシーを関数に割り当てた後、Amazon Pinpoint が特定のプロジェクト、キャンペーン、またはジャーニーの関数を呼び出すことができるアクセス許可を追加できます。これを行うには、 AWS Command Line Interface (AWS CLI) および Lambda add-permission コマンドを使用します。次の例は、特定のプロジェクト (projectId) に対してこれを行う方法を示しています。

$ 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:accountId:recommenders/*

前述の例は、Unix、Linux、および macOS 用にフォーマットされています。Microsoft Windows の場合、バックスラッシュ (\) の行連結文字をキャレット (^) に置き換えます。

コマンドが正常に実行された場合は、次のような出力が表示されます。

{ "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:recommenders/*\"}}}" }

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

推奨モデルの設定

推奨モデルの Lambda 関数を呼び出すよう Amazon Pinpoint を設定するには、モデルに対して次の Lambda 固有の構成設定を指定します。

  • RecommendationTransformerUri – このプロパティは、Lambda 関数の名前または Amazon リソースネーム (ARNs) を指定します。

  • Attributes – このオブジェクトは、関数が各エンドポイント定義に追加するカスタム推奨属性を定義するマップです。これらの各属性は、メッセージテンプレートのメッセージ変数として使用できます。

これらの設定は、Amazon Pinpoint APIの推奨モデルリソース (モデルの設定を作成する場合)、またはAmazon Pinpoint API の推奨モデルリソース (モデルの設定を更新する場合) を使用して指定することができます。これらの設定は、Amazon Pinpoint コンソールを使用して定義することもできます。

Amazon Pinpoint での推奨モデルの使用に関する詳細は、『Amazon Pinpoint ユーザーガイド』の「機械学習モデル」を参照してください。