고전적인 시스템환경의 APP의 배포방식은 기본적으로 다음의 방법을 따른다.
- APP 배포/업데이트
- 개발이 완료된것을 빌드(Jenkins,수동) , Repository(Nexus)에 등록
- ALB(nginx와 같은 L7레이어)에서 배포할 인스턴스 타겟 제거
- 인스턴스에 앱 배포
- ALB에 인스턴스 다시 추가
- Scale out
- 늘리는 경우 새로운 인스턴스를 생성, 앱 배포후 ALB에 등록만 해주면 끝
- 줄이는 경우 ALB에서 인스턴스를 제거후, 앱의 동작이 완료된 시점에 앱 정지, 인스턴스 제거
일반적인 APP의 경우 APP 자체에서 외부 인터넷과 연결될 필요가 없기 때문에, Private Subnet안에 있어도 무방하며, 접근이 필요한 endpoint만 ELB에 연결되어 있어도 큰 문제가 되지 않는다. (cf. 외부네트워크에 있는 API 호출해서 데이터를 받아오는 프로그램은 외부망과 연결이 필요하다.)
하지만 AWS에서 사용되는 Serverless로의 배포에 대해서 생각해보자.
그렇게되면 ECS(Fargate, EC2, External), Lambda 까지로 확장해야한다. (여기서 EKS는 논외로 하자.)
- 순수 EC2는 고전적인 배포와 다를바가 없다. (ALB만 사용시)
- Lambda는 누군가가 호출해줘야 실행된다. ( 늘 동작하는 Worker의 개념과 의미가 맞지 않다. )
- 외부에서 호출하는 것이 필요하다면 - Lambda는 API Gateway, ALB에 연결이 가능하다.
- API Gateway는 querystring에 대한 전처리가 가능하고, ALB에서는 응답 그대로 전달되기 때문에 querystring에 대한 대응이 따로 있어야 한다.
- API Gateway는 30초까지, ALB는 더 긴 시간까지 Response Time에 대해 기다릴 수 있다.
- ALB에 EC2와 Lambda를 같은 TargetGroup에 두는 것은 불가능하다.
- 즉 하나의 url을 EC2와 Lambda로 Loadbalancing하는 것은 불가능하다.
- ALB에서는 Lambda Target에 대해 상태체크를 켤 수 있는데, 이 경우 Lambda를 호출하는 것과 동일하다.
- 배포는 ALB의 drain time에 영향을 받는다.
- Lambda는 코드의 크기와, 동시에 최대 실행 가능한 숫자가 정해져있다.
- ECS는 많은 요소를 고려해야한다.
- SDK를 활용해서 수동으로 컨트롤 하기는 매우 까다롭다.
- cluster, service, task 정보까지 모두 가지고 있어야 원하는 task에 desire count를 늘리거나 줄일 수 있다.
- ALB에는 EC2 / Fargate는 각각 별도로 Target Group을 구성해야한다.
- EC2는 Instance Type, Fargate는 IP Type이기 때문.
- EC2도 bridge방식이 아닌 eni방식을 사용하면 구성 자체는 더 자유로워질수 있으나 외부와의 인터넷을 사용해야하는 경우 Public IP를 할당하거나 Nat Gateway를 사용해야함, 불필요 비용이 발생하게 된다. (Public IP의 할당/재할당도 과금요소)
- CDK로 배포하면 구성은 손쉽게 할 수 있으나 변경이 까다롭다.
- SDK를 활용해서 수동으로 컨트롤 하기는 매우 까다롭다.
ECS 는 이미지가 갱신될때 업데이트를 어떻게 할 수 있는가?
- Task definition에서는 어떤 이미지를 어떤 태그를 갖느냐에 대한 정보만 갖고 있을뿐, 갱신된 latest 태그의 이미지의 변화는 알지 못한다. (hash 체크등을 하지 않고 단순 tag를 string으로만 정보를 가지고 있다는 소리.)
- 서비스를 force deployment옵션을 주고 update를 하면 기존에 배포되어있는 서비스들을 rolling 방식으로 차례차례 교체한다.
- Fargate는 새로 생성하는것에 제한이 없기 때문에 바로 진행된다.
- EC2의 경우 추가로 Task를 생성할 여유 인스턴스가 없는 경우에는 진행되지 않는다.
- ALB에 연결되어있는 경우 ALB Target Group까지 교체되지만 ALB Drain time까지 기다리게되므로 오래걸린다.
'개발' 카테고리의 다른 글
| M1 Mac OS 12 beta 6 - Jetbrain Tool 실행하기 (0) | 2021.09.14 |
|---|---|
| Cloudfront Serving. 그런데, CORS? (0) | 2021.08.29 |
| ECS with ALB (0) | 2021.07.15 |
| EC2, Fargate, Lambda. 뭐쓰지? (0) | 2021.07.10 |
| Gitlab CI/CD 사용하기 (0) | 2021.07.05 |