mingming

MSA 리팩토링과 클라우드 마이그레이션 본문

AWS Service

MSA 리팩토링과 클라우드 마이그레이션

mingming_96 2023. 8. 21. 01:52

MSA  Architecture

시나리오

기존 온프레미스 환경에서 운영중인 어플리케이션을 사업 확장을 위한 클라우드 환경으로 마이그레이션 및 멀티리전 인프라 구축과 어플리케이션 리팩토링 

 

클라이언트 요구사항 

1. Continuos : 지속 가능하고, 자동화 가능해야 함

 코드형 인프라(Iac) 및 CI/CD 파이프라인을 통한 지속가능한 인프라 구현 

 

2. Huge Traffic : 대규모 트래픽을 감당할 수 있어야 함 

  AWS 완전관리형 서비스를 통해 트래픽 급증에 대응할 수 있도록 설계

 

3. Monitoring & Logging : 모니터링과 로깅을 통한 실시간 트러블 슈팅

  CloudWatch와 Prometheus & Grafana를 통한 실시간 모니터링 및 트러블 슈팅 

 

4. Security : 보안성 높은 인프라 

  WAF를 이용한 SQL Injection , 웹 취약점에 대비 

 

BaseInfra

1. Terraform을 통한 인프라 구축 

  Terraform은 코드형 인프라 도구로서 서버 운영 및 관리를 자동화할 수 있고, 배포 속도가 빠르며, 리소스 관리에 용이하고, 다양한 Provider를 제공해 호환성이 좋습니다.

 

2. Openswan을 통한 VPN 설정

  OpenswanVPN을 구축하기 위한 오픈 소스 솔루션입니다. IPsec을 구현하는데 사용됩니다.

 

3. Transit Gateway를 통한 s2s vpn 연결 및 리전간 피어링 

TGW를 통한 리전간 피어링, TGW와 CGW site to site vpn 연결 

 

4. Route53, ACM, Global Accelerator

서울과 싱가폴리전 ALB 에 ACM 인증서를 연동해줍니다. ACM 인증서를 통해 HTTPS 통신이 가능하게 됩니다.

Global Accelerator의 엔드포인트로 각 리전의 ALB를 등록해줍니다. 이때 생성된 GlobalAccelerator의 애니캐스트 주소를 Route53에 A레코드로 등록하면 단일 도메인으로 접속하는 리전에 따라 가까운 리전의 엔드포인트로 트래픽이 향하게 됩니다.

 

5. GlobalAccelerator Flow Logs 

GA 의 Flow Log 기능을 이용해 송수신 되는 IP 주소 트래픽에 대한 정보를 수집할 수 있습니다. 

수집된 로그 정보는 s3버켓에 저장되고 해당 로그를 클라우드 워치를 통해 쿼리할 수 있습니다. 

 

6. WAF 규칙 

 

각 리전의 ALB에 WAF 규칙을 부착해 보안을 강화합니다 .

규칙은 AWS Managed Rule을 사용했고,  AccessKRSGonly, Anonymous IP List , Core rule set , SQL database 네가지 규칙을 사용했습니다.

AccessKRSGonly : 서울, 싱가폴 리전의 트래픽만 허용

Anonymous IP List : 사용자의 VPN, Proxy 접근 확인 및 차단 

Core rule set : OWASP 에서 정의한 웹 취약점 확인 및 차단 

SQL database: SQL Injection 차단  

 

DATABASE

1. Aurora for Mysql

  AWS 완전관리형 데이터베이스인 Aurora for Mysql을 사용했습니다 . 서울리전의 클러스터 생성 후 리전 복제로 싱가폴리전에 복제본 클러스터를 생성했습니다. 

 

2. RDS Proxy 

  데이터베이스 앞단에 RDS Proxy를 두어 안정성을 강화할 수 있습니다. Connection Pool을 생성해 연결을 제한할 수 있습니다. 데이터베이스에 대한 자격증명 정보를 Secrets Manager에 저장하고 어플리케이션에서 쿼리가 들어오면 데이터베이스로 쿼리를 전달하게 됩니다. 실제 프로젝트에서 사용하진 않았지만 IAM 인증을 요구하여 보안을 강화할 수 있습니다.

 읽기전용 엔드포인트를 추가로 생성해 읽기작업과 쓰기작업을 분리했습니다. 

 

3. Database Migration Service(DMS)

DMS는 다양한 데이터베이스 엔진과 호환되며 무중단 마이그레이션을 지원합니다 .

Source, Target Endpoint는 각각 데이터베이스에 접근하기 위한 연결정보를 지니고있으며, 엔드포인트 테스트가 끝난 후 

복제인스턴스의 Replication Task에 의해서 복제작업이 이루어집니다. 

 

EKS , CI/CD

1. Architecture

모놀로식으로 동작하던 어플리케이션을 Frontend, Order, user, Store 네개의 어플리케이션으로 나누어 EKS 클러스터에 Pod 형태로 배포합니다. 

Github Action과 Argo CD를 이용해 CI/CD 파이프라인을 구축했습니다. 

 

