만족

AWS Lambda와 Cloudwatch를 이용한 health check 본문

AWS Lambda와 Cloudwatch를 이용한 health check

기타 컴퓨터 지식 Satisfaction 2024. 12. 1. 20:37

서비스 장애 발생 시 빠른 인지를 위해 일정 시간마다 서버 상태를 체크하기 위한 스크립트를 작성하고

이것을 AWS lightsail에서 가장 저렴한 인스턴스에 올려 cron으로 동작시키고 있다.

 

https://satisfactoryplace.tistory.com/403

 

[사이퍼즈 서포터] 헬스체크 정책 추가

얼마 전부터, 불명의 원인으로 서버의 CPU수치가 100%로 치솟으면서 내려오지 않아 서버가 요청을 전혀 처리하지 못하는 현상이 발생하고 있다. 특정 프로세스, 특정 시간이나 특정 주기로 발현되

satisfactoryplace.tistory.com

 

그런데 아무리 저렴한 인스턴스라지만, 실제로는 5분에 한 번 서버 상태를 체크하는 기능 외 아무것도 하는 일이 없는데

instance 하나를 할당해서 헬스체크만 하는 것은 낭비 같다는 생각이 들어 다른 방안을 살펴보았다

 

Easycron

 

https://www.easycron.com/user/register

 

Plans & Sign up - EasyCron

Top Cron Job Service, Low Prices. 7 Days Money-Back Guarantee. Upgrade, Downgrade or Cancel Anytime.

www.easycron.com

 

처음에 검토했던 서비스는 easycron 처럼 cronjob만을 등록할 수 있는 서비스였다.

 

 

20분에 한 번씩 체크한다면 추가 과금 없이도 헬스체크 용도로 사용할 수 있다.

 

그러나 타임아웃이 비교적 짧아 응답시간이 늦거나 체크해야할 상태가 많다면 조기 중단될 위험이 있고,

실행 주기를 5분 이하로 가져가고 싶었다.

 

유료 플랜으로 가면 요구사항을 충족하지만 1년에 24달러가 필요한데, 

물론 라이트세일보다는 싸지만 월 단위 플랜이 없고 생각보다 싸지 않아 마음에 들지 않았다.

 

AWS lambda 

 

https://aws.amazon.com/ko/pm/lambda/?gclid=Cj0KCQiAr7C6BhDRARIsAOUKifjJX-CC7bAOyKxClhe5vpHaRsQZRcQUghI1jO5n4K_XjoYSOjJz6-caAr5REALw_wcB&trk=b28d8305-f5fb-4858-9ae6-04a78cfcc154&sc_channel=ps&ef_id=Cj0KCQiAr7C6BhDRARIsAOUKifjJX-CC7bAOyKxClhe5vpHaRsQZRcQUghI1jO5n4K_XjoYSOjJz6-caAr5REALw_wcB:G:s&s_kwcid=AL!4422!3!651510601848!e!!g!!aws%20lambda!19836398350!150095232634

 

aws lambda는 마치 함수 자체를 AWS에 업로드하고 외부에서 호출 가능하도록 해 주는 서비스이다.

 

예를 들어서

 

function (){
  return "안녕하세요";
}

 

 

라는 함수를 인터넷에 올리고, 그 함수의 url로 요청하면 "안녕하세요"를 응답하는 식이다.

 

asycn function(){
  // server check
  await fetch('http://YOUR_SERVER/').then(()=>{
    //ok
  }).catch(e=>{
    //alert to your telegram
  });
  
  // db check
  await CONNECT_TO_YOUR_DATABASE().then(()=>{
    //ok
  }).catch(e=>{
    //alert to your telegram
  });
  
  //else...
}

 

그렇다면 위 코드처럼 감시하고 싶은 서비스에 요청을 보내고 실패했을 때 텔레그램 등으로 알림을 보내는 함수를 만들 수도 있다.

 

AWS Cloudwatch

 

https://aws.amazon.com/ko/cloudwatch/

 

Amazon 모니터링 및 관찰성 - Amazon CloudWatch - AWS

강력한 시각화 도구를 사용하여 리소스 및 애플리케이션 데이터를 수집, 액세스 및 분석할 수 있습니다.

aws.amazon.com

 

Cloudwatch는 서비스, 리소스 등을 모니터링하고 특정 조건에서 어떤 동작을 트리거할 수 있는 서비스이다.

 

물론 lambda를 특정 시간마다 트리거하는 기능이 있으므로, 

cloudwatch + lambda를 사용하면 별도의 Instance 없이도 헬스체크를 할 수 있다.

 

AWS Lambda + Cloudwatch로 헬스체크

아주 간단하게 'http://YOUR_SERVICE_URL' 이라는 주소에 요청을 보내 오류코드가 내려오면 텔레그램에 알람을 보내는 헬스체커를 만들어 보자

 

https://ap-northeast-2.console.aws.amazon.com/lambda/home?region=ap-northeast-2#/functions

 

lambda 서비스로 접속하고 "함수 생성"을 누른다.

 

 

위와 같이 선택하고 "함수 생성"을 다시 누른다.

 

함수 생성이 완료되면 아래와 같이 코드 편집기가 표시된다.

 

 

기본적으로 mjs파일(esModule 방식)으로 생성되는데 cjs 나 js로 변경하여 CommonJS방식을 사용할 수도 있다.

 

