우동우동우's note

AWS SAM(Serverless Application Model) 사용 후기 본문

Infrastructure

AWS SAM(Serverless Application Model) 사용 후기

우동우동우 2020. 11. 19. 23:55

회사에서 전임자가 개발한 URL Shortener 가 갑자기 아무 이유 없이 제 기능을 하지 못했다.
구성은 EC2 서버에 go로 개발된 api 서버와 그 데이터를 저장하는 MongoDB 서버가 전부였다.

MongoDB는 이상 없었다. 그럼 서버가 문제일듯하여 찾아보니 go로 개발된 서버가 문제였다.
자세히 보니 mgo라이브러리로 mongodb로 insert가 안되고 있었다. 이상한 일이었다. find는 잘되고 있었으니..
이유를 도저히 알 수 없었다.

잠시 생각을 했다.

이걸 어떻게 고친담...
이유를 알 수 없는 버그를 찾게 위해서 얼마나 시간을 더 써야할지 고민 되었다.
그리고 다음에도 이 서버가 문제를 일으키면 어쩌지.. 고민 되었다.
그러다가 불현듯 몇일 전에 들었던 서버리스 lambda가 떠올랐다.

몇몇 자료를 찾아보니 lamdba에대한 칭찬 뿐인 블로그 글들을 보고 난 요걸 잘 쓰면 괜찮겠다고 생각되었다.
이때는 난 몰랐었다 험난한 길이 날 기다리고 있을 거라고는 ..

람다를 써서 서버를 url shortener를 구성하기로 마음 먹고 자료를 더 찾아보았다.
찾아 보니 sam을 사용하면 lambda와 api gateway 까지 연결을 간단한 설정 파일 하나로 다 할 수 있단다.
요기에 혹해 난 sam을 써보기로 마음을 먹었다.

기존 소스도 어느 정도 살리고 약간의 인터페이스 조정으로 다 1차로 개발을 다 마쳤다.
구성은 route53 -> api gateway -> lambda -> mongodb 였다.
완벽하다고 생각 했었다.

그런데 또르르...

EC2 인스턴스에 mongodb가 올라 가있던 형태인 우리의 mongodb는 security group에 inbound rule이 아주 철저하게 ip주소가 적혀있는 놈들로 부터만 연결될 수 있었던 것이다. (시큐리티 그룹으로도 가능하기는 하다)
그래서 람다에 ip를 부여하는 방법을 찾아보니 lambda를 사용할 vcp를 만들고 해당 vcp에 nat gateway를 설정하고 eip를 할당하란다.
url shortener를 위해 이걸 다 하자니 vcp를 구성하는게 아까웠다.
그리고 추가로 vcp를 구성할 수 없었다.. 이미다 찼었다.

결국 dynamodb를 사용하기로 했다...
route53 -> api gateway -> lambda -> dynamodb

건너지 말아야 할 강을 건넜다.
첫째로 소스를 다 뜯어 고쳤다.
코드양이 많지 않아 사실 크게 문제는 없었다.

둘째로 db마이그레이션 을 했다.
mongodb데이터를 dynamodb로 마이그레이션 하는 방법을 찾았으나 별 신통한 방법이 없었다.
그래서 결국 배치를 만들어서 돌렸다.

요정도면 끝날 줄 알았다......

이때 당시 dynamodb에 대한 이해도가 높지 않았었다. 이것이 문제였다.
dynamodb에는 2개의 키가 존재하는 데 hash key와 range key다.
처은에 hash키가 rdb의 primary key와 동일하다고 생각 했었다. 그리고 range key가 sorting을 위한 키라고 생각했었다. 그런데 짜다 보니... 날짜순으로 sorting이 안된다.
문서를 잘 보니 hash키는 우리가 rdb의 pk와는 다른 개념이었다...
hash key는 공통의 데이터를 저장하는 저장소의 이름과 유사하단다..
단순히 말로는 어렵다.. (사실 아직 완벽히 이해 못했다 ㅠㅠ)
다음에 다이나모디비에 대해 더 공부해서 포스팅을 해봐야겠다...

그래서 날짜 순으로 sorting하기 위해서 Secondary Global Index를 만들어서 해결했다. 이걸 만들기 위해서 배치를 또 만들어서 돌렸다 ㅠㅠ

두번의 배치 작업과 소스를 뒤엎은 결과 이제 다 되었다. 라고 생각했었다..

그런데.. AWS API Gateway는 HTTPS만 지원한다고 한다. 이렇게 되면 기존 http로 주소가 나간 shorten url은 작동이 안될 것이었다..
처음에 api gateway에서 http를 받을 수 있게 하는 방법을 백방으로 찾았으나 결국 실패...
찾다보니 cloudfront가 http to https redirect를 지원한다고 해서 다시 구조 변경한다.

route53 -> cloudfront -> api gateway -> lambda -> dynamodb

이제는 잘되었다.

이렇게 다 설정하고 나니.. 2주가 흘렀다..
이거말고 다른일도 하긴했지만 url shortener 만들자고 2주를 쓴건 너무 했다.

그래도 다 구축하고 소스와 프로젝트 설정 파일을 보니
생각 보다 직관적으로 표현 되어있었고 괜찮았다.
그리고 URL Shortener가 죽을 염려는 이제 하지 않는다.
서버리스 이니 aws를 믿고 보는 거다.

그리고 확실히 sam cli가 좋긴했다. ㅋ
배포도 2개의 명령어면 된다.
(요 설정 하기는 쉽지는 않았다.)
또 github action으로 ci/cd도 간단하게 짤 수 있었다.

각각의 내용들은 나중에 따로 올려 보겠다.

주저리 주저리 일기 같은 글이다.

Comments