https://youngseo-computerblog.tistory.com/158 에 이어지는 글입니다.
트러블 슈팅
Elastic Beanstalk을 사용하다 여러 문제 상황에 부딪히면 어디에서 발생하는 문제인지 찾기가 너무 어렵다.. 우선 AWS에서 친절하게 Elastic Beanstalk 내부 작동과정을 설명해주지 않을 뿐더러 에러 로그에 대한 해결방법 내용이 잘 나와있지 않다 🥲
그래도,, 용을 쓰고 EC2를 뜯어보고, eb-engine.log를 참조하며 해결할 수 있었다.
1. 환경변수 를 못 읽는 문제
Failed to parse the host:port pair '${RDS_HOSTNAME}:${RDS_PORT}'
ElasticBeanstalk으로 RDS를 연동할 경우 자동으로 연동된 RDS의 HOSTNAME, PORT 등을 환경변수에 넣어준다. .. (그런데 공식 문서에서도 정책이 바뀌어서 넣어줘야 한다 만다 말이 많은 것 같다.)
따라서 .ebextensions에 root 권한으로 env를 하나씩 넣어주는 로직을 추가하였다.
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/01_set_env.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
for var in $(/opt/elasticbeanstalk/bin/get-config environment | jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]'); do
export $var
done
2. Procfile이 대체 뭐야..?
Procfile이 web: appstart 로 해야 한다는 건 알겠는데,, 대체 왜 그렇게 해야 하는지 모르겠다...
ElasticBeanstalk을 살펴보면 애플리케이션의 기본 JAR를 실행하는 명령어는 web: 으로 지정해야 하며, Procfile에 나열된 첫번째 명령이어야 한다고 한다.. 왜 여기에서는 또 java -jar application.jar 로 build하는 형태로 표현하는 거야..;;
ec2에서 cat etc/systemd/system/seb.service 명령어를 수행하면 이 이유를 확인할 수 있었다. elasticbeanstalk에서는 서비스 시작 시 아래와 같이 "appstart" 명령어를 사용하는 것을 알 수 있다.
3. .config 또는 .conf 파일에 주석을 삭제한다. (참고)
4. S3 version 오류
Incorrect application version "2024-****" (deployment 118). Expected version "githubaction-****" (deployment 119)
ElasticBeanstalk에서 S3 버전 충돌이 날 경우 나올 수 있는 오류이다. 나는 커밋 메시지를 더럽히고 싶지 않아서 github action으로 배포 테스트해보다가 -> local에서 AWS로 보내면서 테스트를 하다가 -> 또 다시 github action로 다시 바꿔서 배포하면서 이 오류들을 너무 많이 맞이했다. 😵💫 이 때 S3 버킷에서 이전에 했던 githubaction 관련 zip파일이 모여있는 폴더를 삭제해주면 해결이 되었다.
5. An invalid state for this operation. Must be Ready.
ElasticBeanstalk에서 배포를 해주기 전에 Ready 상태임을 확인해야 한다. Degraded 상태인데 배포를 시도한다면 위 오류를 맞이할 수 있다. 극단적인 경우에는 아래 현재 작업 중단 / 앱 서버 다시 시작 / 환경 다시 빌드 를 활용해 Degraded 상태를 회피하자.
해결과정
고통의 흔적을 남겨보았다..