Commonjs 방식을 선호하므로 cjs로 변경하고 아래와 같이 코드를 작성한다.

 

const handler= async ()=>{
  fetch("https://YOUR_SERVICE_URL").catch(e=>{
    ALERT_TO_YOUR_TELEGRAM("HEALTH_CHECK_FAIL: "+ e.message);
  });
  
  return "ok";
};

//lambda에서 실행할 함수는 반드시 handler로 내보내져야 한다
exports.handler= handler;

 

텔레그램으로 알림을 보내는 방법은 아래 링크를 참고한다.

(여기에서는 ALERT_TO_YOUR_TELEGRAM 함수로만 설명)

 

https://satisfactoryplace.tistory.com/308

 

[PHP] 텔레그램 봇 API로 서버 주요 알림 받아보기

가령 새로운 문의사항이 있다거나, 서버의 컴퓨팅 자원 소모량이 갑자기 늘어날 때 항상 모니터링을 하고 있는 것이 아니기 때문에 즉시 인지하기 어렵다. 그렇다고 별도의 알림 서버를 구축하

satisfactoryplace.tistory.com

 

코드 작성이 완료되었다면 배포를 진행한다.

 

저장만 해서는 lambda 함수가 갱신되지 않고, 반드시 deploy 버튼을 눌러주어야 갱신된다는 것을 명심하자.

 

 

이제 정상적으로 작동하는지를 테스트해보자

 

 

정상적으로 함수가 실행되었다면 return "ok"까지 내려올 것이므로

그냥 테스트 이벤트에서 이름만 지정해준 후 실행하여 "ok"가 내려오는지 확인해주면 된다.

 

 

실행에 성공했다면 위와 같은 결과를 얻을 수 있다.

 

 

이제 트리거를 설정해주기 위해 페이지 위쪽의 "트리거 추가"를 클릭한다.

 

 

EventBridge를 선택한다.

 

EventBridge를 통해 일정 시간마다 lambda 트리거를 발생시킬 것이다.

 

위와 같이 예약 표현식을 작성하면 매 3분마다 트리거를 발생시킨다.

 

더 많은 규칙은 아래 가이드에서 확인해볼 수 있다.

 

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule-schedule.html

 

Creating a rule that runs on a schedule in Amazon EventBridge - Amazon EventBridge

While you can create rules that run on a schedule, EventBridge now offers a more flexible and powerful way to create, run, and manage scheduled tasks centrally: EventBridge Scheduler. With EventBridge Scheduler, you can create schedules using cron and rate

docs.aws.amazon.com

 

 

놀랍게도 아주 간단하게 벌써 헬스체커 추가가 완료되었다!

 

AWS lambda 요금

이렇게 간단하다면 요금이 비싸지 않을까? 걱정할 수 있지만 

간단한 헬스체커 용도로만 사용한다면 거의 과금되지 않는다.

 

 

"GB - 초당 [가격]" 형식으로 되어있는데 의미는 간단하다.

 

GB는 lambda가 사용하는 메모리 1기가 기준을 의미한다.

 

lambda를 생성할 때 설정을 건드리지 않았다면 기본값인 메모리 124MB로 되어있을 것이다.

 

따라서 lambda함수의 실행시간이 1초라면,

GB - 초당 $0.0000166667이므로, 이 가격에 10%인 (메모리가 약 10%이므로)

실행시간 1초당 0.00000166667 이 과금된다.

 

 

한국 돈으로 따지면 함수 실행 1초당 0.0023원정도(환율 1400원 가정)가 과금되는 것이다.

 

만약 헬스체커가 한 번에 약 10초동안 동작하고, 3분에 한 번씩 호출된다면

 

한 번 호출에 0.0023 * 10 = 0.023원이 과금되고,

하루에는 480번 호출되므로 0.023*480 = 11.04원,

한달에는 11.04 * 30 = 331.2 원이 과금된다.

 

만약 lightsail 인스턴스를 사용했다면 5달러(약 7000원)이 과금될 것이다.

 

별도의 인스턴스를 사용하는 것 보다 Cloudwatch + lambda를 사용하는 것이 훨씬, 엄청나게 저렴하다!

 

 

게다가 프리티어 사용량을 넉넉하게 주기 때문에 공짜로 사용할 수도 있다.

 

한계: Cold start

lamda는 cold start라는 개념이 존재한다.

 

함수가 항상 ready 상태로 존재하는 것이 아니기 때문에,

일정 시간동안 호출하지 않으면 cold start가 발생하여 딜레이가 생긴다.

 

이를 방지하려면 호출 주기를 '5분 이하'로 설정해야 한다.

 

 

딱 5분으로 설정하면 위 그래프처럼 가끔씩 튄다.

 

아슬아슬하게 cold start가 발생하지 않도록 5분 미만으로 설정하는 것이 좋겠다.

 

한계: Delay

cloudwatch는 아주 정확한 시간에 트리거하지는 않는다.

 

매 3분마다로 설정했어도, 0시 0분 0초, 0시 3분 0초 처럼 정확한 시간에 트리거하지 않는다.

 

0분 10초, 30초 처럼 약간 밀릴 수도 있다는 것이다.

 

AWS 가이드에서는 1분 미만으로 딜레이가 발생할 수 있다고 한다.

 

최악의 상황에는 위의 Cold start와 겹쳐 1분 이상의 딜레이가 발생할 수도 있다.

 

 

 

 



Comments