使用客户端评估 - 由 Amazon AppConfig 提供支持 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用客户端评估 - 由 Amazon AppConfig 提供支持

您可以在项目中使用客户端评估 - 由 Amazon AppConfig 提供支持(客户端评估),它允许您的应用程序在本地为用户会话分配变体,而不是通过调用 EvaluateFeature 操作。这减少了 API 调用带来的延迟和可用性风险。

要使用客户端评估,请附上 Amazon AppConfig Lambda 扩展程序作为您的 Lambda 函数的一个层并配置环境变量。客户端评估在本地主机上作为侧进程运行。然后,您可以针对 localhost 调用 EvaluationFeaturePutProjectEvent。客户端评估过程负责变体分配、缓存和数据同步。有关 Amazon AppConfig 的更多信息,请参阅 Amazon AppConfig 的工作原理

当与 Amazon AppConfig 集成时,向 Evidently 指定一个 Amazon AppConfig 应用程序 ID 和一个 Amazon AppConfig 环境 ID。您可以在 Evidently 项目中使用相同的应用程序 ID 和环境 ID。

当您创建一个启用了客户端评估的项目时,Evidently 会为该项目创建一个 Amazon AppConfig 配置文件。每个项目的配置文件将有所不同。

客户端评估访问控制

Evidently 客户端评估使用的访问控制机制与 Evidently 的其余部分不同。我们强烈建议您了解这一点,以便实施适当的安全措施。

利用 Evidently,您可以创建 IAM 策略来限制用户可对各个资源执行的操作。例如,您可以创建不允许用户拥有 EvaluateFeature 操作的用户角色。有关可通过 IAM 策略控制的 Evidently 操作的更多信息,请参阅 Amazon CloudWatch Evidently 定义的操作

客户端评估模型允许对使用项目元数据的 Evidently 功能进行本地评估。启用了客户端评估的项目的用户可以针对本地主机端点调用 EvaluateFeature API,此 API 调用无法到达 Evidently,也未通过 Evidently 服务的 IAM 策略进行身份验证。即使用户没有 IAM 权限来使用 EvaluateFeature 操作,此调用也可成功。但是,用户仍然需要 PutProjectEvents 权限使代理缓冲评估事件或自定义事件,以及将数据异步卸载到 Evidently。

此外,用户必须具有 evidently:ExportProjectAsConfiguration 权限才能创建使用客户端评估的项目。这可以帮助您对客户端评估期间调用的 EvaluateFeature 操作进行控制访问。

如果您不小心,客户端评估安全模型可能会颠覆您对 Evidently 其余部分设置的策略。具有 evidently:ExportProjectAsConfiguration 权限的用户可以创建启用了客户端评估的项目,然后使用 EvaluateFeature 工作进行该项目的客户端评估,即使它们在 IAM policy 中被明确拒绝 EvaluateFeature 操作。

Lambda 入门

Evidently 当前通过使用 Amazon Lambda 环境支持客户端评估。要开始使用,请先决定要使用哪一个 Amazon AppConfig 应用程序和环境。选择现有的应用程序和环境,或创建新的应用程序和环境。

以下示例 Amazon AppConfig Amazon CLI 命令可创建应用程序和环境。

aws appconfig create-application --name YOUR_APP_NAME
aws appconfig create-environment --application-id YOUR_APP_ID --name YOUR_ENVIRONMENT_NAME

接下来,使用这些 Amazon AppConfig 资源创建一个 Evidently 项目。有关更多信息,请参阅创建新项目

使用 Lambda 层在 Lambda 中支持客户端评估。这是属于 AWS-AppConfig-Extension 一部分的公共层,是 Amazon AppConfig 服务创建的公共 Amazon AppConfig 扩展程序。有关 Lambda 层的更多信息,请参阅

要使用客户端评估,您必须将此层添加到 Lambda 函数并配置权限和环境变量。

