금주의 실패사례 - ElasticBeanstalk에서 Health가 변하지 않는 문제
Elastic Beanstalk에서 Environment의 Health가 계속 빨간색
Elastic Beanstalk(이하 EB)를 애용하는 입장에서, 가끔씩 EB는 불완전하다는 느낌을 받는다.
EB도 Cloud Formation(이하 CF)기반인데, 이 CF는 Update시 에러가 잘 난다거나, rollback이 제대로 안되는 등 역시 불완전하기 때문이다.
어쨋든 이번에 CF를 통해 provisioning한 EB에서 다소 황당한 문제를 만났다.
개요
- EB에서는 CloudWatch를 통해 상태를 체크하고, 이를 통해 Auto Scaling을 하거나 SQS를 통해 notification을 줌
- 기본적으로 Load Balancer를 통해 instance에게 healthcheck 함
- 주기적으로 request를 보내고, 200 응답을 일정기간 받지 못하면 상태가 green -> yellow -> red로 바뀜
- 이 외에도 다양한 설정을 하나의 console에서 지원하기 때문에 One-Click 관리가 가능
문제
- 그런데 EB를 통해 배포한 Environment(한 덩어리의 배포 세트)의 상태가 계속 red
- 자원 확인
- Load Balancer의 상태 이상 없음
- Instance의 log에도 healthcheck에 200을 반환 중
- 실제로 서비스를 호출해 봤는데 잘 동작함
- 그냥 상태만 red
헤결
- 다양한 시도
- EB Environment 재생성, Instance terminate(자동으로 재생성됨), Security Group 다 열어 보기 등등
- 아무리 해도 안됨
- 설정 다시 살펴 보기
- 전체적으로 하나씩 자세히 살펴 봄
- Configuration > Security > Service role이 aws-elasticbeanstalk-service-role 가 아니라 autogenerated(회색글씨)로 되어 있음
- 이거 원래 기본적으로 존재하는건데(참고), 갑자기 없네?
- 다른 AWS계정을 참조하여, aws-elasticbeanstalk-service-role을 새로 생성
- 생성 후 EB Environment에 할당 할 필요없음 - 자동으로 bind
- EB Environment 생성단계에서 미처 실행되지 못했던 몇가지 설정들이 수행 됨
- 해결!
원인
- 위 참고 문서를 보면 아래와 같이 정의 되어 있음
Elastic Beanstalk 콘솔에서 환경을 시작하면 콘솔이 aws-elasticbeanstalk-service-role이라는 이름의 기본 서비스 역할을 만들고, 기본 권한이 있는 관리형 정책을 여기에 연결합니다.
- 콘솔에서 환경을 한 번 이라도 시작해야 함
- 근데 나는 CF를 통해 바로 생성함 - service role이 생성 안됨
- 이것이 원인이라고 추측..
- aws-elasticbeanstalk-service-role 이 없으면?
- Service role은 EB가 EB에 생성되는 resource들을 접근할 수 있는 권한이 담겨 있음
- CloudWatch역시 이 중 하나
- CloudWatch로 부터 healthcheck 결과를 받지 못해 상태는 red
- AWS는 정말 좋은데, 가끔 이런 헛점이 있음