본문 바로가기
AWS

[AWS] SageMaker AutoScaling 자동화

by parkjp 2023. 8. 7.

 

 

안녕하세요.

지난 포스팅에서 SageMaker Autoscaling하는 법을 올렸었습니다.

 

 

 

 

https://developer-jp.tistory.com/63

 

[AWS] SageMaker Async Endpoint AutoScaling

Aws SageMaker 비동기(async) 엔드포인트 autoscaling에 대한 방법에 대해 간단하게 정리해보자. 일단 비동기 엔드포인트는 실시간 엔드포인트와 달리 인스턴스 수를 0개까지 줄일 수 있다. 비동기 엔드

developer-jp.tistory.com

 

 

 

그런데 문제가 SageMaker Endpoint를 생성한 후에 생성이 완료될 때까지 기다렸다가

AutoScaling을 적용해야 되더라구요.

불편한 점이 생겨서 엔드포인트가 생성완료가 된 후에 자동으로 AutoScaling까지 걸리게끔

설정을 해보려고합니다.

 

 

우선적으로 CloudWatch의 경보를 이용해서

SageMaker 엔드포인트의 생성완료 시점에 이벤트를  발생시켜

오토스케일링을 걸 수 있는지 찾아보았습니다만,

CloudWatch의 지표로는 인스턴스에 대한 CPU나 Memory와 같은 정보밖에 없었습니다.

 

 

EventBridge Rule Event Pattern

 

 

그래서 다음으로 찾아본 것이 EventBridge인데요.

EventBridge의 규칙 생성을 해보면

이벤트 패턴에서 유형을 SageMaker Endpoint State Change라는 부분을 찾을 수 있었습니다.

말 그대로 엔드포인트의 상태가 변경이 될때 이벤트가 발생하는 패턴입니다.

 

 

저는 자동화를 위해서 콘솔보다는 SDK를 이용해서 적용해볼까 합니다.

이 부분을 Lambda함수로 만들어 보겠습니다.

우선은 EventBridge 이전에 SageMaker Endpoint 생성부터 해야겠지요?

 

  import { SageMakerClient, CreateEndpointCommand } from "@aws-sdk/client-sagemaker";
  const client = new SageMakerClient();
  
  const input = {
    EndpointName: `${your-sagemaker-endpointName}`, // required, 생성할 엔드포인트 이름
    EndpointConfigName: `${your-sagemaker-endpoint-configName}`, // required, 생성한 엔드포인트 구성 이름
  };
  
  const command = new CreateEndpointCommand(input);
  await client.send(command);

 

SageMaker 엔드포인트 생성을 위해서는

이전 작업으로 Endpoint 구성을 먼저 생성을 하셔야합니다.

Endpoint 구성 생성은 콘솔로 하셔도 되니 이 부분에서는 패스하겠습니다.

 

CreateEndpointCommand로 생성을 하면 SageMaker 콘솔에서 보시면 생성중이라고 뜨실 겁니다.

여기서 바로 이전 포스팅에서 작성한 AutoScaling 람다함수를 실행하면 아직 Endpoint가 생성중이라

에러가 나는데요.

 

EventBridge로 생성이 완료된 시점에 이벤트를 발생시켜 AutoScaling을 걸어보도록 하겠습니다.

 

 

import { EventBridgeClient, PutRuleCommand, PutTargetsCommand } from "@aws-sdk/client-eventbridge";
const eventClient = new EventBridgeClient();

// 이벤트 규칙 생성

const eventName = `${your-event-name}`;
const input = {
    Name: eventName,
    EventPattern: JSON.stringify({
      "source": ["aws.sagemaker"],
      "detail-type": ["SageMaker Endpoint State Change"],
      "resources": [`${your-sagemaker-endopint-arn}`]
    }),
    State: "ENABLED",
    Description: "Sagemaker Endpoint State Change Event",
    RoleArn: `arn:aws:iam::${your-account}:role/InvokeLambdaRole` // 람다함수 실행 역할
};

const command = new PutRuleCommand(input);
const res = await eventClient.send(command);
const rule = res['RuleName'];


// 이벤트 규칙 대상 설정
const input = {
    Rule: rule,
    Targets: [
      {
        Id: `${your-id}`, // 아무거나 사용자 지정 id
        Arn: `arn:aws:lambda:ap-northeast-2:${your-account}:function:Sagemaker-AutoScaling`, // 이전 포스팅에서 걸어둔 AutoScaling 람다함수
        Input: JSON.stringify({	// AutoScaling 람다함수에서 받는 파라미터
          "endpoint": `${your-sagemaker-endpoint}`,
          "maxCapacity": `${max-capacity}`,
          "targetValue": `${target-value}`
        })
      }
    ]
};

const command = new PutTargetsCommand(input);
await eventClient.send(command);

 

 

우선적으로 EventBridge에서는 이벤트버스 -> 이벤트 규칙 -> 이벤트 대상 순으로 생성을 해야되는데요.

따로 지정을 하지 않는다면 이벤트 버스는 default로 잡히게 됩니다.

 

규칙 생성

이벤트 규칙은 트리거 규칙을 정한다고 보면됩니다.

간단하게 해본 위 규칙 생성 소스를 보시면

resource부분에 이전에 만들었던 endpoint ARN을 넣고

규칙을 생성하시면 됩니다.

 

 

규칙 대상 생성

그리고 바로 아래에 규칙 대상을 설정하는데요.

Rule부분은 이전에 생성했던 규칙 이름을 넣으시면 되고,

Target의 ID는 사용자 지정으로 원하시는 것으로 넣으시면 됩니다.

Arn은 이벤트가 발생했을때 호출이되는 aws 서비스의 ARN인데요

저는 이전 포스팅에서 설정한 AutoScaling 람다함수의 ARN을 걸어두었습니다.

Input은 람다함수에서 받는 파라미터의 값을 상수로 설정하는 부분입니다.

상수 이외에도 이벤트 전체, 일부분, 직접 변형하여 호출되는 AWS 서비스로 값을 보낼 수 있습니다.

 

 

 

**

마지막으로 이벤트로 호출이되는 AutoScaling하는 함수에서 구성 탭에 보시면 아래쪽에

리소스 기반 정책 설명이라고 있습니다.

그 부분에 권한을 추가해야 합니다.

EventBridge에서 이 람다 함수를 실행할 수 있는 권한을 주는 부분입니다.

권한 추가를 누르시면 보안 주체와 작업을 쓰는 부분이 있는데,

 

보안 주체는 'events.amazonaws.com',

소스 ARN은 이벤트 규칙의 ARN을 적으시면 됩니다.

저는 이 부분에서 arn:aws:events:ap-northeast-2:${your-account}:rule/*로 모든 규칙으로 하였습니다.

작업은 Lambda:InvokeFunction으로 설정하시면 됩니다.

 

 

이렇게 엔드포인트 생성부터 규칙대상 설정까지를 람다함수로 만들고

이 람다함수를 테스트로 실행하여 보면 SageMaker 엔드포인트가 생성이되고 난 후

AutoScaling이 걸리는 것을 확인하실 수 있습니다~!

 

 

반응형