오늘 내용은 Terrafrom Up&Running(테라폼 업앤러닝) 책의 6장 내용을 바탕으로 정리하였다.
인프라 란?
기본적으로 개발이나 서비스를 하기 위에 물리적으로 구성된 Network, DB, Server, Cloud 등을 의미한다. 즉, 데이터를 주고받기 위한 물리적 장비를 의미한다.
구성요소
- 하드웨어 (HW)
- 서버, 데이터 센터, 개인용 컴퓨터, 라우터, 스위치 등 기타 장비가 포함
- 운영체제 (OS)
- 각종 하드웨어적인 자원과 소프트웨어적인 자원을 효율적으로 운영 관리함으로써 사용자가 시스템을 이용하는데 편리함을 제공하는 시스템 소프트웨어
- 네트워크 (Network)
- 몇 개의 독립적인 장치가 적절한 영역 내에서 적당히 빠른 속도로 물리적 통신 채널을 통하여 서로가 직접 통신할 수 있도록 지원해주는 데이터 통신 체계
- 미들웨어 (Middleware)
- Web Server, DBMS 등 운영체제와 비지니스를 처리하는 애플리케이션의 중간에서 도움을 주는 소프트웨어
프로덕션 수준의 인프라 란?
개발하고 테스트하는 과정에 필요한 환경이 아닌 사용자에게 서비스를 제공하는 환경을 프로덕션 환경이라 말한다.
서버, 데이터 저장소, 로드 밸런서, 보안 기능, 모니터링 및 경고 도구, 파이프라인 구축 및 비지니스 운영에 필요한 기타 모든 기술이 포함된다.
한두가지의 기술이 필요한게 아니다보니 프로덕션 환경의 인프라는 어떠한 수준을 갖춰야 하는지는 회사마다, 조직마다 또 조직에 속해 있는 개개인마다도 기준이 다를 수 있다.
혼자 운영하는 인프라거나 서비스 중인 인프라가 수가 적거나 크기가 작다면 각각 다르게 구성되어있어도 크게 문제되지 않을 것이다.
하지만 관리하는 인원이 많거나 서비스가 많은 경우, 인프라의 구성과 수준이 다르다면 기존 서비스를 지속적으로 운영하는 것과 새로운 서비스의 인프라를 새롭게 구축하는데 크고 작은 이슈들이 지속적으로 발생할 수 있다. 이런 어려움으로 인해 운영/구축에 필요한 시간 조차 추정하기 어렵고 추정을 했더라도 추청치 자체가 아주 부정확 할 수 있다.
조금이라도 이러한 문제를 해결하려면 프로덕션 수준의 인프라는 어떤 것들을 갖춰야되는지 기준을 마련하고 작업시 참고할 체크리스트를 만들어야한다.
체크리스트를 작업시 참고하며 어떤 항목을 구현했는지, 어떤 항목을 건너뛰기로 결정했는지, 그 이유는 무엇인지를 의식적으로, 명시적으로 문서화 할 필요가 있다.
체크 리스트
작업 | 설명 | 사용 가능한 도구 |
---|---|---|
설치 (Install) |
소프트웨어 바이너리나 필요한 종속성을 설치 | 배시, 셰프, 앤서블, 퍼핏 |
설정 (Configure) |
포트 설정, TLS 인증서, 서비스 디스커버리, 리더, 팔로워, 복제 등의 소프트웨어 설정 | 배시, 셰프, 앤서블, 퍼핏 |
프로비전 (Provision) |
서버, 로드 밸런서, 네트워크, 방화벽, IAM 권한 설정 등의 인프라 제공 | 테라폼, 클라우드포메이션 |
배포 (Deploy) |
인프라 상위의 서비스를 배포 중단 시간 없이 업데이트를 롤아웃 블루-그린, 카나리 배포 등 | 테라폼, 클라우드포메이션, 쿠버네티스, ECS |
고가용성 (High availability) |
프로세스, 서버, 서비스, 데이터 센터, 리전 등의 장애에 대비 | 멀티 데이터 센터, 멀티 리전, 복제, 오토스케일링, 로드 밸런싱 |
확장성 (Scalability) |
요청량에 따른 스케일 업/아웃 수평적 확장, 수직적 확장 | 오토스케일링, 복제, 샤딩, 캐싱, 분할 정복 |
성능 (Performance) |
CPU, 메모리, 디스크, 네트워크, GPU 용량 최적화쿼리 튜닝, 벤치마킹, 테스트, 프로파일링 | 다이나트레이스(Dynatrace), 밸그린드(valgrind), 비주얼VM(VisualVM), 제이미터(Jmeter) |
네트워킹 (Networking) |
정적 혹은 동적 IP 설정, 포트, 서비스 디스커버리, 방화벽, DNS, SSH 접속, VPN 연결 | VPC, 방화벽, 라우터, DNS registars, OpenVPN |
보안 (Security) |
TLS를 통한 통신 중 데이터 암호화, 디스크 암호화, 인증, 인가, 보안 관리, 서버 하드닝 | ACM, Let’s Encrypt, KMS, 코그니토(Cognito), 볼트, CIS |
성능 지표 (Metrics) |
가용성, 비즈니스, 애플리케이션, 서버, 이벤트, 추적, 알림에 대한 메트릭 | Cloudwatch, DataDog, NewRelic, Honeycomb |
로그 (Logs) |
로그 순환, 중앙으로 로그 데이터 수집 | Cloudwatch Logs, ELK, Sumo Logic, Papertrail |
백업 및 복구 (Backup and Restore) |
DB, 캐시, 기타 데이터를 일정에따라 백업 리전별, 계정별 복제 | RDS, ElastiCache, 복제 |
비용 최적화 (Cost Optimization) |
적절한 인스턴스 유형 선택, 스팟 혹은 예약 인스턴스 사용, 오토스케일링, 사용하지 않는 리소스 정리 | 오토스케일링, 스팟 인스턴스, 예약 인스턴스 |
문서 (Document) |
코드, 아키텍처, 모든 내용을 문서화 장애 대응 내용 정리 | README, wikis, slack |
테스트 (Tests) |
인프라 코드 테스트 자동화 항상 테스트 후에 배포 | 테라테스트, 인스펙(inspec), 서버스펙(serverspec), 키친 테라폼( kichen-terraform) |
체크리스트를 본인이 운영/구축해야하는 서비스 인프라 기술 스택에 맞게 디벨롭하고, 각 구성 요소별 반드시 챙겨가야 될 요소들을 추가한다면 여러 서비스를 운영 할 때 좀 더 표준화된 환경을 만들어 나갈 수 있을 것이라 생각한다.