CHANBEEN.COM
K6 탐색적 부하 테스트, CloudWatch/SNS 실습
2025-07-17#AWS#Observability

K6 탐색적 부하 테스트, CloudWatch/SNS 실습

자료실

🙋‍♂️ 발표자: 김찬빈
📆 발표일: 2025년 7월 17일
🎤 주제: K6 탐색적 부하 테스트: SLI 측정과 SNS/Gmail 알람 연동 실습
발표자료 다운로드 (PDF)

들어가며

안녕하세요.
현재 대학생 AWS 커뮤니티 AWS Cloud Clubs에서 DevRel(Core)로 활동하고 있는 김찬빈입니다.
금일 세미나 세션에서 진행 한 "K6 탐색적 부하 테스트: SLI 측정과 SNS/Gmail 알람 연동 실습" 발표 내용을
블로그 글 형태로 한번 더 정리해보려 합니다.

실습시작이미지

실습은 단순한 테스트를 넘어서, SLI 지표 설계
실시간 장애 감지 알림 시스템 구축까지 포함되어 있습니다.
처음 AWS를 접하는 사람, 노베이스 분들도 많아 최대한 흥미를 이끌 수 있도록 구성하였습니다.
세미나 실습을 쉽게 따라올 수 있도록 미리 설정된 AMI를 제공했으며, 세션 종료 이후 더 이상 공유되지 않습니다.

왜 부하 테스트와 모니터링이 중요한가?

"블랙프라이데이, 서버 다운으로 수억 원 손실!"
블랙프라이데이_그래프
2018 헝가리 블랙프라이데이 주문 트래픽 토픽

헝가리에서 나온 자료입니다.
블랙프라이데이를 성공적으로 처리하는 방법이란 이름의 자료이며, 본문에 아래와 같은 내용이 있습니다.

"블랙 프라이데이 기간 동안 헝가리 고객들이 경험한 가장 큰 문제는 웹사이트 고장, 제공된 상품의 사용 불가/부족, 결제 시스템 오작동..."

이처럼, 서비스 장애는 곧 서비스의 신뢰도 뿐 만 아니라,
직접적인 매출 등에도 큰 영향을 끼칩니다.

부하테스트,모니터링 툴

이러한 상황에 부하 테스트는 현행 시스템의 한계를 미리 파악하고,
이를 기반으로 장애를 예방하는 방법입니다.

또한 실시간 모니터링이 함께 되어야
조기에 감지하고, 빠른 대응으로 피해를 최소화할 수 있겠습니다.

많은 툴이 있지만, 그 중에서도 K6와 CloudWatch를 사용하여 세션을 진행하려 합니다.


실습 인프라 구성

이번 실습에서는 아래와 같은 구조로 구성했습니다.

시스템 구성 다이어그램

  • EC2 인스턴스 2대: Node.js API 서버, K6 부하 테스트 서버
  • Amazon CloudWatch: 모니터링 서비스
  • Amazon SNS: 알림 전송 서비스
  • Gmail: 최종 이메일 수신

Node.js 서버

실제 세미나에선 "코드를 만든다"라는 개념을 최소화하고,
AWS에 대한 흥미를 최대화 하기 위해 서버가 자동 수행되는 AMI를 제공했었습니다.
지금은 세미나가 종료되어, 코드만 아래에 기록하고 넘어가겠습니다.

const express = require('express');
const app = express();
const port = 3000;

app.get('/ping', (req, res) => {
    res.send('PONG!');
});

app.get('/stress', (req, res) => {
    const loop = parseInt(req.query.loop) || 100000;
    let sum = 0;

    for (let i = 0; i < loop; i++) {
        sum += i;
    }

    res.send(`stress test. Init: ${loop}, Sum: ${sum}`);
});

app.listen(port, () => {
    console.log(`port: ...`);
})

Node API 서버는 간단합니다.
/ping : "PONG!"을 반환하는 테스트 엔드포인트
/stress?loop=x : "x"까지의 모든 수를 덧셈하여 반환하는 API입니다.

K6 서버

Node API 서버와 마찬가지로, AMI로 제공되었었으나 본 글에선 삭제되었습니다.
기본 템플릿은 아래와 같이 구성되어 있었습니다.

import http from 'k6/http';  
import { sleep, check } from 'k6';