2. Application 

  로컬 환경에서 Docker를 이용해 모놀로식 애플리케이션을 네개의 애플리케이션으로 리팩토링 했습니다. 

Traefik라우팅로드밸런싱 역할을 해줍니다. Traefik은 마이크로 서비스 배포를 위한 도구로 리버스 프록시 및 로드밸런서의 역할을 합니다 .

 

Application Terraform Repository

 

GitHub - Minki-An/Interface_Application

Contribute to Minki-An/Interface_Application development by creating an account on GitHub.

github.com

 

3. CI/CD 

Github ActionArgoCD를 이용해 파이프라인을 구축했습니다. 

github repo에 변경사항이 push 되면, github Action을 통해 새로운 이미지가 빌드되고, Kustomize를 통해 새로 빌드된 이미지의 태그가 K8s_Repo에 Kustomaization.yaml에 기록됩니다. K8s_Repo의 변경사항을 감지한 ArgoCD 에서 동기화 작업이 이루어지고, 새로운 이미지를 ECR 에서 가져와 어플리케이션을 최신화 합니다. 

 

Github Action

Github Action이란 Github에서 제공해주는 플랫폼으로 Github Repository 내의 작업 흐름을 정의하고 설정해 코드 빌드 테스트 배포 등의 작업을 자동화 할 수 있게 도와줍니다. 

워크플로우 정의, 이벤트 트리거, 빌드 및 테스트, 배포, 환경변수 시크릿 관리, 병렬실행 등의 기능이 있습니다.

네 개의 어플리케이션 중 변경사항이 일어난 어플리케이션 에서만 새로 빌드되어 ECR로 Push 되도록 설정했습니다.

 

ArgoCD

ArgoCD는 k8s cluster 내에서 애플리케이션 배포 및 관리를 자동화하기 위한 도구입니다. 

GitOps 방식을 기반으로, Git Repository에 정의된 애플리케이션 설정을 기반으로 클러스터에 애플리케이션을 배포해고 동기화하는 기능을 제공합니다. 

 

Kustomize

Kubernetes 리소스의 매니페스트 파일을 선언적으로 구성하고 커스터마이즈 할 수 있는 도구입니다. 

 

CI/CD Repository

 

GitHub - Minki-An/Interface_CICD

Contribute to Minki-An/Interface_CICD development by creating an account on GitHub.

github.com

 

4. K8s Monitoring 

EKS Cluster 모니터링 툴로 Prometheus & Grafana를 이용했습니다. 

 

Prometheus

오픈소스 모니터링 시스템으로 CNCF(Cloud Native Computing Foundation) 프로젝트로 유지 관리됩니다.

메트릭 수집된 정보는 PV에 저장됩니다. 현재 프로젝트에선 EFS Persistent Volume을 이용했습니다.

 

Grafana

데이터 시각화 모니터링 도구로 오픈 소스 기반의 대시보드와 그래프를 생성하여 관리할 수 있는 도구입니다. 

Prometheus를 통해 수집한 메트릭 지표값을 Grafana를 통해 대시보드로 시각화 하여 볼 수 있습니다.

 

EKS_Cluster Terraform Repository

 

GitHub - Minki-An/eks-cluster

Contribute to Minki-An/eks-cluster development by creating an account on GitHub.

github.com

Monitoring

1. OpenSearch

OpenSearch를 통해 Route53 도메인으로 들어온 쿼리정보를 로그로 확인하고 시각화 해 모니터링 할 수 있습니다. 

클라우드 워치의 로그그룹에 기록된 로그들은 gz 형태로 압축되어 저장되고, Lambda를 통해 압축해제하여 OpenSearch로 보냅니다. 전달받은 로그정보는 인덱스로 등록됩니다.

인덱스 패턴을 만들어 로그를 쿼리할 수 있습니다. 로그에서 Zone_Id, region, domain 등의 정보를 확인할 수 있습니다.

 

2. Container Insights

 

컨테이너식 애플리케이션 및 마이크로 서비스의 지표 및 로그를 수집 집계하여 요약해 대시보드로 시각화해 보여줍니다.

EKS쿠버네티스에서 CloudWatch agent를 이용하여 실행 중인 모든 컨테이너를 검색합니다.

CloudWatch agent를 통해 클러스터의 메트릭 값을 수집하고, Fluent Bit를 통해 CloudWatch Logs에 로그를 내보냅니다.

 

 

3. SNS CloudWatch Lambda를 이용해 슬랙 연동

Aurora Cluster에 대한 CloudWatch Alert를 생성 후 SNS에 구독합니다. 해당 SNS를 Lambda의 트리거로 설정해

경보상태가 되면, Slack으로 메세지를 전송하도록 합니다.

Lambda Terraform Repository

 

GitHub - Minki-An/Lambda_for_slack

Contribute to Minki-An/Lambda_for_slack development by creating an account on GitHub.

github.com

 

Interface_teamproject Terraform repository

 

GitHub - Minki-An/interface_teamproject

Contribute to Minki-An/interface_teamproject development by creating an account on GitHub.

github.com