AWS AppConfig 기반 클라이언트측 평가 사용 - Amazon CloudWatch

AWS AppConfig 기반 클라이언트측 평가 사용

프로젝트에서 AWS AppConfig 기반 클라이언트측 평가(클라이언트측 평가)를 사용할 수 있습니다. 그러면 EvaluateFeature 작업을 호출하여 변형을 할당하는 대신 애플리케이션이 사용자 세션에 변형을 로컬로 할당할 수 있습니다. 이를 통해 API 호출로 인한 지연 시간 및 가용성 위험을 줄일 수 있습니다.

클라이언트측 평가를 사용하려면 AWS AppConfig Lambda 익스텐션을 Lambda 함수에 계층으로 연결하고 환경 변수를 구성합니다. 클라이언트측 평가는 로컬 호스트에서 부 프로세스로 실행됩니다. 그런 다음 localhost에 대해 EvaluationFeaturePutProjectEvent 작업을 호출할 수 있습니다. 클라이언트측 평가 프로세스는 변형 할당, 캐싱 및 데이터 동기화를 처리합니다. AWS AppConfig에 대한 자세한 내용을 알아보려면 AWS AppConfig 작동 방식을 참조하세요.

AWS AppConfig와 통합할 때 AWS AppConfig 애플리케이션 ID와 AWS AppConfig 환경 ID를 Evidently에 지정합니다. Evidently 프로젝트에서 동일한 애플리케이션 ID와 환경 ID를 사용할 수 있습니다.

클라이언트측 평가가 활성화된 프로젝트를 생성하면 Evidently에서 해당 프로젝트에 대한 AWS AppConfig 구성 프로파일을 생성합니다. 각 프로젝트의 구성 프로파일은 다릅니다.

클라이언트측 평가 액세스 제어

Evidently 클라이언트측 평가는 Evidently의 나머지 부분과 다른 액세스 제어 메커니즘을 사용합니다. 적절한 보안 조치를 구현할 수 있도록 이 내용을 이해하는 것이 좋습니다.

Evidently를 사용하면 사용자가 개별 리소스에 대해 수행할 수 있는 작업을 제한하는 IAM 정책을 생성할 수 있습니다. 예를 들어 사용자가 EvaluateFeature 작업을 수행하지 못하도록 하는 사용자 역할을 생성할 수 있습니다. IAM 정책으로 제어할 수 있는 Evidently 작업에 대한 자세한 내용을 알아보려면 Amazon CloudWatch Evidently에서 정의한 작업을 참조하세요.

클라이언트측 평가 모델은 프로젝트 메타데이터를 사용하는 Evidently 기능의 로컬 평가를 허용합니다. 클라이언트측 평가가 활성화된 프로젝트의 사용자는 로컬 호스트 엔드포인트에 대해 EvaluateFeature API를 호출할 수 있으며 이 API 호출은 Evidently에 도달하지 않으며 Evidently 서비스의 IAM 정책에 의해 인증되지 않습니다. 사용자에게 EvaluateFeature 작업을 사용할 IAM 권한이 없는 경우에도 이 호출은 성공합니다. 그러나 에이전트가 평가 이벤트 또는 사용자 지정 이벤트를 버퍼링하고 데이터를 Evidently 비동기식으로 오프로드하려면 사용자에게 여전히 PutProjectEvents 권한이 필요합니다.

또한 클라이언트측 평가를 사용하는 프로젝트를 생성하려면 사용자에게 evidently:ExportProjectAsConfiguration 권한이 있어야 합니다. 이렇게 하면 클라이언트측 평가 중 호출되는 EvaluateFeature 작업에 대한 액세스를 제어하는 데 도움이 됩니다.

주의하지 않으면 클라이언트측 평가 보안 모델이 Evidently의 나머지 부분에 대해 설정한 정책을 손상시킬 수 있습니다. evidently:ExportProjectAsConfiguration 권한이 있는 사용자는 클라이언트측 평가가 활성화된 프로젝트를 생성한 다음 IAM 정책에서 EvaluateFeature 작업이 명시적으로 거부된 경우에도 해당 프로젝트에 대한 클라이언트측 평가에 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 서비스에서 생성한 퍼블릭 AWS AppConfig 익스텐션인 AWS-AppConfig-Extension의 일부인 퍼블릭 계층입니다. Lambda 계층에 대한 자세한 내용을 알아보려면 Layer(계층)를 참조하세요.

클라이언트측 평가를 사용하려면 이 계층을 Lambda 함수에 추가하고 권한 및 환경 변수를 구성해야 합니다.

Lambda 함수에 Evidently 클라이언트측 평가 Lambda 계층 추가 및 구성
  1. Lambda 함수를 아직 생성하지 않은 경우 함수를 생성합니다.

  2. 함수에 클라이언트측 평가 계층을 추가합니다. ARN을 지정합니다. 또는 ARN을 아직 선택하지 않은 경우 AWS 계층 목록에서 ARN을 선택합니다. 자세한 내용을 알아보려면 계층을 사용하도록 함수 구성Available versions of the AWS AppConfig Lambda extension( Lambda 익스텐션의 사용 가능한 버전)을 참조하세요.

  3. 다음 내용으로 EvidentlyAppConfigCachingAgentPolicy라는 IAM 정책을 생성하고 함수의 실행 역할에 연결합니다. 자세한 내용을 알아보려면 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. (선택 사항) 기타 환경 변수를 설정합니다. 자세한 내용을 알아보려면 Configuring the AWS AppConfig Lambda extension( Lambda 익스텐션 구성)을 참조하세요.

  6. 애플리케이션에서 EvaluateFeaturelocalhost로 전송하여 로컬에서 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로 데이터를 전송하는 빈도를 지정하기 위해 선택 사항으로 2개의 환경 변수를 구성할 수 있습니다.

  • AWS_APPCONFIG_EXTENSION_EVIDENTLY_EVENT_BATCH_SIZE는 Evidently로 전송하기 전에 일괄 처리할 프로젝트당 이벤트 수를 지정합니다. 유효한 값은 1에서 50 사이의 정수이며 기본값은 40입니다.

  • AWS_APPCONFIG_EXTENSION_EVIDENTLY_BATCH_COLLECTION_DURATION은 Evidently로 이벤트를 전송하기 전에 대기할 기간(초)을 지정합니다. 기본값은 30입니다.

문제 해결

다음 정보로 AWS AppConfig 기반 클라이언트측 평가와 함께 CloudWatch Evidently를 사용할 때 발생하는 문제 해결을 돕습니다.

EvaluateFeature 작업 호출 시 오류 발생(BadRequestException): 제공된 경로에 대해 HTTP 메서드가 지원되지 않음

환경 변수가 잘못 구성되었을 수 있습니다. 예를 들어 AWS_APPCONFIG_EXTENSION_EVIDENTLY_CONFIGURATIONS 대신 EVIDENTLY_CONFIGURATIONS를 환경 변수 이름으로 사용했을 수 있습니다.

ResourceNotFoundException: 배포를 찾을 수 없음

프로젝트 메타데이터에 대한 업데이트가 AWS AppConfig에 배포되지 않았습니다. 클라이언트측 평가에 사용한 AWS AppConfig 환경에서 활성 배포가 있는지 확인합니다.

ValidationException: 프로젝트에 대한 Evidently 구성 없음

AWS_APPCONFIG_EXTENSION_EVIDENTLY_CONFIGURATIONS 환경 변수가 잘못된 프로젝트 이름으로 구성되었을 수 있습니다.