Back End/트러블슈팅

[트러블슈팅] ELB (Elastic Beanstalk) 에 대해 알아두면 좋은 지식들 (feat. ebextensions)

DevPing9_ 2022. 10. 28. 16:13

... 너무 삽질을 많이 했다. 😭

 

Elastic Beanstalk(ELB) 에 모니터링 알람 설정, 환경 커스터마이징 등을
소스코드레벨에서 관리 할 수 있도록 하는 작업을 진행하면서 알게된 정보를 공유하고자 한다.

특히 httpd.conf 파일이 apache 버전으로 남아있던 현상은 두고두고 기억에 남을 것 같다.

 

 


ELB & .ebextensions

1. *.config 파일들은 이름의 오름차순으로 실행된다.

작업 순서가 중요한 config 들은 00_tomcat.config , 01_unzip_font.config 와 같이 네이밍하여 작성한다.

 


2. *.config 파일 내부에 사용되는 프로퍼티인 commands  container_commands 는 실행시점에서 차이가 있다.

 

# commands

build 파일이 ec2 에서 압축해제 되기전에 실행된다.

따라서 .ebextension 폴더 내의 static resource 들을 참조하지 못한다.

 

# container_commands

build 파일이 ec2 에서 압축해제 되고, tomcat 서버에 deploy 되기전에 실행된다.

.ebextension 폴더 내의 static resource 들을 참조할 수 있다.
staging directory 에서 실행되며 staging directory 는 . 를 이용하여 참조한다.

 


3. Jenkins 빌드 성공과 Elastic Beanstalk 배포 성공은 별개이다.

*.config 파일들에 정의 된 커맨드가 하나라도 실패하면 모든 사항은 롤백되며 이전 버전을 계속 유지한다.

 


4. BeanStalk 은 빌드파일이 배포되면 staging 이라는 단계를 갖는다.

 

staging 단계에서는 war 파일을 압축해제 하여 .ebextension 내의 커맨드를 실행한다.

.ebextension 가 성공적으로 모두 실행되면 .ebextension 폴더를 삭제하고 /var/app/current 경로에 deploy 에 필요한 파일들이 옮겨지며,  /var/lib/tomcat/webapps/ROOTsoft link 를 생성한다.

(AWS Docs - 각 플랫폼 별 Staging Directory 위치)

 

# 실행순서

1. ebextensions.command 실행 
2. staging directory 생성 (UNZIP /opt/elasticbeanstalk/deployment/app_source_bundle)
3. ebextensions.container command 실행  
4. ebextensions 삭제 
5. X-Ray, proxy, tomcat stop  
6. soft link 생성 (FROM /var/app/current TO /var/lib/tomcat/webapps/ROOT)
7. X-Ray, tomcat, proxy 실행
/opt/elasticbeanstalk/deployment/app_source_bundle 를 unzip 하여 /var/app/staging 에 staging directory 가 생성된다.

 


5. BeanStalk 배포에 관한 로그는 /var/log/eb-engine.log 에서, command 수행에 관한 로그는 /var/log/cfn-init.log 에서 확인할 수 있다.

 

 


6. ELB 는 인스턴스가 생성될 때(Scale-out 또는 종료후 재시작) 아래와 같은 순서로 httpd.conf 파일을 교체한다. (Onetime-Only)

1. Apache 의 httpd 를 설치한다. (따라서 httpd.conf 는 Apache provided 상태이다.)
2. .ebextension 을 실행한다.
3. httpd.conf 를 ELB provided 로 변경한다.

 

중요한 점은 httpd.conf 교체 작업이 Onetime-Only 작업이라는 것이다. (진짜 너무함..)
그래서 2번에서 실패할 경우 3번이 실행되지 않기에, 3번을 기반으로 한 커맨드는 다 무시가 되고 에러가 난다.

ebextension 의 ignoreErrors 를 true 로 하고
소스코드를 재배포 해봤자 이미 httpd.conf 는 Apache provided 상태이기 때문에 
3번을 기반으로 한 커맨드는 다 fail 이다.

그리고 ELB provided httpd.conf 가 아니면 MPM 라이브러리가 없어 apache 커맨드도 안먹힌다.
apache 가 실행은 되고 있었는지 모르겠다 (추후 재현하여 확인해본 후 업데이트 하겠음)

 

728x90