- AWS 네이티브 환경에서 OTT 서비스 배포하기2023년 08월 06일 18시 33분 56초에 업로드 된 글입니다.작성자: 재형이반응형
📢 팀프로젝트 : 본인 역할은 웹 개발, API Gateway 구현 및 연동, AWS Transcribe, AWS Translate, AWS Kinesis 연동이지만, 프로젝트에 대한 이해를 높이고, 본 포스팅 작성 시 편의성을 위해 역할 구분은 따로 하지 않고 전체적으로 정리하였습니다. 참고 부탁드리겠습니다.
웹 구현 부분은 이 프로젝트를 이용하여 구현하였습니다.
https://jaehyeong.tistory.com/2
0. 시나리오
- 국내 미디어들의 연이은 히트에 의해 미디어 플랫폼 서비스 수요가 꾸준히 증가하고 있다
- 넷플릭스와 같은 대규모 OTT 서비스와의 경쟁력을 갖추기 위해 국내 다른 OTT 서비스를 지원하고 있던 두 기업이 합병하여 글로벌한 OTT 서비스를 제공하려고 한다
- 국내외 사용자의 증가를 대비하여 트래픽의 확장성과 유연성, 두 플랫폼의 방대한 데이터 관리의 안정성을 위해 클라우드 서비스를 사용하길 원한다
- 더 나아가 다양한 기능들을 추가하기를 원한다
1. 요구사항
a. 온프레미스에서 AWS 클라우드로의 마이그레이션 :
- 기존 온프레미스 환경에서 운영하던 OTT 서비스 데이터를 AWS 클라우드로 마이그레이션
b. 고가용성 환경 구축 :
- 트래픽이 많이 몰리는 상황에서도 서비스 제공에 문제가 없어야 함
- 어떠한 상황에서도 failover할 수 있어야 함
c. 컨테이너를 활용하여 웹서버 구축 :
- 컨테이너와 API Gateway를 통해 MSA 아키텍처 구축
- 애플리케이션 경량화
d. 보안 :
- WAF, AWS Shield와 같은 서비스로 웹 보안 강화 및 DDOS 공격 방어
- 최근 유명 게임사 블리자드의 신작 디아블로4가 DDOS 공격으로 서버가 마비된 적이 있음
출처 - https://biz.chosun.com/it-science/ict/2023/06/26/KZMRD74OYZH2FGHAUPJS3HQA2I/
e. API Gateway를 통한 백엔드 서버리스 구축 :
- AWS API Gateway를 통해 백엔드 단을 서버리스하게 구축하여 복잡한 로직을 관리할 필요가 없도록 하고, 완성도 있는 서비스 제공
f. CI/CD 환경 구축 :
- CI/CD 환경을 구축하여 빌드부터 테스트 및 배포까지 자동화
📢 Failover : 장애 극복 기능(failover)은 컴퓨터 서버, 시스템, 네트워크 등에서 이상이 생겼을 때 예비 시스템으로 자동전환되는 기능입니다.
2. 아키텍처 구성도
3. EKS 클러스터 및 테라폼 인프라 배포
3 - 1. 테라폼
📢 테라폼을 통해 인프라를 코드화하게 되면 얻을 수 있는 이점
- 속도와 안정성(speed and safety)
: 자동화하면 사람이 진행하는 것보다 훨씬 빠르게 배포를 할 수 있으며, 자동화 된 프로세스는 일관되고 오류를 적게 발생 합니다 - 문서화(documentation)
: 문서화가 되어 누구나 읽을 수 있는 코드로 인프라 상태를 알 수 있으며, 담당자가 자리에 없더라도 조직의 모든 사람이 구조를 이해하고 대체할 수 있습니다 - 버전 관리(version control)
: 코드형 인프라는 소스를 통해 버전 관리가 가능하며, 히스토리가 남아있어 시스템에 문제가 생겼을 경우 이전 버전으로 빠르게 롤백이 가능합니다 - 유효성 검증(validation)
: 코드가 변경될 때마다 검증을 수행하고 일련의 자동화된 테스트를 실행할 수 있으며, 정적 분석 프로그램에 코드를 전달하여 오류 발생 위험을 줄일 수 있습니다 - 재사용성(reuse)
: 인프라를 재사용 가능한 모듈로 패키징할 수 있으므로 모든 제품을 매번 처음부터 배포하는 대신 문서화되고 검증된 모듈로 일관되게 배포할 수 있습니다
3 - 2. EKS
- 아마존 엘라스틱 쿠버네티스 서비스(Amazon Elastic Kubernetes Service) 로 완전관리형 쿠버네티스(Kubernetes) 서비스이다
- AWS EKS는 컨테이너 시작 및 중지, 가상 시스템에서 컨테이너 일정 수립, 클러스터 데이터 저장 및 기타 작업을 담당 하는 쿠바네티스 Control plane 노드의 가용성과 확장성을 자동으로 관리해준다. 그리고 각 클러스터의 비정상 Control plane 노드를 자동으로 탐지하여 교체해준다
- 멀티 클러스터 환경으로 prod 클러스터와 dev 클러스터로 이루어져 있도록 구성하였다
3 - 3. EKS vs Terraform
- EKS Cluster 인프라까지만 테라폼으로 배포를 하고 파드 생성 및 컨트롤러 생성 등은 eksctl를 통해 진행하였다
- 이렇게 한 이유는 테라폼을 사용하여 eks 구성요소들을 배포하는 것보다 eksctl를 사용하는 것이 더 디테일하게 설정할 수 있고 간편하다고 생각했기 때문에 이렇게 진행을 했다
- 물론 완전 코드화를 하지 못하게 된다는 단점이 있지만 이점이 더 크다고 생각했다
- 스택오버플로우와 레딧을 통해 검색을 해본 결과 현재 직장에서 테라폼만으로 eks를 운영하고 있는데 별다른 문제 없이 원하는 방향으로 운영을 잘 하고 있다는 글도 몇가지 찾아볼 수 있었다
- 이번에는 EKS와 Terraform을 적절히 섞어서 인프라를 배포하였지만, 다음번에는 Terraform 만으로 배포를 진행하여 진정한 완전 코드화를 해보고 싶다
4. EKS 구성요소
4 - 1. 관리형 노드 그룹
📢 관리형 노드 그룹을 사용함으로써 얻을 수 있는 이점
- 사용자가 지정한 크기의 EC2 인스턴스 그룹을 자동으로 생성하고 관리
- Kubernetes와 노드 AMI 자동 업데이트
- Autoscaling 통합하여 클러스터 자동 확장 및 축소
- 간편한 설정 및 관리
4 - 2. HPA 와 Cluster Autoscaler
📢 HPA(Horizontal Pod Autoscaler)와 Cluster Autoscaler를 사용함으로써 얻을 수 있는 이점
- HPA는 Pods의 수를 해당 리소스의 CPU 사용률에 따라 자동으로 조정
- Kubernetes Cluster Autoscaler는 파드가 실패하거나 다른 노드로 다시 예약될 때 클러스터의 노드 수를 자동으로 조정합니다. Cluster Autoscaler는 AWS 오토 스케일링 기능을 사용합니다
4 - 3. 관리형 노드그룹 vs AWS Fargate
관리형 노드그룹 AWS Fargate 1. 노드들의 전반적인 관리를 클러스터 관리자가 직접 수행
2. 미리 예측하여 노드 인스턴스의 크기 선택의 어려움
3. HPA와 Cluster Autoscaler 부하 증가에 따른 스케일링 딜레이1.서버리스 컴퓨팅 환경
2. 자원 자동 스케일링
3. 빠른 배포와 자원 할당- 이번 프로젝트에서는 AWS Fargate 대신 관리형 노드그룹을 사용하였다. 왜냐하면 AWS Fargate는 AWS 완전관리형 서비스로서 관리형 노드 그룹보다 더 많은 기능들을 자동으로 관리해주지만, 비용적인 측면에서 바라보았을 때 관리형 노드그룹이 유리했기 때문에 관리형 노드그룹을 선택하게 되었다
5. AWS DMS / AWS Route53 / AWS Amplify 및 AWS Cognito 인증
5 - 1. DMS(Database Migration Service)
- AWS DMS 서비스를 이용하여 기존의 온프레미스에 있던 데이터들을 클라우드 환경으로 이전
5 - 2. 인증 서비스
- Route53을 이용하여 DNS 활용
https://jaehyeong.tistory.com/9
- AWS Amplify는 AWS 리소스들을 가용하여 손쉽게 프론트-백엔드, 호스팅, 배포까지 풀스택으로 애플리케이션을 개발하도록 돕는 서비스의 집합입니다
- AWS Amplify를 이용하여 로그인 페이지를 생성하고 AWS Cognito를 사용하여 회원가입 및 로그인 기능을 구현
5 - 3. 보안
- 모든 AWS 고객은 추가 비용 없이 AWS Shield Standard에 의한 자동 보호를 받을 수 있습니다. AWS Shield Standard는 네트워크 및 전송 계층 DDoS 공격으로부터 애플리케이션을 보호합니다. Amazon CloudFront 및 Amazon Route 53과 함께 AWS Shield Standard를 사용하면 알려진 모든 인프라(계층 3 및 4) 공격에 대해 포괄적인 가용성 보호를 받을 수 있습니다
- AWS 리소스에서 실행되는 애플리케이션을 대상으로 하는 공격에 대해 더 높은 수준의 보호를 구현하려면 AWS Shield Advanced를 구독하면 됩니다. AWS Shield Standard가 제공하는 네트워크 및 전송 계층 보호 이외에, Shield Advanced는 정교한 대규모 DDoS 공격에 대한 추가 보호 및 완화, 실시간에 가까운 공격에 대한 가시성, 웹 애플리케이션 방화벽 AWS WAF와의 통합을 제공합니다
(연간 구독을 해야 하고 월 $3,000 의 기본 비용이 발생 - 비쌈) - WAF(Web Application Firewall)는 Shield보다 상위 레벨에서의 서비스를 제공합니다. 사용자의 애플리케이션이나 API를 SQL 주입, XSS(악성 스크립트 삽입)과 같은 일반적인 위협으로부터 보호합니다. Shield와는 다르게 WAF는 사용하기 위해 별도로 켜주어야 합니다
보안 강화를 위해 Shield Standard를 무료로 사용하면서 WAF를 켜주면 넓은 영역의 계층을 커버할 수 있습니다
6. AWS API Gateway 및 AWS Transcribe, AWS Translate, AWS Kinesis
6 - 1. API Gateway
- API GATEWAY는 API를 손쉽게 생성, 유지 관리할 수 있도록 하는 AWS 완전 관리형 서비스입니다
- REST API와 WEBSOCKET API를 지원합니다
- API GATEWAY에는 최소 요금이나 시작 비용이 없고, 수신한 API 호출과 전송한 데이터 양에 대해서만 요금을 결제하면 됩니다. 그리고 LAMBDA와 연동을 하여 요청을 처리하고 응답할 수 있습니다
- 서버리스 워크로드 및 HTTP 벡엔드에 최적화된 아키텍쳐를 구성하기 위해서 API GATEWAY REST API를 사용하였습니다
- S3를 오리진으로 지정한 Cloudfront 배포를 사용했습니다
6 - 2. AWS Media Convert
- 동영상 파일을 S3로 업로드하면 S3트리거에 의해 SNS, SQS, LAMBDA가 실행되고 람다에서 BOTO3를 이용해서 MEDIA CONVERT 작업을 생성하는 순서로 동작하여 동영상 파일을 HLS 형식으로 인코딩하게 됩니다
- HLS 형식으로 인코딩된 동영상 파일을 사용하면 사용자의 네트워크 상황에 따라 최적화된 영상 화질을 제공해줄 수 있기 때문에 HLS 형식으로 인코딩을 진행했습니다
- MEDIA CONVERT를 사용하면 사용량에 따른 요금제로 비용이 효율적이고, 기존에 많은 전문적 지식을 요구하던 미디어 자체에 AWS 완전 관리형 서비스를 통한 완성도 있는 미디어 솔루션을 제공해줄 수 있습니다
6 - 3. AWS Transcribe, AWS Translate
- S3트리거에 의해 SNS 팬아웃 패턴 구조로 AWS TRANSCRIBE LAMBDA, AWS TRANSLATE LAMBDA가 시작되어 음원을 추출하고 번역을 진행하게 됩니다. 현재 영어와, 한국어 자막 서비스만 지원하고 있지만 고객 니즈에 따라 최대 75개의 언어를 지원할 수 있습니다
- Amazon Translate의 기계 번역을 활용하면 전문 번역사가 수동으로 번역하는 것보다 약 1,000배 저렴한 비용으로 콘텐츠를 번역할 수 있습니다
- 다른 문제들을 해결하느라 STEP FUNCTION을 사용하여 AWS TRANSCRIBE, AWS TRANSLATE를 구현하지 못했던 점이 아쉬웠습니다. STEP FUNCTION을 사용하면 성격별로 유사한 LAMBDA 함수들을 묶어 유지보수가 용이해지는 이점을 얻을 수 있기 때문에 다음번에는 STEP FUNCTION을 적극 이용해보고 싶습니다
- SNS Fanout Pattern을 사용하여 하나의 S3에 다수의 이벤트 트리거가 작동할 수 있도록 구현하였습니다. EventBridge를 사용하지 않고 SNS를 사용한 이유는 비디오 업로드와 같은 요청은 OTT 서비스 성격상 많은 요청이 발생할 것으로 예상이 되어 더 낮은 레턴시값을 갖고 있는 SNS를 선택하게 되었습니다
6 - 4. AWS Kinesis Data Streams
- 실시간
: Amazon Kinesis를 사용하면 실시간으로 스트리밍 데이터를 수집하여 처리할 수 있습니다 - 완전관리형
: Amazon Kinesis는 완전관리형으로 스트리밍 애플리케이션을 운영하므로 사용자는 인프라를 관리할 필요가 없습니 다 - 확장성
: Amazon Kinesis는 모든 규모의 스트리밍 데이터를 처리하고 매우 짧은 지연 시간으로 수많은 소스의 데이터를 처리할 수 있습니다
- 저는 동영상 재생 버튼을 누를 시 클릭스트림을 발생시켜 AWS Kinesis로 데이터를 전송해 동영상들의 배열을 변경하도록 하였습니다
7. CI/CD
7 - 1. Git Actions
- Github Actions은 Github 저장소를 기반으로 소프트웨어 개발 Workflow를 자동화 할 수 있는 도구입니다
(Github에서 직접 제공하는 CI/CD 도구) - 사용료는 public 저장소는 무료이며, private저장소는 해당 계정에 부여된 무료 사용량 이후에 과금이 부과됩니다.
Github 무료 계정의 전체 비공개 저장소를 기준으로 한달에 500MB 스토리지와 실행 시간 2,000분(minute)까지 제공된다
📢 Git Actions vs Jenkins
Jenkins Git Actions 서버 설치가 필요 클라우드 인프라가 제공되므로 별도의 서버 설치가 필요없음 작업이 동기화되어 제품을 시장에 배포하는데 더 많은 시간이 소요됨 비동기 CI/CD 계정 및 트리거를 기반으로 하면 github 이벤트를 준수하지 않는 빌드를 중심으로 함 모든 github 이벤트에 대한 작업을 제공하고 다양한 언어와 프레임워크를 지원 환경 호환성을 위해 도커 이미지에서 실행해야 함 모든 환경과 호환이 가능 캐싱 메커니즘을 지원하기 위해 플러그인을 사용할 수 있음 캐싱이 필요한 경우 자체 캐싱 메커니즘을 직접 작성해야 함 공유 기능이 없음 github 마켓 플레이스를 통해 공유 가능 전 세계 사람들이 많이 사용하기 때문에 참고 문서가 다양함 젠킨스에 비해 상대적으로 참고 문서가 적음 - 젠킨스는 다양한 IDE를 지원하고 많은 사람들이 사용하기 때문에 다양한 커스터마이징이 존재합니다. 하지만 호스팅 하나부터 끝까지 모두 직접 설정을 해주어야하기 때문에 규모가 작은 프로젝트를 진행하는 경우에는 적합하지 않다고 판단하여 Git Actions를 사용하게 되었습니다
7 - 2. Kustomize
- kustomize는 쿠버네티스 리소스(yaml파일)를 변경하지 않고 필드를 재정의하여 새로운 쿠버네티스 리소스를 생성하는 도구입니다
- 해당 프로젝트에서는 코드를 수정 후 커밋을 하면 Git Actions를 통해 AWS ECR에 새로운 컨테이너 이미지가 빌드되어 올라가고, 그 이미지를 Argo CD가 배포를 하기 위해 새로 생성된 이미지 태그를 재정의하여 쿠버네티스 리소스를 생성하는 역할을 하게 됩니다
📢 Helm vs Kustomize
- Helm은 템플릿 엔진으로, 변수를 가진 템플릿을 실행하여 구성을 생성합니다. Kustomize는 오버레이 엔진으로, 베이스와 오버레이를 사용하여 구성을 합칩니다
- Kustomize는 쿠버네티스 팀에서 직접 개발하며, kubectl에서 지원됩니다. 둘 다 CNCF(Cloud Native Computing Foundation) 프로젝트이지만 Helm은 제3자에 의해 운영됩니다
- Kustomize가 Helm 보다 쉽고 간단합니다
- Helm은 패키징 기능을 통해 재사용이 가능합니다
- 이 프로젝트에서는 새로 생성된 이미지 태그만 변경해주는 간단한 작업만 진행하면 되기 때문에 Kustomize를 선택하게 되었습니다
7 - 3. Argo CD
- GitOps는 Git 저장소를 사용하는 소프트웨어 배포 접근 방식이다. ArgoCD는 GitOps를 구현하기 위한 도구 중 하나로 Kubernetes 애플리케이션의 자동 배포를 위한 오픈소스 도구이다
- Git 저장소에서 변경 사항을 감지하여 자동으로 Kubernetes 클러스터에 애플리케이션을 배포할 수 있다
7 - 4. 동작 결과
- 코드를 수정하고 Git으로 커밋을 하면, 추가 동작 없이 자동으로 빌드, 테스트, 배포까지 자동으로 이루어진다👍
8. 시연영상
8 - 1. 회원가입 및 로그인
8 - 2. 검색, 삭제 및 업로드
8 - 3. 재생, 자막 및 화질 변경
- 화질을 Auto로 설정시 네트워크 환경에 맞춰서 자동으로 화질 변경
8 - 4. 인기동영상 순위로 정렬
9. 마무리
기존에 사용해보지 않았던 다양한 서비스들을 사용해보고 기존에 직접 만들었던 서비스들과 연동을 해보면서 작동 방식과 AWS에서 데이터들을 어떤 포맷으로 주고 받는지 어떠한 방식으로 주고 받는지에 대해 깊게 알아볼 수 있어서 매우 의미 있는 프로젝트였다. 그리고 6개월 동안 동고동락했던 팀원들과 같이 프로젝트를 진행하면서 추후에 포스팅하겠지만 우승이라는 결실을 맺을 수 있어서 너무 고맙고 기분이 날아갈 듯 하다ㅎㅎ
📢 사용한 AWS 서비스
1. Terraform
https://jaehyeong.tistory.com/31
2. EKS
https://jaehyeong.tistory.com/32
3. DMS
https://jaehyeong.tistory.com/33
4. Cognito
https://jaehyeong.tistory.com/34
5. WAF
https://jaehyeong.tistory.com/35
6. API Gateway
https://jaehyeong.tistory.com/36
반응형'클라우드 > AWS' 카테고리의 다른 글
DMS 란 (0) 2023.08.11 EKS 란 (0) 2023.08.11 딥레이서(DeepRacer) 대회 (0) 2023.06.13 Route 53 서비스 란 (0) 2023.05.22 Elastic Load Balancer 란 (2) 2023.05.22 다음글이 없습니다.이전글이 없습니다.댓글 - 국내 미디어들의 연이은 히트에 의해 미디어 플랫폼 서비스 수요가 꾸준히 증가하고 있다