要将 Evidently 客户端评估 Lambda 层添加到您的 Lambda 函数并进行配置

  1. 如果尚未创建 Lambda 函数,请创建一个。

  2. 将客户端评估层添加到函数。您可以指定它的 ARN,也可以从 Amazon 层的列表中选择(如果尚未创建)。有关更多信息,请参阅配置函数以使用层Amazon AppConfig Lambda 扩展程序的可用版本

  3. 创建名为 EvidentlyAppConfigCachingAgentPolicy 具有以下内容的 IAM policy,并将其附加到函数的执行角色。有关更多信息,请参阅 Lambda 执行角色

    { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "appconfig:GetLatestConfiguration", "appconfig:StartConfigurationSession", "evidently:PutProjectEvents" ], "Resource": "*" } ] }
  4. 添加所需的环境变量 AWS_APPCONFIG_EXTENSION_EVIDENTLY_CONFIGURATIONS 到您的 Lambda 函数。此环境变量指定 Evidently 项目与 Amazon AppConfig 资源之间的映射。

    如果您将此函数用于一个 Evidently 项目,请将环境变量的值设置为:applications/APP_ID/environments/ENVIRONMENT_ID/configurations/PROJECT_NAME

    如果您将此函数用于多个 Evidently 项目,请使用逗号分隔值,如以下示例所示:applications/APP_ID_1/environments/ENVIRONMENT_ID_1/configurations/PROJECT_NAME_1, applications/APP_ID_2/environments/ENVIRONMENT_ID_2/configurations/PROJECT_NAME_2

  5. (可选)设置其他环境变量。有关更多信息,请参阅配置 Amazon AppConfig Lambda 扩展程序

  6. 在您的应用程序中,通过将 EvaluateFeature 发送到 localhost 进行本地 Evidently 评估。

    Python 示例:

    import boto3 from botocore.config import Config def lambda_handler(event, context): local_client = boto3.client( 'evidently', endpoint_url="http://localhost:2772", config=Config(inject_host_prefix=False) ) response = local_client.evaluate_feature( project=event['project'], feature=event['feature'], entityId=event['entityId'] ) print(response)

    Node.js 示例:

    const AWS = require('aws-sdk'); const evidently = new AWS.Evidently({ region: "us-west-2", endpoint: "http://localhost:2772", hostPrefixEnabled: false }); exports.handler = async (event) => { const evaluation = await evidently.evaluateFeature({ project: 'John_ETCProject_Aug2022', feature: 'Feature_IceCreamFlavors', entityId: 'John' }).promise() console.log(evaluation) const response = { statusCode: 200, body: evaluation, }; return response; };

    Kotlin 示例:

    String localhostEndpoint = "http://localhost:2772/" public AmazonCloudWatchEvidentlyClient getEvidentlyLocalClient() { return AmazonCloudWatchEvidentlyClientBuilder.standard() .withEndpointConfiguration(AwsClientBuilder.EndpointConfiguration(localhostEndpoint, region)) .withClientConfiguration(ClientConfiguration().withDisableHostPrefixInjection(true)) .withCredentials(credentialsProvider) .build(); } AmazonCloudWatchEvidentlyClient evidently = getEvidentlyLocalClient(); // EvaluateFeature via local client. EvaluateFeatureRequest evaluateFeatureRequest = new EvaluateFeatureRequest().builder() .withProject(${YOUR_PROJECT}) //Required. .withFeature(${YOUR_FEATURE}) //Required. .withEntityId(${YOUR_ENTITY_ID}) //Required. .withEvaluationContext(${YOUR_EVAL_CONTEXT}) //Optional: a JSON object of attributes that you can optionally pass in as part of the evaluation event sent to Evidently. .build(); EvaluateFeatureResponse evaluateFeatureResponse = evidently.evaluateFeature(evaluateFeatureRequest); // PutProjectEvents via local client. PutProjectEventsRequest putProjectEventsRequest = new PutProjectEventsRequest().builder() .withData(${YOUR_DATA}) .withTimeStamp(${YOUR_TIMESTAMP}) .withType(${YOUR_TYPE}) .build(); PutProjectEvents putProjectEventsResponse = evidently.putProjectEvents(putProjectEventsRequest);

配置客户端向 Evidently 发送数据的频率

要指定客户端评估向 Evidently 发送数据的频率,您可以选择配置两个环境变量。

  • AWS_APPCONFIG_EXTENSION_EVIDENTLY_EVENT_BATCH_SIZE 指定每个项目在将事件发送到 Evidently 之前要批处理的事件数量。有效范围是介于 1 与 50 之间的整数,默认值为 40。

  • AWS_APPCONFIG_EXTENSION_EVIDENTLY_BATCH_COLLECTION_DURATION 指定在将事件发送到 Evidently 之前等待事件的持续时间(以秒为单位)。默认值为 30。

问题排查

使用以下信息帮助对使用 CloudWatch Evidently 与客户端评估 - 由 Amazon AppConfig 提供支持产生的问题进行排查。

调用 EvaluateFeature 操作时出现错误(BadRequestException):提供的路径不支持 HTTP 方法

您的环境变量可能配置不正确。例如,您可能曾将 EVIDENTLY_CONFIGURATIONS 用作环境变量名称,而不是 AWS_APPCONFIG_EXTENSION_EVIDENTLY_CONFIGURATIONS

ResourceNotFoundException:未找到部署

您对项目元数据的更新尚未部署到 Amazon AppConfig。在您用于客户端评估的 Amazon AppConfig 环境中检查活动部署。

ValidationException:没有对项目进行 Evidently 配置

您的 AWS_APPCONFIG_EXTENSION_EVIDENTLY_CONFIGURATIONS 环境变量可能使用不正确的项目名称进行了配置。