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는 정말 좋은데, 가끔 이런 헛점이 있음