2023년 10월, 아키텍처·데브옵스 트랙을 들으러 AWS Community Day Seoul 행사에 다녀왔다. 아키텍처·데브옵스, 서버리스, 분석·인공지능 총 3가지 트랙이 동시에 다른 장소에서 진행되었는데, 아키텍처·데브옵스 트랙만 해도 100명 넘는 개발자들이 참석한듯 했다. (주최측에서 공유해주신 행사 현장 사진들을 보다가, 내 얼굴이 찍혀있어서 가져와봤다. 😝)
행사에 입장할 때 네임 뱃지와 여러 굿즈들이 제공되었다. 그때는 몰랐는데 네임 뱃지 다시 보니 이름을 html name 태그로 감싼 형태인게 너무 귀엽다!! 굿즈는 우산, 티셔츠, 에코백 등등 센스있는 제품들로 가득했지만, 무엇보다도 가장 마음에 든건 "개발자 전투 식량"이었다.
개발자 전투 식량은 전투 식량처럼 꾸며진 패키지에 달콤한 간식들이 잔뜩 들어 있었다. 🍬 특히 패키지 앞면에 작은 글씨로 적혀있던 "과잉 섭취는 과도한 개발 의욕을 불러일으켜 지나친 야근 및 피로에 시달릴 수 있음"이라는 주의 문구가 인상적이었다. 🤭
당시 재직중이던 회사에는 인프라팀이 따로 있어서, 내가 직접 회사 인프라를 다룰 기회는 없었다. 하지만 사이드 프로젝트를 할 때 AWS로 인프라를 구축하거나 개선해야하는 경우가 종종 있다. 현재 작업하고 있는 Scents Note의 인프라 부터 배포 파이프라인까지 직접 구축 및 관리하고 있다. 뿐만 아니라, 인프라를 직접 다룰 일이 없더라도 인프라에 대한 지식이 풍부하면 서버 코드를 효율적으로 설계하고 성능을 향상시킬 수 있다.
회사마다 백엔드 개발자의 업무 범위가 다르기 때문에 백엔드 개발자가 DevOps까지 관여하는 경우도 많이 볼 수 있다. 그만큼 인프라는 시스템을 구축하고 운영하는데에 백엔드와 필수적으로 연관되어 있으므로, 백엔드 개발자에게도 꾸준히 공부해야하는 영역이다.
by 안정수 발표자님 (카카오 서버 엔지니어)
안정수 발표자님은 회사에서 신규 프로젝트 개발팀에 영입을 제안 받으셨다. 자유롭게 실험할 수 있는 환경이 마련되고, 해외 타겟팅 서비스이며 AWS 인프라 사용이 가능하다는 점들에 매력을 느끼고 조인하셨다고 한다. 그러나, 자유가 커질수록 책임감도 늘어났다. 서버 6명 중 AWS 유경험자는 정수님 뿐이었고 혼자 이끌어가기엔 경험이 부족한 상황이었다.
프로젝트의 요구사항은 다음과 같다.
이를 위해 필요한 과정은 다음과 같다.
너무 크지 않으면서 겹치지 않게!
우선, 잘 정리된 AWS VPC 튜토리얼을 살펴보자. 주의해야할 점은 ipv4 CIDR block: 10.0.0.0/16
이 매우 큰 사이즈의 네트워크 대역이므로, 시작하는 단계에서는 오버 스펙일 수 있다. 초기 설정할 때 신중해야하므로, 사용하는 API가 몇 개일지 추정하고 그에 맞는 대역을 정하는것이 좋다.
이 외에도 사내 네트워크 대역과의 연결도 고려해야한다. 다른 팀과의 VPC 대역과 겹치지 않으면서, 개발 환경과 운영 환경을 구분해서 설계해야한다.
역할에 따라 구분하여 구성하자.
총 4개의 Subnet으로 구성했으며, private Subnet을 기준으로 각각의 역할에 따라 구분하였다. public에는 Nat를 구성하였고, private 3개에는 각각 EKS Woker, Database, 그리고 VPC Endpoint를 구성하였다.
많을 수록 좋지만, 비용도 생각하자.
AZ(Availability Zone)는 비용 측면과 VPC 대역을 고려하여 결정해야 한다. 보통 많을수록 안정성이 높아지지만 비용 증가와 VPC 대역을 고려해야 한다. Aurora와 같이 다중 AZ를 사용하는 경우 3개의 AZ가 좋은 선택이 될 수 있지만, 비용을 고려해서 2개로 설정하였다.
Best practice를 많이 살펴본 후 선택하자.
Computing - Amazon EKS
Aws managed라서 편리하길 기대했지만, 도입하는데 시간이 오래 걸렸다. 언젠가 다시 4개월치 프로젝트를 구성한다면 선택하지 않을 거라고 하셨다.
EKS를 도입하는데 오래 걸린 이유는 크게 3가지였다.
DB - RDS
Aurora와 같은 고성능 데이터베이스 서비스는 대규모 처리 또는 높은 부하를 감당할 때 뛰어난 성능을 보이는데, 이 정도의 성능이 필요하지 않은 상황이었다. 따라서, 가장 익숙한 MySQL을 선택하였다.
Storage - S3
IA 기능 활성화해서 비용 절감 구조 만듬. private subnet 에서 vpc endpoint 연결해서 접근할 수 있게끔함
Push Integration - SNS, SQS, Kinesis
Push Integration은 데이터나 이벤트를 한 시스템에서 다른 시스템으로 전송하는 과정인데, 이를 위해 2개 제품에 각각 SNS, Kinesis를 적용했다. Kafka에 익숙해서 Kinesis를 선택해봤는데, 아무래도 신규 프로젝트에는 오버 스펙이었던것 같다.
ECR로 Mirroring
ECR은 Docker 컨테이너 이미지를 저장하고 관리하는 서비스이다. 파이프라인이 만든 Docker 컨테이너 이미지를 ECR에 복사하거나 동기화하여, 이미지를 안전하게 저장하고 배포할 수 있도록 설정하였다.
CloudWatch + OpenSearch
Cloudwatch를 주로 사용하되, 일부 로그는 OpenSearch로 확인하였다. CloudWatch로 수집된 로그 중 일부 로그가 Elasticsearch를 사용하는 OpenSearch로 전송되는데, 그 이유는 Elasticsearch의 강력한 검색 기능을 로그 분석에 활용하고자 하는 것이다.예를 들어, 특정 유형의 요청 또는 특정 이벤트에 대한 로그를 OpenSearch에서 검색하여 이상 현상을 분석하고 식별할 수 있다.
Terraform을 사용해서 코드로 관리하자.
Terraform은 인프런 강의로 공부하고 적용하셨다고 한다. Terraform은 InfraStructure를 코드로 관리할 수 있는 자동화 도구이다. 코드로 인프라를 관리하면 변경 사항을 추적하거나 버전 관리에 용이하다는 이점이 있다. 또한, 인프라 구축 및 변경을 자동화할 수 있어서 안정적인 인프라를 유지하는 데 도움이 된다. Terraform을 도입할때 기본 설정값을 그대로 쓰기보다는, 실제 운영 환경에 필요한 설정값을 잘 파악한 후 적용해야 한다는 것을 기억하자.
AWS 인프라를 구축하면서 깨달은 점들을 공유해주셨다.