-
[AWS] SpringBoot와 Docker를 사용하여 CI/CD 자동화 배포해보기Cloud/AWS 2021. 4. 3. 21:02728x90반응형
Docker를 사용하여 CI/CD 파이프라인 구축하기
위의 아키텍쳐와 비슷하게 예제를 진행해보려 합니다. EC2 인스턴스 내부에
Docker
를 사용하여 Spring Boot jar 파일을 실행시켜보겠습니다. (이 글에서는 EC2, S3, CodeDeploy, Travis CI를 생성하고 연결하는 법에 대해서는 다루지 않겠습니다.)사용하고자 하는 도구는 아래와 같습니다.
Spring Boot(gradle)
Travis CI(CI 담당)
AWS S3 Bucket(CI 빌드 결과를 저장하기 위함)
AWS CodeDeploy(CD, 자동화 배포를 담당)
AWS EC2
Docker
Travis CI 사용하기
Travis CI의 레포지토리, Github 연결은 했다고 가정하고 AWS IAM 사용자 키를 등록하는 과정만 보겠습니다.
Settings
를 눌러서 Travis CI에 키를 등록하겠습니다.S3 버켓에 접근 권한이 있는 IAM 사용자
엑세스 키
와비밀 엑세스 키
를 등록하겠습니다. (나중에 travis.yml 작성할 때 사용되니 이름을 잘 기억해야 합니다.)앞으로 작성할 파일은 위의 디렉토리 위치에 맞춰서 작성하겠습니다.
travis.yml 작성하기
language: java jdk: - openjdk11 brances: only: - master cache: directories: - '$HOME/.m2/repository' - '$HOME/.gradle' script: - "./gradlew clean build" before_deploy: - mkdir -p before-deploy # zip에 포함시킬 파일들을 담을 디렉토리 생성 - cp scripts/*.sh before-deploy/ - cp Dockerfile before-deploy/ # Dockerfile 복사하기 - cp appspec.yml before-deploy/ # CodeDeploy 에게 필요한 appspec.yml 파일 - cp build/libs/*.jar before-deploy/ - cd before-deploy && zip -r before-deploy * # before-deploy로 이동후 전체 압축 - cd ../ && mkdir -p deploy # 상위 디렉토리로 이동후 deploy 디렉토리 생성 - mv before-deploy/before-deploy.zip deploy/SpringBoot_CI-CD.zip # deploy로 zip파일 이동 deploy: - provider: s3 access_key_id: $AWS_ACCESS_KEY # Travis CI 에서 IAM 사용자 엑세스 키 secret_access_key: $AWS_SECRET_KEY # Travis CI 에서 IAM 사용자 비밀 엑세스 키 bucket: aws-gyun-s3 # S3 Bucket 이름 region: ap-northeast-2 skip_cleanup: true acl: private local_dir: deploy wait-until-deployed: true - provider: codedeploy access_key_id: $AWS_ACCESS_KEY # Travis CI 에서 IAM 사용자 엑세스 키 secret_access_key: $AWS_SECRET_KEY # Travis CI 에서 IAM 사용자 비밀 엑세스 키 bucket: aws-gyun-s3 # S3 Bucket 이름 key: SpringBoot_CI-CD.zip bundle_type: zip application: Test # CodeDeploy 애플리케이션 이름 deployment_group: Test-Group # CodeDeploy 배포 그룹 이름 region: ap-northeast-2 wait-until-deployed: true notification: email: recipients: - wjdrbs966@naver.com
before-deploy
- deploy 명령어가 실행되기 전에 수행됩니다.
- CodeDeploy는 jar 파일을 인식하지 못하므로 jar + 기타 파일들을 모아 압축(zip) 합니다.
deploy
- S3 파일 업로드 혹은 CodeDeploy로 배포 등 외부 서비스와 연동하는 것들에 대해 작성한 것입니다.
즉 위의 과정을 통해서
CI
과정을 거치게 되고 이 과정 속에서jar
파일을 만들어 이 파일을 S3에 저장하는 것입니다.EC2 Linux2 인스턴스에 CodeAgent 설치하기
sudo yum install -y aws-cli cd /home/ec2-user/ sudo aws configure wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install chmod +x ./install sudo ./install auto sudo service codedeploy-agent status
위와 같이 차례대로 설치를 하겠습니다.
CodeAgent 상태 확인
sudo service codedeploy-agent status
위와 같이
CodeAgent
가 잘 작동 중인지 확인했을 때 위와 같이 나오면 잘 작동 중인 것입니다! 그리고 CodeDeploy 애플리케이션 생성 및 배포 그룹 생성은 생략하겠습니다.그러면 이제 CodeDeploy에서 필요한
appspec.yml
파일과 EC2 내부에서 동작하게 하는 스크립트 파일에 대해서 작성해보겠습니다.appspec.yml 파일 작성
version: 0.0 os: linux # EC2 운영체제 files: - source: / destination: /home/ec2-user/app/step2/zip/ # EC2 내부에 목적지 경로 overwrite: yes # 덮어쓸 것인지? permissions: - object: / pattern: "**" owner: ec2-user group: ec2-user hooks: ApplicationStart: - location: deploy.sh # 아래에서 작성한 스크립트 파일 이름 timeout: 60 runas: ec2-user
여기서 띄어쓰기 or 파일이름 오타 등등 많은 이유로 에러가 발생하니까 신중하게 작성해야 합니다. 위의 appspec.yml 파일을 통해서 CodeDeploy가 S3의 jar 파일을 받아서 EC2에 전달할 수 있는 것입니다.
Dockerfile 작성
FROM openjdk:11-jre-slim WORKDIR /home/ec2-user/ COPY demo-0.0.1-SNAPSHOT.jar . CMD java -jar demo-0.0.1-SNAPSHOT.jar
- FROM: openjdk-11 이미지 다운
- WORKDIR: 작업할 디렉토리 지정
- COPY <복사할 파일> <이미지에서 파일이 위치할 경로>
- CMD 컨테이너가 시작되면 실행할 명령어
deploy.sh 작성
echo "> 현재 실행 중인 Docker 컨테이너 pid 확인" >> /home/ec2-user/deploy.log CURRENT_PID=$(sudo docker container ls -q) if [ -z $CURRENT_PID ] then echo "> 현재 구동중인 Docker 컨테이너가 없으므로 종료하지 않습니다." >> /home/ec2-user/deploy.log else echo "> sudo docker stop $CURRENT_PID" # 현재 구동중인 Docker 컨테이너가 있다면 모두 중지 sudo docker stop $CURRENT_PID sleep 5 fi cd /home/ec2-user/app/step2/zip/ # 해당 디렉토리로 이동 (Dockerfile 을 해당 디렉토리에 옮겼기 때문에) sudo docker build -t gyunny ./ # Docker Image 생성 sudo docker run -d -p 8080:8080 gyunny # Docker Container 생성 sudo docker run -d -p 8081:8080 gyunny # Docker Container 생성
그리고 위와 같이 실제로 테스트 해볼 수 있는 간단한 API를 하나 만들어보겠습니다.
git add . git status git commit -m "커밋 메세지" git push origin master
위의 명령어를 통해서 Github push를 해보겠습니다. 그 후에 Travis CI를 들어간 후에 확인해보겠습니다.
그러면 자동으로 위에서 작업했던 자동화 파이프라인 CI/CD가 작동할 것입니다.
EC2 인스턴스
EC2 인스턴스를 보면 위와 같이 파일들이 잘 전달된 것도 확인할 수 있습니다.
그리고
sudo docker ps
명령어를 통해서 현재 실행 중인 컨테이너를 확인하면 위와 같이 떠있는 것을 볼 수 있습니다.위와 같이 잘 뜨는 것을 확인할 수 있습니다.
반응형'Cloud > AWS' 카테고리의 다른 글
[AWS] Amazon Certificate Manager로 HTTPS 적용해보기 (0) 2021.04.04 [AWS] Route 53으로 DNS와 IP 주소 연결하는 법 (0) 2021.04.04 [AWS] VPC(Virtual Private Cloud)란 무엇일까? (0) 2021.04.02 [AWS] AWS CodeDeploy-CodePipeline을 통한 배포 자동화 해보기 (0) 2021.03.30 [AWS] AWS RDS 프리티어로 만들기 (0) 2021.03.29