EventBridge 이벤트 샘플링을 위한 이상한 트릭

Amazon EventBridge은 서버리스 이벤트 버스이며 서버리스 이벤트 기반 애플리케이션의 핵심 구성 요소입니다. 그러나 테스트 환경을 위한 예제 이벤트 데이터를 구성하는 것은 어려울 수 있으며 모의 이벤트에 대한 개발은 제한적일 수 있습니다. 프로덕션 이벤트에 대해 지속적인 테스트를 수행할 수도 있지만 이벤트의 양으로 인해 불가능할 수 있습니다. 이러한 모든 이유로 프로덕션 이벤트 버스에서 이벤트의 임의 부분을 샘플링할 수 있다면 좋을 것입니다. 불행하게도 이를 수행하는 기본 기능은 없지만 이 이상한 트릭을 사용하여 대략적으로 추정할 수 있습니다!

트릭



2020년 초부터 match events based on complex content patterns이 가능했습니다. EventBridge 이벤트에는 uuid 형식의 id 필드도 항상 포함됩니다. 이 두 속성을 사용하여 주어진 샘플링 비율을 근사화하는 규칙을 만들 수 있습니다. id 필드의 각 문자는 0-f(16진수 값)의 16개 값 중 하나일 수 있습니다. 이는 EventPattern를 다음과 같이 설정할 수 있음을 의미합니다.

{ "id": [{ "prefix": "0" }] }


이것은 이벤트의 1/16 또는 6.25%와 일치해야 합니다. 일치하는 자릿수를 늘려 세분성을 높일 수 있습니다. 2자로 구성된 접두사는 이벤트의 0.39%와 일치하고 3자로 구성된 접두사는 0.0244%의 이벤트와 일치합니다.

예를 들어 이벤트의 1%를 일치시키려는 경우 다음과 같은 접두사 목록을 제공할 수 있습니다.

{
  "id": [
    { "prefix": "00" },  // 0.39%
    { "prefix": "01" },  // 0.78%
    { "prefix": "020" }, // 0.81%
    { "prefix": "021" }, // 0.83%
    { "prefix": "022" }, // 0.85%
    { "prefix": "023" }, // 0.88%
    { "prefix": "024" }, // 0.90%
    { "prefix": "025" }, // 0.93%
    { "prefix": "026" }, // 0.95%
    { "prefix": "027" }, // 0.98%
    { "prefix": "028" }  // 1.00%
  ]
}


참고: EventBridge에서 생성된 uuid가 균일하게 배포된다는 보장은 없지만 대부분의 경우 충분합니다.

이러한 접두사 목록을 CDK 구조로 생성하기 위한 논리를 구축할 수 있습니다.

SamplingRule 구문( 코드 )



모든 예제 코드는 이 GitHub 리포지토리에서 찾을 수 있습니다. rogerchi/cdk-events-sampling

현재 AWS-CDK 리포지토리에는 EventBridge 규칙에서 콘텐츠 기반 매처를 정의하기 위한 open issue이 있으므로 구성을 위해 탈출구를 사용하고 기본 L1 CloudFormation 구성으로 드롭다운하여 패턴을 설정해야 합니다.

import { RuleProps, Rule, CfnRule } from 'aws-cdk-lib/aws-events';
import { Construct } from 'constructs';

export interface SamplingRuleProps extends RuleProps {
  percentage: number;
}

export class SamplingRule extends Rule {
  constructor(
    scope: Construct,
    id: string,
    { percentage, ...props }: SamplingRuleProps
  ) {
    // Construct the base class with a dummy eventPattern
    super(scope, id, { ...props, eventPattern: { version: [''] } });

    // Escape hatch for getting the CfnRule to be able to use content-based
    //   filtering until this issue is resolved:
    //   https://github.com/aws/aws-cdk/issues/6184
    const cfnRule = this.node.defaultChild as CfnRule;
    const idPattern = this.getIdPatternFromPercentage(percentage);
    if (!props.eventPattern) {
      cfnRule.eventPattern = { id: idPattern };
    } else {
      cfnRule.eventPattern = { ...props.eventPattern, id: idPattern };
    }
  }

  // Convert percentage into list of uuid prefix patterns
  private getIdPatternFromPercentage(percentage: number): { prefix: string }[] {
    if (percentage >= 1 || percentage <= 0) {
      throw new Error('Percentage must be between 0 and 1');
    }
    // Get the first three significant hex digits from the percentage
    const hexString = percentage.toString(16).slice(0, 5).slice(-3);

    // Build up list of prefixes, starting from most significant digit
    let prefixes: string[] = [];
    let a;
    for (a = 0x0; a < parseInt(hexString[0], 16); a++) {
      prefixes.push(a.toString(16));
    }
    let b;
    for (b = 0x0; b < parseInt(hexString[1], 16); b++) {
      prefixes.push(a.toString(16) + b.toString(16));
    }
    let c;
    for (c = 0x0; c < parseInt(hexString[2], 16); c++) {
      prefixes.push(a.toString(16) + b.toString(16) + c.toString(16));
    }

    return prefixes.map((prefix) => ({ prefix }));
  }
}


사용 사례



다음은 프로덕션 이벤트 샘플링에 대한 몇 가지 사용 사례입니다.
  • 실제 이벤트의 일부를 QA/테스트 및 개발 계정으로 보내면 보다 안정적인 실제 테스트 및 실제 이벤트로 개발할 수 있습니다. (민감한 정보를 제거하기 위해 먼저 페이로드의 특정 키를 익명화하는 Lambda 함수를 대상으로 할 수 있음)
  • 실제 이벤트의 일부를 지속적인 엔드 투 엔드 테스트 환경으로 전송
  • 게시된 스키마를 준수하는지 확인하기 위해 실제 이벤트 샘플을 지속적으로 검사합니다
  • .

    테스트(코드)



    예제 리포지토리에는 프로덕션 이벤트 버스 스택, 개발 이벤트 버스 스택 및 3%의 샘플링 비율을 사용하여 프로덕션 이벤트 버스에서 개발 이벤트 버스로 이벤트 복제를 구성하는 스택과 같은 몇 가지 스택을 생성하도록 설정된 CDK 애플리케이션이 있습니다. CDK 애플리케이션을 샌드박스 계정에 배포하고 scripts/put-events.ts 스크립트를 호출하여 프로덕션 이벤트 버스에 10,000개의 이벤트를 넣습니다. 샘플링 규칙이 이러한 이벤트의 약 3%와 일치하고 이를 개발 스택에 복제할 것으로 예상해야 합니다(물론 개발 스택은 별도의 개발 계정에 있을 수도 있음).

    ts-node scripts/put-events.ts {prodEventBusName}
    


    이벤트 버스에 대한 CloudWatch 메트릭을 확인하고 이벤트의 2.81%가 샘플링되어 dev 이벤트 버스로 전송되었음을 알 수 있습니다.



    결론



    SamplingRule 구성/패턴을 사용하여 서버리스 및 이벤트 기반 애플리케이션 개발을 가속화할 수 있기를 바랍니다. 이 정보가 도움이 되었는지 알려주시고 Twitter에서 저를 팔로우해 주세요.

    나에 대해서



    저는 스태프 엔지니어 @ Veho 입니다. 우리는 최근 시리즈 A 및 B 펀딩 라운드를 모집했으며 적극적으로 채용하고 있습니다! 서버리스에 대한 열정이 있거나 기술을 향상시키려는 경우 당사open positions를 살펴보십시오!

    좋은 웹페이지 즐겨찾기