Recap Series
- 세션 02: Terraform을 활용한 AWS 컴플라이언스
- 세션 03: 초보자에서 빌더로: 멋진 클라우드 여정
- 세션 04: Laravel와 Bref를 활용한 팀 우선 서버리스 엔지니어링
- 세션 05: 행사 개회: AWS Community Day Hong Kong 2025
- 세션 06: Agent-to-Agent: AWS에서 상호 운용 가능한 AI 구축하기
- 세션 07: AI 에이전트와 추가 텔레메트리 데이터를 활용한 신속한 개선
- 세션 08: 바이브 코딩을 넘어서: Kiro를 활용한 사양 주도 개발
- 세션 09: MCP 및 AI 에이전트를 활용한 자동화 테스트
- 세션 10: 통신 보안 현대화: ML 기반 접근 방식
- 세션 11: GenAI 에이전트 재고찰: RAG와 MCP
- 세션 12: TAK와 AWS를 활용한 재난 및 긴급 대응
- 세션 13: 테스트 관점에서 서버리스 애플리케이션 워크플로 재고찰
- 세션 14: 클라우드 성공을 위한 실용적인 AWS FinOps
1단계: 요구 사항
아키텍처 개요
- AWS Lambda와 Step Functions를 사용하는 배치 처리 워크플로입니다.
- 세 개의 상태가 직선 형태로 연결됩니다.
- 각 Lambda 함수에는 단위 테스트를 적용하지만 Step Functions 워크플로는 수동으로 테스트합니다.
테스트 목표
- Step Functions 워크플로 테스트를 자동화합니다.
- 입력값과 출력값이 예상값과 일치하는지 확인합니다.
- GitHub Actions를 사용하여 테스트를 CI/CD 파이프라인에 통합합니다.
- 테스트를 위해 실제 AWS 환경에 배포하지 않습니다.
2단계: 계획
도구 및 기술
- Step Functions Local: Step Functions를 로컬에서 실행하고 테스트합니다.
- GitHub Actions: CI/CD 워크플로를 자동화합니다.
- LocalStack 또는 유사 도구: AWS Lambda를 로컬에서 시뮬레이션합니다.
GitHub Actions 워크플로
- 푸시 또는 풀 리퀘스트 시 테스트를 실행하도록 워크플로를 설정합니다.
- 로컬 테스트 환경에 Step Functions Local Docker 이미지를 사용합니다.
- Lambda 시뮬레이션에 LocalStack을 사용합니다.
- https://www.localstack.cloud/
- Step Functions 정의를 가져와 워크플로를 로컬에서 실행합니다.
- 각 상태의 입력값과 출력값을 확인합니다.
워크플로 단계
- [ 1 ] 컨테이너 시작:
- Step Functions Local Docker 이미지를 가져와 시작합니다.
- Lambda 시뮬레이션을 위해 LocalStack을 설정합니다.
- [ 2 ] Step Functions 정의 가져오기:
- 상태 머신 정의를 로컬 환경으로 가져옵니다.
- [ 3 ] 워크플로 실행:
- 로컬 엔드포인트를 사용하여 Step Functions 워크플로를 트리거합니다.
- [ 4 ] 결과 검증:
- 입력값과 출력값을 예상값과 비교합니다.
- [ 5 ] 결과 보고:
- 테스트 성공 또는 실패를 나타내는 보고서나 상태를 생성합니다.
서버리스 아키텍처를 테스트하는 방법
소개
- 서버리스 아키텍처는 고객에게 가치를 빠르게 제공할 수 있게 하는 상당한 이점을 제공합니다.
- 여기서는 시스템 성능이나 비용이 아니라 테스트 관점의 검증에 초점을 맞춥니다.
테스트가 필요한 이유
- 테스트는 시스템 동작을 이해하고 예측하며 제어하는 데 도움이 됩니다.
- 시스템 위험을 식별하고 정량화할 수 있습니다.
- 테스트를 작성하면 요구 사항을 더 잘 이해할 수 있습니다.
- 테스트는 결과의 재현 가능성과 설명 가능성을 보장합니다.
- 테스트의 주된 목표는 알려지지 않은 위험을 줄이는 것입니다.
테스트 유형
- 단위 테스트: 개별 구성 요소나 함수를 격리하여 테스트합니다.
- 통합 테스트: 결합된 구성 요소 간의 상호 작용을 테스트합니다.
- 로직 테스트: 비즈니스 로직의 정확성을 검증합니다.
- 워크플로 테스트: 프로세스나 워크플로의 전체 흐름을 테스트합니다.
- API 테스트: API의 기능과 안정성을 테스트합니다.
권장 사항
- 여러 테스트 유형과 각각의 목적 및 목표를 파악하는 것이 중요합니다.
- 이러한 테스트 유형을 이해하면 서버리스 아키텍처를 위한 효과적인 테스트 전략을 설계하는 데 도움이 됩니다.
더 쉬운 테스트를 위한 처리 분리
핵심 사항
- 테스트하기 쉬운 단위: 테스트하기 쉬운 단위는 이해하기도 쉽습니다.
- 시스템 명확성: 시스템을 분리된 테스트 가능 단위로 설계하면 무엇을, 언제, 왜 수행하는지 자연스럽게 드러납니다.
- 복잡성 방지: 테스트하기 어렵다면 한곳에 너무 많은 책임과 로직이 집중되어 있을 가능성이 큽니다.
예시 비교
- 부족한 아키텍처: 하나의 Lambda 함수가 다른 서버에서 데이터를 가져오는 작업과 DynamoDB에서 데이터를 처리하고 저장하는 작업을 모두 담당합니다.
- 적절한 아키텍처: 각 작업(데이터 가져오기, 데이터 처리 및 저장)에 별도의 Lambda 함수를 사용합니다.
분리의 이점
- 각 부분을 개별적으로 더 쉽게 테스트할 수 있습니다.
- 오류가 발생했을 때 문제의 정확한 위치를 더 쉽게 찾을 수 있습니다.
- 오류 발생부터 오류 식별 및 수정까지 걸리는 시간을 줄입니다.
일반 원칙
- 메서드 분리: 메서드를 분리하는 동일한 원칙이 여러 프로그래밍 언어(예: Python, Ruby, Go)에 적용됩니다.
- 작은 단위: 작고 테스트 가능한 단위가 무엇인지 판단하고 그에 따라 이 분리 원칙을 적용합니다.
시스템 설계의 테스트 관점
- 취약점 식별: 테스트 관점에서는 한곳에 책임이 과도하게 집중되는 등의 취약점을 쉽게 식별할 수 있습니다.
- 오류 탐지 시간 단축: 높은 테스트 용이성은 개발 주기를 단축하는 것과 마찬가지로 오류 발생부터 탐지 및 수정까지 걸리는 시간을 줄이는 데 도움이 됩니다.
- 빠른 제공: 높은 테스트 용이성은 시스템을 더 빠르게 제공하는 데 기여합니다.
테스트 관점에서 서버리스 아키텍처를 구축할 때 고려할 핵심 사항
- 처리 분리: 테스트하기 쉬운 단위는 이해하기도 쉽습니다. 프로세스를 분리하면 취약점을 식별하고 오류 탐지 시간을 줄이는 데 도움이 됩니다.
- 복잡성 방지: 한곳에 책임과 로직이 집중되면 테스트가 어려워집니다. 프로세스를 분리하여 테스트와 문제 해결을 단순화합니다.
- 높은 테스트 용이성: 시스템 제공 속도를 높이고 개발 주기를 단축하는 데 기여합니다.
최종 목표
- 엔지니어의 궁극적인 목표는 사용자에게 가치를 제공하는 것입니다.
- 성공적인 결과를 보장하려면 항상 사용자 가치를 염두에 두어야 합니다.
- 통찰을 공유하고 테스트 관행을 개선하기 위한 토론과 협업을 장려합니다.
