

**サポート終了通知:** 2026 年 10 月 30 日に、 AWS は Amazon Pinpoint のサポートを終了します。2026 年 10 月 30 日を過ぎると、Amazon Pinpoint コンソールまたは Amazon Pinpoint のリソース (エンドポイント、セグメント、キャンペーン、ジャーニー、分析) にアクセスできなくなります。詳細については、「[Amazon Pinpoint のサポート終了](https://docs.aws.amazon.com/console/pinpoint/migration-guide)」を参照してください。**注:** SMS、音声、モバイルプッシュ、OTP、電話番号の検証に関連する APIs は、この変更の影響を受けず、 AWS エンドユーザーメッセージングでサポートされています。

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

# AWS Lambda 関数を使用して Amazon Pinpoint セグメントをカスタマイズする
<a name="segments-dynamic"></a>


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

を使用して AWS Lambda 、Amazon Pinpoint キャンペーンがターゲットオーディエンスにどのように関与するかを調整できます。を使用すると AWS Lambda、Amazon Pinpoint がキャンペーンのメッセージを送信した瞬間に、キャンペーンのセグメントを変更できます。

AWS Lambda は、サーバーのプロビジョニングや管理を行わずにコードを実行するために使用できるコンピューティングサービスです。コードをパッケージ化し、*Lambda 関数*として Lambda にアップロードします。関数が呼び出されたときに、Lambda によって関数が実行されます。この操作は手動で行うことも、イベントに応じて自動的に行うこともできます。詳細については、『[AWS Lambda デベロッパーガイド](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)』を参照してください。

キャンペーンに Lambda 関数を割り当てるには、Amazon Pinpoint API の[キャンペーン](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-campaigns-campaign-id.html)リソースを使用して、キャンペーンの `CampaignHook` 設定を定義します。これらの設定には、Lambda 関数名が含まれます。`CampaignHook` モードも含まれます。これは、Amazon Pinpoint が関数から戻り値を受け取るかどうかを指定します。

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

`CampaignHook` 設定が定義されると、Amazon Pinpoint はキャンペーンを実行する際、メッセージの送信前に自動的に Lambda 関数を呼び出します。Amazon Pinpoint が関数を呼び出すと、メッセージ配信に関する*イベントデータ*を提供します。このデータには、キャンペーンのセグメントが含まれます。これは Amazon Pinpoint がメッセージを送信するエンドポイントのリストです。

`CampaignHook` モードが `FILTER` に設定されている場合、Amazon Pinpoint により、関数はメッセージを送信する前に、セグメントを変更して返すことができます。例えば、関数は、Amazon Pinpoint の外部にあるソースからのデータを含む属性でエンドポイント定義を更新する場合があります。または、関数コードの条件に基づいて、特定のエンドポイントを削除してセグメントをフィルタリングする場合があります。Amazon Pinpoint が変更されたセグメントを関数から受け取ると、キャンペーンの配信チャネルを使用して、各セグメントのエンドポイントにメッセージを送信します。

でセグメントを処理することで AWS Lambda、メッセージを送信する相手とそれらのメッセージの内容をより細かく制御できます。キャンペーンメッセージが送信されるときに、キャンペーンをリアルタイムで調整できます。セグメントをフィルタリングすると、サブセットの定義されたサブセットを絞り込んで適用できます。エンドポイント属性を追加または更新しても、メッセージ変数で新しいデータを使用できるようになります。

**注記**  
また、`CampaignHook` 設定を使用して、メッセージ配信を処理する Lambda 関数を割り当てることもできます。このタイプの関数は、ソーシャルメディアプラットフォームなど、Amazon Pinpoint がサポートしないカスタムチャネルを通じてメッセージを配信するときに役立ちます。詳細については、「[ウェブフックまたは Lambda 関数を使用して Amazon Pinpoint でカスタムチャネルを作成する](channels-custom.md)」を参照してください。  
Amazon Pinpoint を使用して Lambda フックを呼び出す場合、Lambda 関数も Amazon Pinpoint プロジェクトと同じリージョンにある必要があります。

でキャンペーンセグメントを変更するには AWS Lambda、まず Amazon Pinpoint によって送信されたイベントデータを処理し、変更されたセグメントを返す関数を作成します。次に、Lambda 関数ポリシーを割り当てて関数を呼び出すことを Amazon Pinpoint に許可します。最後に、`CampaignHook` 設定を定義して、1 つ以上のキャンペーンに関数を割り当てます。

コード例の詳細については、「[コード例](https://docs.aws.amazon.com/pinpoint/latest/developerguide/service_code_examples.html)」を参照してください。

## イベントデータ
<a name="segments-dynamic-payload"></a>

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

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

AWS Lambda はイベントデータを関数コードに渡します。イベントデータは次の属性を提供します。
+ `MessageConfiguration` – Amazon Pinpoint API の[メッセージ](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-messages.html)リソースの `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 関数を作成する
<a name="segments-dynamic-lambda-create"></a>

Lambda 関数の作成方法については、『*AWS Lambda デベロッパーガイド*』の「[開始方法](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)」を参照してください。関数を作成するときは、以下の条件ではメッセージ配信が失敗することに注意してください。
+ Lambda 関数では、変更されたセグメントを返すために 15 秒以上かかります。
+ Amazon Pinpoint は関数の戻り値をデコードすることはできません。
+ この関数では、正常な呼び出しのためには、Amazon Pinpoint から 3 回を超える試行が必要です。

Amazon Pinpoint は、関数の戻り値でのみエンドポイントの定義を受け入れます。関数は、イベントデータで他の要素を変更することはできません。

### Lambda 関数の例
<a name="segments-dynamic-lambda-example"></a>

Lambda 関数は、Node.js で書かれた次の例のように、Amazon Pinpoint によって送信されたイベントデータを処理し、変更されたエンドポイントを返します。

```
'use strict';
 
exports.handler = (event, context, callback) => {
    for (var key in event.Endpoints) {
        if (event.Endpoints.hasOwnProperty(key)) {
            var endpoint = event.Endpoints[key];
            var attr = endpoint.Attributes;
            if (!attr) {
                attr = {};
                endpoint.Attributes = attr;
            }
            attr["CreditScore"] = [ Math.floor(Math.random() * 200) + 650];
        }
    }
    console.log("Received event:", JSON.stringify(event, null, 2));
    callback(null, event.Endpoints);
};
```

Lambda は `event` パラメータとしてイベントデータをハンドラに渡します。

この例では、ハンドラは `event.Endpoints` オブジェクトの各エンドポイントで反復処理し、エンドポイントに新しい属性 `CreditScore` を追加します。`CreditScore` 属性の値は、単純にランダムな数値です。

`console.log()` ステートメントは CloudWatch Logs にイベントのログを記録します。

`callback()` ステートメントは変更されたエンドポイントを Amazon Pinpoint に返します。通常、Node.js Lambda 関数で `callback` パラメータはオプションですが、この関数は更新されたエンドポイントを Amazon Pinpoint に返す必要があるため、このコンテキストで必要です。

関数は、イベントデータで提供されるのと同じ形式でエンドポイントを返す必要があります。これは、次の例に示すように、エンドポイント ID とエンドポイント定義を関連付けるマップです。

```
{
    "eqmj8wpxszeqy/b3vch04sn41yw": {
        "ChannelType": "GCM",
        "Address": "4d5e6f1a2b3c4d5e6f7g8h9i0j1a2b3c",
        "EndpointStatus": "ACTIVE",
        "OptOut": "NONE",
        "Demographic": {
            "Make": "android"
        },
        "EffectiveDate": "2017-11-02T21:26:48.598Z",
        "User": {}
    },
    "idrexqqtn8sbwfex0ouscod0yto": {
        "ChannelType": "APNS",
        "Address": "1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f",
        "EndpointStatus": "ACTIVE",
        "OptOut": "NONE",
        "Demographic": {
            "Make": "apple"
        },
        "EffectiveDate": "2017-11-02T21:26:48.598Z",
        "User": {}
    }
}
```

この例の関数では、イベントデータで受信した `event.Endpoints` オブジェクトを変更して返します。

必要に応じて、返されるエンドポイント定義に `TitleOverride` および `BodyOverride` 属性を含めることができます。

**注記**  
このソリューションを使用してメッセージを送信すると、Amazon Pinpoint は、`ChannelType` 属性の値が次のいずれかの場合、エンドポイントの `TitleOverride` および `BodyOverride` 属性のみを尊重します: `ADM`、`APNS`、`APNS_SANDBOX`、`APNS_VOIP`、`APNS_VOIP_SANDBOX`、`BAIDU`、`GCM`、または `SMS`。  
Amazon Pinpoint は、`ChannelType` 属性の値が `EMAIL` であるエンドポイントについては、これらの属性を**尊重しません**。

## Lambda 関数ポリシーを割り当てる
<a name="segments-dynamic-lambda-trust-policy"></a>

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

詳細については、『*AWS Lambda デベロッパーガイド*』の「[AWS Lambdaのリソースベースのポリシーを使用する](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)」を参照してください。

### 関数ポリシーの例
<a name="segments-dynamic-lambda-trust-policy-example"></a>

以下のポリシーは、Amazon Pinpoint サービスプリンシパルに、特定のキャンペーン (*campaign-id*) に対して `lambda:InvokeFunction` アクションを使用する許可を与えるものです。

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

関数ポリシーは、`Condition` キーを含む `AWS:SourceArn` ブロックを必要とします。このコードは、関数を呼び出すために許可される Amazon Pinpoint キャンペーンを指定します。この例では、ポリシーは 1 つのキャンペーンのみにアクセス許可を付与します。`Condition` ブロックには、アクションを呼び出すことができる AWS アカウントを制御する `AWS:SourceAccount`キーも含める必要があります。

より一般的なポリシーを記述するには、複数文字に一致するワイルドカード (\$1) を使用します。例えば、次の `Condition` ブロックを使用して、特定の Amazon Pinpoint プロジェクト (*application-id*) の任意のキャンペーンに関数の呼び出しを許可できます。

```
...
"Condition": {
  "StringEquals": {
    "AWS:SourceAccount": "111122223333"
  },
  "ArnLike": {
    "AWS:SourceArn": "arn:aws:mobiletargeting:us-east-1:account-id:apps/application-id/campaigns/*"
  }
}
...
```

Lambda 関数をプロジェクトのすべてのキャンペーンで使用されるデフォルト関数にする場合は、前述の方法でポリシーの `Condition` ブロックを構成することをお勧めします。プロジェクト内のすべてのキャンペーンのデフォルトとして Lambda 関数を設定する方法については、[キャンペーンに Lambda 関数を割り当てる](#segments-dynamic-assign) を参照してください。

### Amazon Pinpoint に呼び出しアクセス許可を付与する
<a name="segments-dynamic-lambda-trust-policy-assign"></a>

 AWS Command Line Interface (AWS CLI) を使用して、Lambda 関数に割り当てられた Lambda 関数ポリシーにアクセス許可を追加できます。Amazon Pinpoint に特定のキャンペーンの関数の呼び出しを許可するには、次の例に示すように Lambda [https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) コマンドを使用します。

```
$ aws lambda add-permission \
> --function-name function-name \
> --statement-id sid \
> --action lambda:InvokeFunction \
> --principal pinpoint.us-east-1.amazonaws.com \
> --source-account 111122223333
> --source-arn arn:aws:mobiletargeting:us-east-1:account-id:apps/application-id/campaigns/campaign-id
```

キャンペーン ID は、 AWS CLIの[get-campaigns](https://docs.aws.amazon.com/cli/latest/reference/pinpoint/get-campaigns.html) コマンドで調べることができます。また、アプリケーション ID は [get-apps](https://docs.aws.amazon.com/cli/latest/reference/pinpoint/get-apps.html) コマンドで調べることができます。

Lambda `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:function-name\",
    \"Condition\":
      {\"ArnLike\":
        {\"AWS:SourceArn\":
         \"arn:aws:mobiletargeting:us-east-1:111122223333:apps/application-id/campaigns/campaign-id\"}}
      {\"StringEquals\": 
        {\"AWS:SourceAccount\": 
          \"111122223333\"}}}
}
```

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

## キャンペーンに Lambda 関数を割り当てる
<a name="segments-dynamic-assign"></a>

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

Lambda 関数を個別のキャンペーンに割り当てるには、Amazon Pinpoint API を使用して [https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-campaigns.html](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-campaigns.html) オブジェクトを作成または更新し、その `CampaignHook` 属性を定義します。プロジェクトのすべてのキャンペーン用にデフォルトとして Lambda 関数を設定するには、そのプロジェクト用の [https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-settings.html](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-settings.html) リソースを作成または更新し、その `CampaignHook` オブジェクトを定義します。

 いずれの場合も、次の `CampaignHook` 属性を設定します。
+ `LambdaFunctionName` – キャンペーンのメッセージを送信する前に Amazon Pinpoint が呼び出す Lambda 関数の名前または ARN。
+ `Mode` – `FILTER` に設定します。このモードでは、Amazon Pinpoint はこの関数を呼び出し、変更されたエンドポイントが返されるのを待ちます。エンドポイントを受け取った後、Amazon Pinpointは、メッセージを送信します。Amazon Pinpoint は最大 15 秒待ってから、メッセージ配信を失敗させます。

キャンペーンに対して `CampaignHook` 設定を定義した状態で、Amazon Pinpoint はキャンペーンのメッセージを送信する前に、指定された Lambda 関数を呼び出します。Amazon Pinpoint は、変更されたエンドポイントの関数からの受け取りを待機します。Amazon Pinpoint が更新されたエンドポイントを受信する場合、更新されたエンドポイントデータを使用して、メッセージの配信を続行します。