mingming

ECS 컨테이너 서비스 인프라 구축 및 Codepipeline 배포 자동화 본문

AWS Service

ECS 컨테이너 서비스 인프라 구축 및 Codepipeline 배포 자동화

mingming_96 2023. 8. 21. 02:10

Architecture

아키텍쳐 소개

ECS를 이용한 컨테이너 기반의 웹 애플리케이션 인프라 구축 아키텍쳐입니다. 모든 내부 통신은 VPCE를 통한 private link를 이용해 이루어지며,  Bastion Host를 통해 DB 유지보수 및 내부 관리가 가능합니다. 

 

요구사항

1. 유연한 확장 가능한 인프라 구축

2. 각 계층별 적절한 보안 대책

3. CI/CD 파이프라인 구축을 통한 배포 자동화 

 

BaseInfra

1. Terraform을 통한 인프라 구축 

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

 s3 버켓 Backend 설정을 통해 상태저장파일을 안전하게 저장할 수 있습니다.  

 

2. 트래픽 흐름 

클라이언트가 웹 애플리케이션에 접속하게 되면 외부에 공개되어 있는 Frontend ALB에 트래픽이 전달되고, Frontend-app 에 트래픽이 라우팅됩니다. 내부설정에 의해 BackendHost로 등록되어 있는 Backend ALB로 트래픽이 전달되고, Backend-app으로 라우팅 되어 웹 애플리케이션이 클라이언트에게 제공됩니다.    

 

3. 보안그룹

이중보안그룹을 이용해 트래픽을 제한 했습니다. 총 6개의 보안그룹을 생성하고 인바운트 규칙 source를 보안그룹으로 설정하여 불필요한 트래픽을 차단했습니다. 

 

4. VPCE

VPC Endpoint를 통해 AWS 내부 리소스 접근시 Private Link로 안전하게 통신가능하도록 구현했습니다.

 

5. WAF Rule

Frontend에 연결된 ALB에 WAF Rule을 부착하여 보안을 강화합니다. 총 다섯개의 AWS Managed Rule을 사용했습니다.

분류  대상 관리형 규칙  설명
AWS managed rule groups Amazon IP reputation list 봇이나 위험한 IP 차단하여 악성 액터가 취약한 애플리케이션을 발견하는 위험을 줄일 수 있습니다.
AWS managed rule groups Anonymous IP list 애플리케이션에서 자신의 ID를 숨기려고 하는 최종 사용자를 필터링 하는 경우 유용합니다. 
AWS managed rule groups Core rule set OWSAP 에서 정의한 웹 취약점을 확인하고 차단하는데 유용합니다.
AWS managed rule groups Known bad inputs 악의적인 공격자가 취약한 애플리케이션을 발견할 위험을 줄일 수 있습니다. 
AWS managed rule groups SQL database SQL injection을 막을 수 있습니다. 

 

APPLICATION

1. Frontend

Frontend는 Blitz.js를 이용한 Reack 웹 애플리케이션입니다. Blitz.js 는 Ruby on Rails를 목표로 개발된 풀 스택 React 프레임 워크 입니다. 내부 구성요소는 기본적으로 Next.js가 이용됩니다. 

 

2. Backend

백엔드는 echo 프레임워크를 이용한 Go 언어 API 서버 입니다. 

 

ECS CI/CD

1. ECS

태스크정의 생성, 생성된 태스크정의 기반으로 서비스를 생성합니다. 컨테이너 정의가 업데이트 되면 ControlPlane에서 해당 수정사항을 인지 후 컨테이너 배포를 지시합니다. 이때 ECR의 이미지를 가져와 컨테이너를 실행합니다. 

 

2. AutoScaling

대상 추적정책을 생성해 CPU 평균 사용률 60% 이상이면 알람이 전송되고 정책에 맞게 스케일 아웃 되도록 설정했습니다.

부하테스트

Apache HTTP server benchmarking tool(ab)를 이용해 부하테스트를 진행합니다. 

ab -n 1000000 -c 20 <backenddns>

100만건의 요청을 20개씩 백엔드로 전달하는 명령어 입니다.

 

 

3. BlueGreen deploy

Frontend는 ECS Task , Backend는 ECS Service로 구현했습니다. Frontend는 단일 태스크로 구성되어 있고, Backend는 Service로 구성되어 있습니다. CodeDeploy를 통해 블루그린 배포하도록 구성했습니다. CodePipeline에 의해서 변경 사항을 감지 되면 빌드가 시작되고 빌드된 결과물을 CodeDeploy를 통해 배포하게 됩니다. 

 

4. CI/CD

현재 프로젝트에선 Backend만 CodePipeline을 이용한 CI/CD 파이프라인을 구축했습니다.

CodeSeries 에서 CodeBuild CodeDeploy는 각각 buildspec.yaml , appspec.yaml 파일에 의해서 실행됩니다.

해당 파일은 빌드와 배포 프로세스를 정의하는 파일입니다. 두 파일 모두 소스코드 레포지토리에 포함되어 있어야 합니다.

 

CodePipeline 작동 순서 

 

1. 코드 커밋에 push가 되면 CloudWatch Events에 이벤트가 발행됩니다.

2. CloudWatch Events에 의해서 변경사항을 감지하고 CodePipeline이 시작됩니다. 

3. 소스 스테이지 : CodeCommit 으로부터 소스 코드를 가져옵니다 

4. 빌드 스테이지 : 소스 코드를 컴파일 하거나 빌드해 애플리케이션 또는 아티팩트를 생성합니다.

5. 배포 스테이지: 빌드된 애플리케이션을 ECS에 배포합니다.애플리케이션은 Blue/Green 방식으로 배포됩니다.

 

Firelens

1. Firelens 

ECS 및 Fargate를 통해 실행되는 컨테이너 로그를 수집하고 전송 가공하는 기능을 제공하는 서비스입니다.

ECS 와 함께 사용할 수 있는 기본 로그 드라이버로 지원됩니다. 

 

2. Fluent bit

로그데이터를 수집하고, 가공한 다음 원하는 대상으로 전송하는 역할을 수행합니다. 

여러 로그 저장소 또는 분석 도구로 로그 데이터를 전송할 수 있습니다.  

 

현재 프로젝트에서 Firelens를 통해 백엔드 컨테이너의 로그 라우팅을구성하고  Fluent bit를 통해 해당 로그정보를 S3 버켓에 저장하도록 구성했습니다. 

 

Bastion

1. System Manager

ECS/Fargate Bastion 컨테이너를 구축해 인프라 내부를 및 DB 유지보수 할 수 있도록 했습니다.  Amazon Linux2 를 베이스 이미지로하는 컨테이너 이미지를 생성 후 컨테이너를 실행해줍니다.

Session Manager을 통해 해당 컨테이너로 접속하며 IAM 사용자의 인증정보가 사용됩니다. System Manager를 통해 프라이빗 서브넷에 위치한 Bastion Container에 접속가능하게 됩니다. 

 

Terraform repository

 

GitHub - Minki-An/Terraform_ECS

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

github.com