export const options = {  
    vus: 1,  
    duration: '5s',  
};

export default function () {  
    http.get('http://<서버IP>:3000/ping');  
    check(res, {
        'status is 200': (r) => r.status === 200,
    });
    sleep(1);  
}  

K6 부하 테스트 실습

왜 K6를 골랐지?

  • 오픈소스이기 때문에, 누구든 버그가 있다면 기여할 수 있다.
  • JavaScript로 작성되어 러닝커브가 적다.
  • GUI 없이 CLI로 빠르게 테스트가 가능하다.
  • 제한된 meet-up 시간 내 수행하기에 적합하다 판단했다.

테스트 예시 코드

import http from 'k6/http';  
import { sleep } from 'k6';

export const options = {  
    vus: 10,  
    duration: '10s',  
};

export default function () {  
    http.get('http://<서버IP>:3000/stress?loop=10');  
    sleep(1);  
}  

테스트 스크립트는 10명의 가상 유저가 10초 동안 /stress API를 1초 간격으로 호출하는 시나리오입니다.
이를 통해 응답 시간, 실패율, 백분위 수 등의 성능 지표를 확인할 수 있습니다.

아래 명령어를 통해 실행하면,

k6 run hands-on.js

여러 결과를 얻을 수 있습니다. k6 실행 결과

  • 요청 성공여부에 대한 정보
  • HTTP 호출에 대한 성능
  • 실행 통계
  • 네트워크 통계

총 네가지 지표를 확인할 수 있었습니다.
테스트에선 문제가 없다 보일 수 있어도,
부하를 더 주면 에러가 생길 수도 있고, 이를 통해 시스템의 한계 탐색이 가능합니다.

탐색적 분석 예 이처럼, 지속적으로 테스트를 수행하여 한계치를 찾아가는 과정을
탐색적 데이터 분석이라 합니다.


SLI란 무엇인가?

SLI (Service Level Indicator)
사용자의 입장에서 직접 체감 가능한 서비스 품질 지표를 말합니다.

너무 어렵게 생각할 것 없이,
아래 표와 같다고 보면 될 것 같아요.

용어 설명 더 쉽게
SLI 현재 측정된 성능 지표 현재 상태
SLO 서비스 제공자가 설정한 목표 수준 목표 상태
SLA 위반 시 고객과 맺은 계약 및 보상 조건 계약

예를 들어보면,

  • SLI: 평균 응답시간 7.19ms
  • SLO: 20ms 이하
  • SLA: 초과 시 SLA 위반, 보상 조건 수행

이런 식으로, 되겠네요!

SRE 요소


CloudWatch, SNS, Gmail 알림 구축

앞서 설정한 지표와 결과를 기반으로
알림 시스템을 만들어보도록 합니다.

1️⃣ SNS 주제 생성

SNS는 "AWS Simple Notification Service"로,
MQ(Message Queue) 와 같이 “구독자”들에게 메시지를 보낼 수 있는 서비스입니다.
하지만 MQTT와 같이 데이터를 "저장"하여 가지고 있지는 않아요!

이메일 뿐 아니라, AWS에 있는 다른 서비스들과도
넓은 범위로써 연동시킬 수 있습니다. XML이나 JSON으로 출력되는 것도요!

  • AWS Console → SNS → 새 주제 생성
  • 유형은 표준(Standard)
  • 구독자 추가 → 이메일 주소 입력
  • 수신된 메일을 통해 인증 완료

📩 인증 후, “확인됨” 상태로 변경됩니다.

2️⃣ CloudWatch 알람 생성

CloudWatch는 AWS 리소스(CPU 사용률, 네트워크 등) 모니터링 및 알람설정 서비스입니다.
AWS가 제공하는 모니터링 서비스는 여러가지가 있지만, 그 중 하나입니다!

  • AWS Console → CloudWatch → 알람 생성
  • 지표: EC2 인스턴스의 CPU 사용률
  • 조건 예시: 5분 평균 10% 초과 시
  • 알람 수신자: 위에서 생성한 SNS 주제 연결

3️⃣ 부하 발생 테스트

이제, 앞에서 만든 모든 상황을 이용하여 테스트하면 됩니다.
k6 run ...을 통해 API서버에 부하를 발생시키고,
해당 인스턴스의 CPU 사용량을 CloudWatch가 인식하여
5분 평균 10%를 초과하면 이메일이 전송됩니다.

