1년간 빈스톡을 사용하면서, 배포할 때 주의해야했던 점들을 정리하고자 한다.
1. 빈스톡은 local git code를 배포한다.
remote에 있는 git code를 땡겨다가 배포하는게 아니다.
그래서 배포하기 직전에, 최신 master code를 로컬로 땡겨온 다음에 배포해야한다.
2. 빈스톡에 있는 모든 인스턴스는 같은 애플리케이션 버전이여야한다.
터미널로 eb deploy 명령문을 실행해서 배포를 하던 도중,
실수를 한게 있어서 나도 모르게 command + c 버튼을 눌러서, 배포를 강제종료했던 적이 있다.
그런데 배포 강제 종료는 일을 더 꼬이게 만든다.
빈스톡에서는 모든 인스턴스의 버전이 같아야한다.
예를 들어 모든 인스턴스가 같은 버전으로 배포되기 전에, 배포를 중단시켜 버리면
최신 버전으로 배포된 인스턴스들은 degraded 상태가 된다.
4개의 인스턴스가 있었을 때, 2개의 인스턴스는 최신 버전 / 2개의 인스턴스는 구버전인 경우 아래와 같은 상황을 볼 수 있을거다.
$ eb health --refresh
elasticBeanstalkExa-env Degraded 2016-03-28 23:13:20
WebServer Ruby 2.1 (Puma)
total ok warning degraded severe info pending unknown
4 2 0 2 0 0 0 0
instance-id status cause
Overall Degraded Incorrect application version found on 2 out of 4 instances. Expected version "Sample Application" (deployment 1).
i-d581497d Degraded Incorrect application version "v2" (deployment 2). Expected version "Sample Application" (deployment 1).
i-d481497c Degraded Incorrect application version "v2" (deployment 2). Expected version "Sample Application" (deployment 1).
i-126e00c1 Ok
i-8b2cf575 Ok
instance-id r/sec %2xx %3xx %4xx %5xx p99 p90 p75 p50 p10
Overall 646.7 100.0 0.0 0.0 0.0 0.003 0.002 0.001 0.001 0.000
i-dac3f859 167.5 1675 0 0 0 0.003 0.002 0.001 0.001 0.000
i-05013a81 161.2 1612 0 0 0 0.003 0.002 0.001 0.001 0.000
i-3ab524a1 155.9 1559 0 0 0 0.003 0.002 0.001 0.001 0.000
i-bf300d3c 162.1 1621 0 0 0 0.003 0.002 0.001 0.001 0.000
instance-id type az running load 1 load 5 user% nice% system% idle% iowait%
i-d581497d t2.micro 1a 25 mins 0.16 0.1 7.0 0.0 1.7 91.0 0.1
i-d481497c t2.micro 1a 25 mins 0.14 0.1 7.2 0.0 1.6 91.1 0.0
i-126e00c1 t2.micro 1b 25 mins 0.03 0.08 6.9 0.0 2.1 90.7 0.1
i-8b2cf575 t2.micro 1c 1 hour 0.05 0.41 6.9 0.0 2.0 90.9 0.0
instance-id status id version ago deployments
i-d581497d Deployed 2 v2 9 mins
i-d481497c Deployed 2 v2 7 mins
i-126e00c1 Deployed 1 Sample Application 25 mins
i-8b2cf575 Deployed 1 Sample Application 1 hour
그래서 이러한 상황이 발생하면, 배포에 성공했던 가장 최근 버전으로 재배포를 해줘야한다.
3. 배포에 실패한 인스턴스는 LB에 등록되지 않는다
빈스톡은 LB에서 인스턴스를 떼내고, 해당 인스턴스에 새로운 버전을 배포하고, 다시 이 인스턴스를 LB에 등록해주는 방식으로 배포된다. 만약 인스턴스가 5개이고, 만약 1개씩 배포되게 설정을 했으면 위의 과정을 5번하는거다. ( 그래서 빈스톡 배포는 느리다 )
그런데 한 인스턴스를 배포하다가 실패하면, 이 인스턴스를 LB에 다시 등록해주지 않는다.
그래서 남은 인스턴스들끼리만 트래픽을 처리하다보니, CPU / 디스크 / 메모리 사용량들이 늘어나서
남은 인스턴스들에도 빨간불이 들어오는 상황이 생기기도 한다.
4. 무한 카오스에 빠지면 안된다
빈스톡 배포에 실패하면, 종종 카오스에 빠진다.
메모리가 부족해서 배포에 실패하기도 하고, 패신저 연결이 안되서 실패하기도 하고.. 아무튼 특정 인스턴스에서만 배포가 안되는 현상이 발생하는 경우도 있다.
v1 버전이였던걸 v2으로 배포하다가 특정 인스턴스에서만 배포가 안되면,
'다시 v2으로 배포해보자!' 라는 마음가짐으로 다시 배포 명령문을 날리고는 한다.
그런데 이러면 전체 인스턴스의 버전이 다르기 때문에 또 배포에 실패할거다.
그러면 또다른 이유로 배포에 실패하게 되니.. 또다른 카오스에 빠지게 된다.
때문에 이런 경우에는 침착하게, 모든 서버의 애플리케이션 버전을 다시 맞춰준 다음에
문제가 발생한 인스턴스의 상황을 확인 한 후, 재배포를 해줘야한다.
참고 자료
EB CLI 관련 문제 해결 - https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/eb-cli-troubleshooting.html
Notifications and Troubleshooting - https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-health-enhanced-notifications.html
'소프트웨어-이야기 > 인프라' 카테고리의 다른 글
(도커) docker component 쓰기 (0) | 2018.03.20 |
---|---|
(AWS) S3 SELECT - S3 파일에 쿼리 날려서 필요한 데이터만 다운받기 (4) | 2018.03.01 |
[beanstalk]애플리케이션 버전 관리 (0) | 2018.01.27 |
[beanstalk]eb deploy timeout 옵션 (0) | 2018.01.27 |
(넷플릭스) 넷플릭스의 카오스 엔지니어링 (0) | 2017.12.30 |