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

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

重要

终止支持通知:2025 年 10 月 16 日,AWS 将停止对 CloudWatch Evidently 的支持。2025 年 10 月 16 日之后,您将无法再访问 Evidently 控制台或 Evidently 资源。

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

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

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

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

客户端评估访问控制

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

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

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

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

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

Lambda 入门

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

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

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

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

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

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

要将 Evidently 客户端评估 Lambda 层添加到您的 Lambda 函数并进行配置
  1. 如果尚未创建 Lambda 函数,请创建一个。

  2. 将客户端评估层添加到您的函数中。您可以指定它的 ARN,也可以从 AWS 层的列表中进行选择(如果还没有此 ARN)。有关更多信息,请参阅配置函数以使用层AWS 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. 向您的 Lambda 函数添加所需的环境变量 AWS_APPCONFIG_EXTENSION_EVIDENTLY_CONFIGURATIONS。此环境变量用于指定 Evidently 项目与 AWS 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. (可选)设置其他环境变量。有关更多信息,请参阅配置 AWS 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 使用由 AWS AppConfig 提供支持的客户端评估时发生的问题。

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

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

ResourceNotFoundException:未找到部署

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

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

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