테스트 결과


마무리

이번 세미나 실습을 통해 얻을 수 있었던 가장 큰 교훈은,
사전에 대비하는 시스템 구조가 서비스의 생존을 좌우한다는 점이었습니다.

단순히 성능 테스트만 하고 끝나는 것이 아니라,

  • 실시간으로 성능을 모니터링하고,
  • 문제가 감지되었을 때 빠르게 대응할 수 있도록,
  • 자동화된 경보 시스템까지 구축하는 것이

미래의 정식 DevOps를 꿈꾸는 사람으로써 중요하다는 생각이 드네요.

발표를 마치며

이번 세션은 제가 AWS Cloud Clubs의 DevRel(Core Member)로 활동하면서,
처음으로 주제부터 직접 기획하고, 발표한 공식 세미나 세션이었습니다.
어떤 주제로 해야할지 정말 고민이 많았는데,
무엇이든 "첫 시작"은 흥미와 재미를 붙이는 게 우선이라 생각합니다.

기술적인 지식을 많이 쌓는다보다- AWS를 시작하고, 진로를 찾고 있는 학우들이
실습을 통해 AWS에 흥미를 느낄 수 있도록, 어려워하지 않도록
구성하려 노력했습니다.

그럼, 관심 가져주셔서 감사합니다!😁

일부 주요 QNA

QNA

  • CloudWatch 말고도 다른 모니터링 서비스들도 소개해주세요!

    • CloudTrail은 Watch와 다르게 보안 및 감사에 가까운 서비스입니다. API 호출 기록이나 수정 이력들이 어떤 IMA에서 발생하고, 언제 어떻게 수행되었는지를 로깅하죠.
    • X-Ray는 서비스와 서비스 간 발생하는 리소스를 트랜젝션 단위로 모니터링합니다. 마이크로서비스를 구축하거나, ECS나 EKS 등 여러 서비스를 구동하였을 때 어디서 병목이 발생하고 지연이 나타나는지를 파악할 수 있겠죠!
  • 부하 테스트같은 이슈 외에도 배포 이후 업데이트와 같은 변경사항을 일반 사용자에게 보낼 수 있는지 궁금합니다.

    • CloudWatch 등은 서버 어플리케이션의 리소스를 모니터링하는 것 이기 때문에,
      그런 배포 관련한 부분은 Jenkins나 ArgoCD와 같은 CI/CD 툴에서 자동화 스크립트를 통해 이용하는 경우가 더 일반적인것으로 알고 있습니다.

세미나 평가

모범적인 핸즈온 사례로 남을 거 같습니다🙌🏻  
부하 테스트를 넘어, SLI 측정 → CloudWatch 경보 → SNS 이메일 알림 → Gmail 수신까지 엔드투엔드 자동화된 관측 흐름을  
경험할 수 있어서 너무 유익했습니다. 실제 실무경험들까지 중간중간 알려주셔서 실무에서의 용도에 대해 더 와닿았어요. 짱!!
실습과 실제로 서비스를 체험해 볼 수 있어서 관련 기술을 빠르고 효율적으로 알아볼 수 있어서 좋았습니다.  
코드가 최소화된 실습을 준비해주셔서 nodejs에 대해서 하나도 몰랐지만 실습을 진행하는데 어려움 없이 잘 진행했습니다.  
유익한 세션이었습니다!
실제로 해보니까 더 재밌었고, 예전에 cloudwatch 지표 설정에서 뭐가 뭔지 모르겠어서 해보려다가 포기했었는데 실습으로 할 수 있어서 좋았습니다.  
설명 잘 해주셔서 이해하고 따라가기 쉬웠어요. 부하 테스트라는 게 생소하고 k6에 대해서도 평소에 찾아본 적이 없었는데 세미나 듣고  
실습 진행해보면서 관련해서 더 공부해보고 싶다는 생각이 생겼습니다. 더 흥미가 생겼어요~!  
ACC에서 하게 된 첫 실습이라 의미가 깊은 것 같아요! 세세하게 설명해 주셔서 따라가는 데 어려움 없었어요.  
실제 서비스를 만들때도 이런 부하테스트를 도입하면 좋을 것 같아서 유익했습니다 🙂 

Etc... :D