최근 내가 속한 팀에서 서버를 이전해야겠다고 마음을 먹었다. 현재 우리는 cafe24호스팅 서버에서 웹 호스팅을 하고 있다. 간략하게 설명을 해주자면, 한 서버에 여러명이 입주해있는 형식이라고 보면 된다. 그러다 보니 권한도 제한적이고 특히 다른 서버의 문제가 생기면 우리 서버에 영향을 끼친다는 점이다.
과거 이때문에 cafe24에 문의를 해봤는데, 답은 다음과 같이 왔다.
aws 클라우드 환경으로 이전하려는 이유는 크게 두가지 이유였는데,
정적 콘텐츠 호스팅(CDN) , S3의 편리함 서버 모니터링 환경 구성 을 하기 위해서 옮기기로 결정을 했다.
그래서 내부 개발자들 끼리 퇴근후 시간을 내서 AWS에 관련한 지식을 습득을 하고 간단하게 서버 구축을 해보면서 시간을 보내다가, 우리가 맞는 방향으로 가는지가 궁금해져서 이곳저곳을 알아보게 되었다.
특히 AWS 온라인세미나에 참석을 해서 많은 지식을 습득했었는데, 마지막 설문조사에 도입을 하고 싶으나 전문적인 지식이 부족하다고 기술을 했었다. 그러자 AWS 매니저분께서 우리회사로 전화를 했었고, 구체적인 도움을 받을수 있게 되었다.
준비물
구체적인 아키텍쳐와 AWS서비스 사용방법에 대해서 궁금한점이 생겼을 경우 요청을 해서 도움을 받으면 된다고 한다. 그래서 사전에 설문지를 작성하고, 우리 내부의 아키텍쳐 구상도를 그려서 제출을 하게 되면, AWS관련 개발자가 온라인, 오프라인으로 상담을 해준다 (현재는 코로나때문에 온라인만 하는것 같다.)
AWS에서 상담을 할때 크게 두가지를 본다.
아키텍쳐
안정성, 운영효율성,성능,비용최적화,보안
아키텍쳐
우리는 현재 코드이그나이터(php) 코드로 짜여진 서버로 구성되어 있다. 코드이그나이터같은 경우에는 경량화 프레임워크로서 누구나 쉽게 php용 백엔드 코드를 짤수 있다는 장점이 있다. 하지만 서비스가 점점 늘어남에 따라 이 점이 문제점으로 다가오기 시작했다. 특히 국내 개발자 풀이 적은 프레임워크라서 사람 구인하기도 힘들다고 생각이 든다. 그래서 스프링기반으로 서버를 리팩토링 하기로 구상을 하고있고, 아키텍쳐도 스프링위주의 서버를 구상하기로 했다.
아키텍쳐
현재 진행중인 아키텍쳐
기술진단
안정성
백업 및 복구
인스턴스 스냅샷, DB snapshot 활용 여부
가용성 / 이중화
Auto scailing 활용 , RDS multi-AZ
관리형 서비스 활용
관리 point 절감을 위해 RDS, SQS, DynamoDB등 활용 여부
운영 효율성
구성 관리 및 자동화
인프라 구성 및 배포는 어떻게 진행하는지?
CloudFormation, OpsWorks 이용 여부
모니터링
현재 모니터링은 어떤식으로 진행하고 있는지?
CloudWatch 이용, 3rd party 서비스 이용등
성능
DB 활용
RDS - Aurora , MySQL , EC2에 DB설치 여부
Cache 사용
ElasticCache (Memcached, redis) 구성 여부
CDN 사용
CloudFront, 국내 CDN사용 여부
비용 최적화
RI, Spot 활용
RI 및 Spot instance 활용 요령
인스턴스 타입 선택
EC2등 다양한 인스턴스 타입 선택 요령
스토리지 비용 최적화
S3 Lifecycle 구성 , S3-IA, Glacier 사용 여부
보안
계정 접근 관리
IAM, MFA 사용여부
IAM 보안 강화 방법
VPC 활용
VPC구성 여부
로그 관리
로그 관리 저장 분석상황 여부
Q. 백업을 위해 AWS backup을 이용하는게 좋을지? EBS 및 DB 스냅샷을 이용한 백업 방식이 좋은지?
A. AWS Backup은 중앙에서 관리합니다. AWS에서 백업을 해도되고 RDS 스냅샷을 활용하는것도 좋습니다. Backup기능이 더 많기 때문에 사용하는것을 추천하나 손에 맞는것을 사용하는것이 좋습니다.
Q. ELB를 이용하여 오토스케일링에서 가용영역 마다 오토스케일링 그룹이 설정되어
A. ELB 오토스케일링은 둘다 신경써야 합니다. 서브넷을 선택할때 모든 서브넷이 가용영역에 걸쳐서 형성됩니다. 오토스케일링을 시작템플릿으로 만들때 서브넷과 보안 그룹을 선택하는데 두개이상의 가용영역에 설치를 하고 퍼블릭으로 열지말고 private를 사용합니다. 외부로 통하는 ELB는 퍼블릭으로 선택하면 됩니다.
Q. RDS를 이중화할때 어떻게 사용해야하나요?
A. RDS 이중화는 Primary/Secondary로 구성하는게 좋습니다. Read Replica는 동기화 백업 방식이 아닙니다. 분산 목적, 이중화가 목적이 아닙니다. Aurora사용하시면 기본적으로 Read Replica가 Secondary의 역할을 할 수 있도록 되어 있으나, Sync의 차이가 있습니다.
Q. Jenkins를 이용한 pipeline을 통해 Build후 S3에 저장후 AWS CodeDeploy를 호출하여 Ec2에서 무중단 배포 예정입니다. 맞는 방향인가요?
A. AWS 내부의 배포방식을 사용하지 않고 다른 서비스를 연동해서 사용해도 괜찮다. 하지만 나중에 AWS를 사용하다가 문제가 생길경우 도움을 받기 곤란할수도 있다. 젠킨스를 사용하게 되면 젠킨스에 관련한 문서를 많이 읽어보길 바랍니다.
Q. Cloud Watch와 Cloud Trail을 이용할 예정입니다. 가이드라인이 있을까요?
클라우드 와치서비스를 사용하면 나중에는 능숙하게 사용하게 될겁니다. 특히 모든 서비스가 와치를 사용해야 합니다. 서비스마다 어떻게 구성해야하는지는 다르기 때문에 일반적인 가이드를 주기는 힘듭니다.
Q. RDS를 이용한 MariaDB를 이용하려고 합니다. vpc를 public subnet과 private subnet으로 나누고 NAT Gateway를 이용해서 public sunber과 private subnet을 구성할려고 합니다. 그리고 RDS를 private subnet 가용영역을 설정 할려고 합니다. 이때 외부에서 DB에 접근 하고 싶으면 퍼블릭 엑세스를 허용을 해야하는지 아니면 퍼블릭 엑세스를 차단해도 되는지 궁금합니다.
A. alb같은 외부에 노출되어야 하는것들은 퍼블릭으로 열되,나머지들은 다 private로 닫는것이 좋다. 하지만 예외적으로 DB같은경우 접근해야 할 일이 있을수 있기 때문에 베스천호스트를 사용하는것이 좋다.
NAT가 필요한 이유는 EC2같은 서비스에서 아웃바운드를 사용하기 위한것이다(서비스 업데이트나 패치) 보안그룹같은 서비스를 제한두지 않으면 서브넷끼리의 연결은 가능합니다.