AWS 엘라스틱 빈스토크와 개발자도구로 CI/CD 자동화하기
수백가지 AWS 서비스 중에 개발자에게 가장 필요한 서비스를 꼽으라면 엘라스틱 빈스토크(Elastic Beanstalk)를 언급하고 싶다. 당장 작성한 코드를 신속하게 배포해야 하는 상황에서 인프라의 바닥부터 세팅하는 것은 시간이 예상보다 많이 소요될 수 있다. 이때 빈스토크는 개발자가 작성한 소스코드만으로 바로 배포할 수 있게 도와준다.
빈스토크를 사용하지 않고 서비스 인프라스트럭쳐를 구성한다면 최소 아래와 같은 구성을 직접 해야한다.
- 네트워크 구성: VPC, SecurityGroup, …
- 서비스 컴퓨팅 서버 인스턴스 구성: EC2
- 로드밸런싱: ELB, AutoScaling
엘라스틱 빈스토크는 위와 같은 구성을 빠르게 처리하고 개발자는 코드에 집중할 수 있도록 한다. 그리고 운영환경(Prod)과 테스트환경(Stage/Test/Dev)를 분리 구성하는 기능을 기본적으로 지원한다. 그리고 각각의 환경은 독립된 리소스를 사용하기 때문에 아래처럼 환경별로 다른 서비스로 구성할 수 있다.
- Dev 환경
- EC2 인스턴스 1대
- ELB 사용안함
- Prod 환경
- EC2 인스턴스 2대 이상
- ELB 사용
- AutoScaling 정책을 적용하여 트래픽 양에 의한 Scale in/out
물론 컨테이너 서비스(ECS, Fargate, EKS)나 EC2 + AutoScaling + ELB를 사용할 수도 있지만 빈스토크는 코드 외에 나머지는 신경쓰지 않아도 된다는 점에서 편리하다. 개발자가 신경써야 하는 포인트가 줄어드는 것이다.
빈스토크의 소스코드는 압축파일로 S3에 저장하거나 직접 업로드 할 수 있다. 이 부분이 수동작업 부분인데 AWS에서 제공하는 개발자 도구를 사용하면 빌드 및 배포도 자동화할 수 있다.
Beanstalk는 CodeBuild, CodePipeline과 통합되어 CI/CD를 자동화 할 수 있다. 코드파이프라인을 통해 아래 작업을 정의해둔다.
- CodeCommit 혹은 타 형상관리 서비스(e.g. GitHub, …)에서 소스코드 관리
- CodeBuild를 통한 테스트 및 빌드
- CodePipeline을 통한 1단계, 2단계 자동화 및 빌드 결과물을 빈스토크로 배포
순서대로 보면,
개발자는 형상관리 서비스에 코드를 푸시한다. 그러면 코드파이프라인에 정의한 작업이 시작된다. 먼저 소스코드 아티팩트를 정해둔 S3 버킷에 업로드한다. 이후 코드빌드는 1단계에서 업로드한 소스 아티팩트를 가져와 빌드작업을 수행한다. 이때 빌드는 소스코드 내에 정의한 buildspec.yml
에 정의된 작업순서대로 시행한다. (물론 파일명을 변경할 수 있고 소스코드에 저장할 필요 없이 파이프라인을 정의할 때 직접 등록할 수 있다.) 그리고 빌드 아티팩트를 생성한다. 이 아티팩트를 S3에 업로드한 후 다시 Deploy 스테이지에서 빈스토크로 배포를 시행한다.
이 작업은 간단해 보이지만 이런 CI/CD 툴을 직접 구성해야 하는 경우 (GitLab, Jenkins, …) 도 있기 때문에 몇번의 클릭만으로 시간을 절약할 수 있다는 것은 큰 이점으로 보인다.
가장 놀라운 것은 이렇게 정의한 빈스토크는 클라우드포메이션 스택으로 정의되어 있다는 것이다. 빈스토크의 기저엔 클라우드포메이션이 있다. 이때문에 빈스토크가 왜 편했는지 어느정도 이해가 된다. 최소한의 구성을 제공하되 사용자가 원하는 경우 커스터마이징이 가능한게 빈스토크 서비스이다.