AWS Elastic beanstalk으로 구동중인 서버에 새 코드를 배포하려고 했더니 아래와 같은 에러가 뜨면서 배포가 되지 않았다.
InvalidParameterValueError - Environment named *** is in an invalid state for this operation. Must be Ready.
인스턴스의 health도 OK상태이고, eb status로 상태를 몇 번이고 확인해도 Ready 상태인데, 배포할 수 없는 상태라고 계속 떴다. 이 상태가 되면 capacity 정책이나 AutoScailing 정책 등 구성(Configuration)의 값도 아예 변경이 불가능하다.
~/app eb status
Status: Ready
Health: Green
실제 프로덕션 환경에서 구동중인 서버라 마음대로 환경을 리빌드하거나 아예 새 환경을 배포하여 URL이 변경되면 안되었다. 테스트 환경에서 해보니 리빌드의 경우 최소 5분에서 10분까지 downtime이 발생하고, 새 환경을 빌드하는 경우 url이 변경되어 클라이언트와 연결되지 않아 소용이 없었다. 따라서 동일한 application 하의 새로운 환경을 생성하고, SWAP URLs를 해주는 식으로 해결했다.
먼저 동일한 application 내의 또 다른 환경을 생성한다. 여기서 가장 중요한 것은 동일한 application과 연결된 환경이다. 동일하지 않은 application의 환경과는 SWAP URLs를 지원해주지 않는다. 동일한 application 내에 두 개 이상의 환경이 존재하지 않으면, Actions -> SWAP URLs를 눌렀을 때 아래와 같은 에러 문구를 볼 수 있다.
You need at least two web tier environments in the Ready state to complete this operation.
SWAP URLs는 간단히 말하면, 두 개의 환경의 URLs를 교환하는 것이다. test-server라는 Application이 존재하고, 이 앱에 연결된 TestEnv-1과 TestEnv-2가 있다고 할 때, TestEnv-1의 url과 TestEnv-2의 url이 서로 교환되는 것이다. 이는 일반적으로 Blue/Green 배포 방식이라 할 수 있는데, 별도의 환경에 앱의 새로운 버전 등을 먼저 배포 하여 대기시켜 놓고(Green), 기존의 라이브 중인 앱(Blue)의 url을 서로 변경하여 url에 대한 요청이 Green으로 가도록 하는 방식이다. 이러한 방법으로 downtime 없이 배포를 할 수 있게 된다. SWAP URLs에 대해 더 자세히 알고 싶다면 아래 문서를 참고하길 바란다.
Blue/Green deployments with Elastic Beanstalk
AWS Elastic Beanstalk Swap Environment Urls
SWAP을 한 후 적용되기 까지는 몇 분이 소요된다. SWAP 작업은 DNS변경 작업이므로, 완전히 변경될 때 까지 기존 환경을 삭제하지 말아야 한다. 변경되기 전에 기존 환경이 삭제되어 버리면 삭제된 환경에 요청이 도달하게 되어 downtime이 발생하게 되므로 주의한다.
무엇보다도 해당 에러의 원인이 리소스 한계에 다다른 것으로 추정되는데, AWS forum에서도 명확한 답변이 나와있지를 않다. 혹시 명확한 이유를 아시는 분이 있다면, 댓글로 공유해주시면 감사할 듯 싶다.
AWS: Environment named *** is in an invalid state for this operation. Must be Ready
AWS forums: Environment STUCK on invalid state for this operation. Must be Ready!