오늘 중요한 업뎃이 있었는데 오전부터 ELB 콘솔에서 zip 파일 업로드가 안되며, 배포가 안되는 현상이 발생했다.
ELB콘솔 -> S3 업로드가 안되는 상황으로 보였지만, AWS CLI와 친숙해질겸 CLI로 배포를 해보았다.
배포과정 설명
오늘 배포 문제를 겪은, 내가 담당하고있는 서비스는 kotlin + Spring Boot 조합으로 이루어져있는데, 다음의 과정을 거쳐 배포된다.
- 코틀린으로 코드 작성후 compile
- compile된 jar 파일이 Docker에서 실행되도록 하는 Dockerfile과 함께
- jar파일을 압축하여 zip 파일로 만듦
- ELB 콘솔에서 직접 파일 업로드하여 배포
배포방법
기본적으로 AWS에서는 AWS의 전체적인 서비스와 상호작용 할 수 있는 커맨드 라인 인터페이스인 AWS CLI와 ELB 환경을 컨트롤하는데 특화된 EB CLI를 제공하고 있다.
다만 EB CLI는 ELB 콘솔에서 제공하는 "ZIP"파일 배포를 지원하지 않고, git 을 통한 버전관리 형태로 배포 커맨드를 지원한다.
그걸 설정할 시간이 없었던지라, AWS CLI를 통해 EB의 콘솔에서 ZIP파일을 배포할때 EB가 처리해주는 배포과정을 하나하나 수동을 진행하는 방법을 택했다.
EB에서 Zip 파일을 배포하는 과정은 다음과 같다.- zip 파일을 S3에 업로드
- S3에 업로드된 zip 파일을 가져와 해당 어플리케이션에 버전으로 생성
- 배포하도록 설정한 해당 환경의 인스턴스에서 zip 파일 압축을 풀고 배포 진행
- Docker 환경의 경우 Dockerrun.aws.json이 있다면 해당 설정을 주입하며 docker-compose run을 하던지 Docker run을 하던지 ...
이를 AWS CLI 로 구현해보자.
#bash
cd {project 폴더}
aws s3 cp {압출파일명.zip} s3://{eb가 zip파일을 올려놓는 버킷명}/{버킷에 올릴 파일명}.zip
- 먼저 aws cli의 s3 명령어로 S3에 zip파일을 업로드한다.
#bash aws elasticbeanstalk create-application-version --application-name {배포하고자 하는 대상 어플리케이션 명} --version-label {만들고자 하는 버전명} --source-bundle S3Bucket='{방금 업로드한 zip파일이 있는 S3버킷명}',S3Key='{방금 업로드한 zip파일 명}'
- 그 다음 aws cli의 elasticbeanstalk 명령어로 특정 어플리케이션에 버전을 만든다. (create-application-version)
- --aplplication-name 플래그로 압축된 zip으로 버전을 만들어줄 ELB의 어플리케이션이름을 고르고
- --version-label 플래그로 버전이름을 지정해준다.
- --source-bundle 플래그로 어떤 파일을 기반으로 버전을 만들것인지 알려준다.
- 위의 작업 후 ELB 콘솔의 애플리케이션 버전 항목에 들어가보면,
위와같이 새로운 버전이 등록된 것을 확인할 수 잇다.
#bash aws elasticbeanstalk update-environment --application-name {배포하고자 하는 대상 어플리케이션 명} --environment-name {배포하고자 하는 환경 명} --version-label {위에서 만든 version-lable 이름}
- 위의 메시지를 입력하면 최종적으로 배포까지 할 수 있게 된다.
결론
이제 AWS 콘솔에 문제가 생기더라도 쉽게 배포할 수 있고,
셸스크립트 등을 작성하여 좀 더 쉽게 배포할 수 있어졌다.
오늘도 감사하다