[Production Traffic] 특정 API 호출 시 CPU와 Memory가 급증할 경우를 대비한 사전 시뮬레이션
·
Production Traffic
들어가며장애는 무작위가 아닌 ‘예고된 반복’이다.운영 환경에서 장애는 종종 예고 없이 찾아오는 것처럼 보이지만, 대부분은 이미 수많은 징후를 포함한 반복적인 패턴 속에서 발생합니다. 그중 대표적인 것이 특정 API의 리소스 폭증입니다. 이번 포스팅에서는 다음과 같은 상황을 가정하여 테스트를 진행했습니다:> "만약 특정 API가 예상치 못하게 CPU와 Memory를 고갈시킨다면, 현재의 ECS Auto Scaling 정책은 이 상황에 얼마나 잘 대응할 수 있을까?" 코드는 수정하지 않고, 인프라 수준에서 ECS (EC2 타입) 기반 Auto Scaling 정책을 설정하고 `/v1/stress` API를 반복 호출해 실제 리소스 폭증을 유발해 봤습니다. 이를 통해 지표 기반 Auto Scaling ..
[Production Traffic] MySQL 인덱스 전후 성능 차이, 실무 부하 테스트로 증명하기
·
Production Traffic
들어가며현재 운영 중인 애플리케이션에서 특정 API의 응답 속도가 눈에 띄게 느려지는 현상이 발생하고 있었습니다. 사용자 입장에서는 페이지가 늦게 뜨고, 모니터링 시스템에서는 평균 응답 속도가 높게 유지되며 경고 알람이 자주 발생했습니다. 문제가 된 API는 단순히 MySQL에서 특정 조건(`email`)을 만족하는 데이터를 조회하는 쿼리 하나뿐이었습니다. 로직도 복잡하지 않고, 데이터의 양도 수백만 건 수준이라 아직 임계점이라고 보기도 어려운 상황이었죠. 그래서 이 문제를 해결하기 위해, 쿼리 성능 분석과 함께 MySQL의 인덱스(Index)를 활용한 성능 개선 작업을 진행했습니다. 그리고 이 효과를 k6 부하 테스트 도구를 통해 수치로 증명해 보았습니다. 이번 글에서는 인덱스를 적용하기 전/후..
[Production Traffic] DynamoDB 쿼리가 느려터졌다면? GSI로 빠르게 만들자 – 실전 튜닝 사례
·
Production Traffic
배경최근 사용 중인 Golang 애플리케이션에서 특정 API의 응답 속도가 느려, 사용자에게 정보를 빠르게 제공하지 못하는 문제가 있었습니다. 분석 결과, DynamoDB에서 `Scan`을 사용해 데이터를 조회하고 있었고, 이로 인해 성능이 크게 저하되고 있었습니다. 쿼리 효율화를 위해 Global Secondary Index(GSI)를 도입해 문제를 해결하고자 했습니다.인프라 구성0.25vCPU, 0.5GB을 가진 ECS Task 2대로 구성하였으며, 해당 애플리케이션은 다음과 같은 구조에서 동작합니다: - POST Method: 새로운 데이터를 DynamoDB에 삽입 - GET Method: 특정 조건으로 데이터를 조회 (문제 발생 지점)문제 상황인프라 부하 테스트를 위해 [k6](https://..
[AWS Service] 생성한 EC2에 EBS 마운트하는 방법
·
AWS Service
안녕하세요. 이번 글에서는 생성한 EC2에 EBS를 마운트하는 방법에 대해서 적어보도록 하겠습니다. 먼저 EC2에 마운트 작업을 하기 때문에 Default VPC를 사용하겠습니다.사전준비먼저 Default VPC 혹은 VPC를 생성하고, 임의의 EC2를 생성합니다.1. EBS 생성먼저 생성한 EC2에 붙힐 EBS를 생성합니다.원하는 Volume type와 Size 등등 잘 설정하여 생성합니다.2. EC2에 EBS 연결EC2에 생성한 EBS를 Attach 해줍니다.원하는 Instance를 선택하고 Device name을 선택 후 Attach 합니다.3. EBS 마운트EBS를 마운트하기 위해 먼저 EC2에 접근합니다. 접근 후 아래 명령어를 실행하면 아래와 같이 마운트되지 않은 디스크가 추가되어 있습니다.l..
[Kubernetes] 여러 Kubernetes 네임스페이스에서 단일 ALB Ingress 사용하기
·
Kubernetes
이번 글에서는 Amazon EKS에서 단일 AWS Application Load Balancer(ALB)를 사용하여 여러 Kubernetes 네임스페이스에 배포된 서비스에 대한 인그레스 트래픽을 관리하는 방법을 소개합니다. 구체적으로, 서로 다른 네임스페이스에 배포된 두 개의 서비스(HTTPD와 NGINX)에 대해 ALB Ingress Controller를 설정하고 URL 경로를 기준으로 트래픽을 라우팅하는 방법을 설명합니다.사전 준비시작하기 전에 다음 사항들을 확인해야 합니다:EKS 클러스터가 정상적으로 작동하고 있어야 합니다.ALB Ingress Controller가 클러스터에 설치되어 있어야 합니다. 설치 방법은 공식 문서를 참조하세요.1. httpd 네임스페이스에 HTTPD 애플리케이션 배포하기우..
[AWS Service] MWAA와 Glue를 연동하여 데이터 파이프라인 구축하기
·
AWS Service
안녕하세요! 오늘은 Amazon MWAA (Managed Workflows for Apache Airflow)와 AWS Glue를 연동하여 데이터 파이프라인을 구축하는 방법에 대해 알아보겠습니다. MWAA는 Airflow를 관리형 서비스로 제공하여 데이터 엔지니어링 워크플로우를 쉽게 관리할 수 있도록 해줍니다. Glue는 서버리스 ETL(추출, 변환, 로드) 서비스로, 데이터를 정리하고 변환하는 데 사용됩니다.1. S3 버킷 생성먼저, S3 버킷을 두 개 생성합니다.mwaa-scripts-s3: MWAA 스크립트, DAG, 플러그인, 요구 사항 파일을 저장하는 데 사용됩니다.mwaa-dataset-s3: 처리할 CSV 파일을 업로드할 데이터셋 저장소로 사용됩니다.2. 로컬 환경 설정 (MWAA Local..
[Kubernetes] Kubernetes Mutating Webhook을 이용한 Sidecar 자동 주입 가이드
·
Kubernetes
이번 글에서는 Kubernetes Mutating Webhook을 사용하여 Sidecar를 자동으로 주입하는 방법에 대해 알아봅니다. 이를 통해 각 Pod에 Sidecar 컨테이너를 수동으로 추가하는 번거로움을 덜고, 일관된 환경을 유지할 수 있습니다.1. Prerequisites시작하기 전에 다음 도구가 설치되어 있어야 합니다.gitkubectlmakeDocker2. 프로젝트 복제 및 설정먼저, 다음 명령어를 사용하여 필요한 Kubernetes Mutating Webhook 튜토리얼 저장소를 복제합니다.\git clone https://github.com/morvencao/kube-mutating-webhook-tutorial.gitcd kube-mutating-webhook-tutorial3. Sid..
[Kubernetes] EKS 클러스터에 ReadOnly 및 Admin 권한 설정하기
·
Kubernetes
안녕하세요! 이번 글에서는 Amazon EKS (Elastic Kubernetes Service) 클러스터에 ReadOnly 및 Admin 권한을 설정하는 방법에 대해 알아보겠습니다. 이 설정을 통해 특정 IAM 역할 (Role)에게 클러스터 내의 리소스에 대한 읽기 전용 또는 관리자 권한을 부여할 수 있습니다. 사전 준비 사항warm-readonly-eks-role 생성 및 Bastion 연결: ReadOnly 권한을 부여할 IAM 역할을 미리 생성하고, 필요에 따라 Bastion 호스트에 연결해둡니다. 마찬가지로, Admin 역할을 위한 IAM 역할도 미리 생성합니다.1. 클러스터 접근 및 설정# clusterrole.yamlapiVersion: rbac.authorization.k8s.io/v1ki..