

**终止支持通知：** AWS 将于 2026 年 10 月 30 日终止对亚马逊 Pinpoint 的支持。2026 年 10 月 30 日之后，您将不再能够访问 Amazon Pinpoint 控制台或 Amazon Pinpoint 资源（端点、分段、活动、旅程和分析）。有关更多信息，请参阅 [Amazon Pinpoint 终止支持](https://docs.aws.amazon.com/console/pinpoint/migration-guide)。**注意：** APIs 与短信相关、语音、移动推送、OTP 和电话号码验证不受此更改的影响，并受 AWS 最终用户消息的支持。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 创建客户细分或将客户细分导入 Amazon Pinpoint
<a name="segments"></a>

用户*客户细分* 表示基于共享特征（例如用户最近什么时候使用了您的应用程序或他们使用哪个设备平台）的用户子集。分段指定哪些用户接收活动传送的消息。通过定义分段，在需要邀请用户重新使用您的应用程序、提供特别优惠或以其他方式提高用户参与度和购买量时，您可以面向正确的受众。

创建分段之后，可以在一个或多个活动中使用它。活动会向分段中的用户传送定制消息。

有关更多信息，请参阅[分段](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-segments.html)。

**Topics**
+ [在 Amazon Pinpoint 中构建客户细分](segments-dimensional.md)
+ [将客户细分导入 Amazon Pinpoint。](segments-importing.md)
+ [使用函数自定义 Amazon Pinpoint 区段 AWS Lambda](segments-dynamic.md)

# 在 Amazon Pinpoint 中构建客户细分
<a name="segments-dimensional"></a>

要面向活动的目标受众，请基于应用程序报告的数据构建分段。例如，要面向最近未使用您的应用程序的用户，可以为过去 30 天内未使用您应用程序的用户定义分段。

有关更多代码示例，请参阅[代码示例](https://docs.aws.amazon.com/pinpoint/latest/developerguide/service_code_examples.html)。

## 使用构建区段 适用于 Java 的 AWS SDK
<a name="segments-dimensional-example-java"></a>

以下示例演示如何使用 适用于 Java 的 AWS SDK构建客户细分。该示例创建了一个用户客户细分，这些用户所在的团队是 `Lakers` 并且在过去 30 天内一直处于活跃状态。构建客户细分后，您可以将其用作活动或旅程的一部分。有关在活动中使用客户细分的示例，请参阅[以编程方式创建 Amazon Pinpoint 活动](campaigns.md)。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.pinpoint.PinpointClient;
import software.amazon.awssdk.services.pinpoint.model.AttributeDimension;
import software.amazon.awssdk.services.pinpoint.model.SegmentResponse;
import software.amazon.awssdk.services.pinpoint.model.AttributeType;
import software.amazon.awssdk.services.pinpoint.model.RecencyDimension;
import software.amazon.awssdk.services.pinpoint.model.SegmentBehaviors;
import software.amazon.awssdk.services.pinpoint.model.SegmentDemographics;
import software.amazon.awssdk.services.pinpoint.model.SegmentLocation;
import software.amazon.awssdk.services.pinpoint.model.SegmentDimensions;
import software.amazon.awssdk.services.pinpoint.model.WriteSegmentRequest;
import software.amazon.awssdk.services.pinpoint.model.CreateSegmentRequest;
import software.amazon.awssdk.services.pinpoint.model.CreateSegmentResponse;
import software.amazon.awssdk.services.pinpoint.model.PinpointException;
import java.util.HashMap;
import java.util.Map;
```

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.pinpoint.PinpointClient;
import software.amazon.awssdk.services.pinpoint.model.AttributeDimension;
import software.amazon.awssdk.services.pinpoint.model.SegmentResponse;
import software.amazon.awssdk.services.pinpoint.model.AttributeType;
import software.amazon.awssdk.services.pinpoint.model.RecencyDimension;
import software.amazon.awssdk.services.pinpoint.model.SegmentBehaviors;
import software.amazon.awssdk.services.pinpoint.model.SegmentDemographics;
import software.amazon.awssdk.services.pinpoint.model.SegmentLocation;
import software.amazon.awssdk.services.pinpoint.model.SegmentDimensions;
import software.amazon.awssdk.services.pinpoint.model.WriteSegmentRequest;
import software.amazon.awssdk.services.pinpoint.model.CreateSegmentRequest;
import software.amazon.awssdk.services.pinpoint.model.CreateSegmentResponse;
import software.amazon.awssdk.services.pinpoint.model.PinpointException;
import java.util.HashMap;
import java.util.Map;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class CreateSegment {
        public static void main(String[] args) {
                final String usage = """

                                Usage:   <appId>

                                Where:
                                  appId - The application ID to create a segment for.

                                """;

                if (args.length != 1) {
                        System.out.println(usage);
                        System.exit(1);
                }

                String appId = args[0];
                PinpointClient pinpoint = PinpointClient.builder()
                                .region(Region.US_EAST_1)
                                .build();

                SegmentResponse result = createSegment(pinpoint, appId);
                System.out.println("Segment " + result.name() + " created.");
                System.out.println(result.segmentType());
                pinpoint.close();
        }

        public static SegmentResponse createSegment(PinpointClient client, String appId) {
                try {
                        Map<String, AttributeDimension> segmentAttributes = new HashMap<>();
                        segmentAttributes.put("Team", AttributeDimension.builder()
                                        .attributeType(AttributeType.INCLUSIVE)
                                        .values("Lakers")
                                        .build());

                        RecencyDimension recencyDimension = RecencyDimension.builder()
                                        .duration("DAY_30")
                                        .recencyType("ACTIVE")
                                        .build();

                        SegmentBehaviors segmentBehaviors = SegmentBehaviors.builder()
                                        .recency(recencyDimension)
                                        .build();

                        SegmentDemographics segmentDemographics = SegmentDemographics
                                        .builder()
                                        .build();

                        SegmentLocation segmentLocation = SegmentLocation
                                        .builder()
                                        .build();

                        SegmentDimensions dimensions = SegmentDimensions
                                        .builder()
                                        .attributes(segmentAttributes)
                                        .behavior(segmentBehaviors)
                                        .demographic(segmentDemographics)
                                        .location(segmentLocation)
                                        .build();

                        WriteSegmentRequest writeSegmentRequest = WriteSegmentRequest.builder()
                                        .name("MySegment")
                                        .dimensions(dimensions)
                                        .build();

                        CreateSegmentRequest createSegmentRequest = CreateSegmentRequest.builder()
                                        .applicationId(appId)
                                        .writeSegmentRequest(writeSegmentRequest)
                                        .build();

                        CreateSegmentResponse createSegmentResult = client.createSegment(createSegmentRequest);
                        System.out.println("Segment ID: " + createSegmentResult.segmentResponse().id());
                        System.out.println("Done");
                        return createSegmentResult.segmentResponse();

                } catch (PinpointException e) {
                        System.err.println(e.awsErrorDetails().errorMessage());
                        System.exit(1);
                }
                return null;
        }
}
```

运行此示例时，IDE 的控制台窗口会显示以下内容：

```
Segment ID: 09cb2967a82b4a2fbab38fead8d1f4c4
```

有关完整的 SDK 示例，请参阅上[GitHub](https://github.com/)的 [CreateSegment.java。](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/pinpoint/src/main/java/com/example/pinpoint/CreateSegment.java)

# 将客户细分导入 Amazon Pinpoint。
<a name="segments-importing"></a>

借助 Amazon Pinpoint，可以通过导入有关属于某个用户分段的端点的信息来定义该分段。*端点* 是单个消息发送目的地，如移动推送设备令牌、手机号码或电子邮件地址。

如果您已在 Amazon Pinpoint 外部创建了用户分段，但是需要借助 Amazon Pinpoint 活动来吸引用户，则导入分段会十分有用。

导入分段时，Amazon Pinpoint 从 Amazon Simple Storage Service (Amazon S3) 获取该分段的端点。导入之前，将端点添加到 Amazon S3，并创建一个 IAM 角色，以向 Amazon Pinpoint 授予对 Amazon S3 的访问权限。然后，向 Amazon Pinpoint 提供存储端点的 Amazon S3 位置，Amazon Pinpoint 会将每个端点添加到分段中。

要创建 IAM 角色，请参阅[用于导入端点或分段的 IAM 角色](permissions-import-segment.md)。有关使用 Amazon Pinpoint 控制台导入分段的信息，请参阅《Amazon Pinpoint 用户指南》中的[导入分段](https://docs.aws.amazon.com/pinpoint/latest/userguide/segments-importing.html)**。

有关更多代码示例，请参阅[代码示例](https://docs.aws.amazon.com/pinpoint/latest/developerguide/service_code_examples.html)。

## 使用 适用于 Java 的 AWS SDK 导入客户细分
<a name="segments-importing-example-java"></a>

以下示例演示如何使用 适用于 Java 的 AWS SDK 导入分段。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.pinpoint.PinpointClient;
import software.amazon.awssdk.services.pinpoint.model.CreateImportJobRequest;
import software.amazon.awssdk.services.pinpoint.model.ImportJobResponse;
import software.amazon.awssdk.services.pinpoint.model.ImportJobRequest;
import software.amazon.awssdk.services.pinpoint.model.Format;
import software.amazon.awssdk.services.pinpoint.model.CreateImportJobResponse;
import software.amazon.awssdk.services.pinpoint.model.PinpointException;
```

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.pinpoint.PinpointClient;
import software.amazon.awssdk.services.pinpoint.model.CreateImportJobRequest;
import software.amazon.awssdk.services.pinpoint.model.ImportJobResponse;
import software.amazon.awssdk.services.pinpoint.model.ImportJobRequest;
import software.amazon.awssdk.services.pinpoint.model.Format;
import software.amazon.awssdk.services.pinpoint.model.CreateImportJobResponse;
import software.amazon.awssdk.services.pinpoint.model.PinpointException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class ImportSegment {
    public static void main(String[] args) {
        final String usage = """

                Usage:   <appId> <bucket> <key> <roleArn>\s

                Where:
                  appId - The application ID to create a segment for.
                  bucket - The name of the Amazon S3 bucket that contains the segment definitons.
                  key - The key of the S3 object.
                  roleArn - ARN of the role that allows Amazon Pinpoint to access S3. You need to set trust management for this to work. See https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html
                  """;

        if (args.length != 4) {
            System.out.println(usage);
            System.exit(1);
        }

        String appId = args[0];
        String bucket = args[1];
        String key = args[2];
        String roleArn = args[3];

        PinpointClient pinpoint = PinpointClient.builder()
                .region(Region.US_EAST_1)
                .build();

        ImportJobResponse response = createImportSegment(pinpoint, appId, bucket, key, roleArn);
        System.out.println("Import job for " + bucket + " submitted.");
        System.out.println("See application " + response.applicationId() + " for import job status.");
        System.out.println("See application " + response.jobStatus() + " for import job status.");
        pinpoint.close();
    }

    public static ImportJobResponse createImportSegment(PinpointClient client,
            String appId,
            String bucket,
            String key,
            String roleArn) {

        try {
            ImportJobRequest importRequest = ImportJobRequest.builder()
                    .defineSegment(true)
                    .registerEndpoints(true)
                    .roleArn(roleArn)
                    .format(Format.JSON)
                    .s3Url("s3://" + bucket + "/" + key)
                    .build();

            CreateImportJobRequest jobRequest = CreateImportJobRequest.builder()
                    .importJobRequest(importRequest)
                    .applicationId(appId)
                    .build();

            CreateImportJobResponse jobResponse = client.createImportJob(jobRequest);
            return jobResponse.importJobResponse();

        } catch (PinpointException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return null;
    }
}
```

有关完整的 SDK 示例，请参阅 [GitHub](https://github.com/) 上的 [ImportingSegments.java](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/pinpoint/src/main/java/com/example/pinpoint/ImportSegment.java/)。

# 使用函数自定义 Amazon Pinpoint 区段 AWS Lambda
<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 不支持的自定义渠道（例如社交媒体平台）传送消息非常有用。有关更多信息，请参阅 [使用 Webhook 或 Lambda 函数在 Amazon Pinpoint 中创建自定义渠道](channels-custom.md)。  
使用 Amazon Pinpoint 调用 Lambda 钩子时，Lambda 函数还必须与 Amazon Pinpoint 项目位于同一区域。

要使用修改广告活动细分 AWS Lambda，请先创建一个函数，用于处理 Amazon Pinpoint 发送的事件数据并返回修改后的区段。然后，通过分配 Lambda 函数策略来授权 Amazon Pinpoint 调用该函数。最后，通过定义 `CampaignHook` 设置，将该函数分配给一个或多个活动。

有关更多代码示例，请参阅[代码示例](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`— 将端点 IDs 与端点定义关联的地图。每个事件数据负载最多可包含 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 函数处理 Amazon Pinpoint 发送的事件数据，并返回修改后的端点，如以下示例处理程序（使用 Node.js 编写）所示：

```
'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 日志中。

`callback()` 语句将修改后的端点返回到 Amazon Pinpoint。通常，`callback` 参数在 Node.js Lambda 函数中是可选的，但在此上下文中是必需的，因为该函数必须将更新后的端点返回给 Amazon Pinpoint。

您的函数必须以与事件数据提供的相同格式返回终端节点，事件数据是将端点 IDs 与端点定义关联的地图，如以下示例所示：

```
{
    "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` 属性。

**注意**  
当您使用此解决方案发送消息时，对于 `ChannelType` 属性值为以下之一的端点，Amazon Pinpoint 只接受 `TitleOverride` 和 `BodyOverride` 属性：`ADM`、`APNS`、`APNS_SANDBOX`、`APNS_VOIP`、`APNS_VOIP_SANDBOX`、`BAIDU`、`GCM` 或 `SMS`。  
对于 `ChannelType` 属性值为 `EMAIL` 的端点，Amazon Pinpoint **不**支持这些属性。

## 分配 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 服务委托人对特定活动使用该`lambda:InvokeFunction`操作的权限 ()*campaign-id*：

```
{
  "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"
    }
  }
}
```

您的函数策略需要包含 `AWS:SourceArn` 密钥的 `Condition` 块。此代码声明允许哪个 Amazon Pinpoint 活动调用该函数。在本示例中，策略仅将权限授予一个活动。该`Condition`区块还必须包含一个`AWS:SourceAccount`密钥，用于控制哪个 AWS 账户可以调用该操作。

要编写更为通用的策略，请使用多字符匹配通配符 (\$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
```

您可以使用中的 [get-campaigns 命令 IDs 来查找您的广告系列](https://docs.aws.amazon.com/cli/latest/reference/pinpoint/get-campaigns.html)。 AWS CLI您也可以使用 [get-apps](https://docs.aws.amazon.com/cli/latest/reference/pinpoint/get-apps.html) 命令查找您的应用程序 ID。

运行 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 秒钟，如果 15 秒后未收到返回结果，则认为消息传送失败。

借助为活动定义的 `CampaignHook` 设置，Amazon Pinpoint 将在发送活动消息之前调用指定的 Lambda 函数。Amazon Pinpoint 会等待接收该函数返回的修改后的端点。如果 Amazon Pinpoint 收到更新后的端点，它会使用更新后的端点数据继续消息传送。