[기타] IaaS 서비스 활용 실습 정리

KIM Jongwan·2023년 5월 26일
0

CICD

목록 보기
1/1
  1. AWS EC2 인스턴스 생성 / RDS, S3 생성
  2. 프로젝트와 RDS, S3연동 및 EC2 프로젝트 배포
  3. 배포 자동화를 위해 Travis-ci 설정
  4. nginx를 활용하여 무중단 배포 설정
  • EC2 인스턴스를 생성하고, 포트 설정만 적절하게 해 주었다면 sftp 툴을 사용하여 직접 서버에 접속, 프로젝트를 배포할 수 있다. ( nohub java -jar [배포할 프로젝트 jar파일] )
    하지만 수동으로 프로젝트를 배포할 경우 그만큼 ‘배포’라는 작업에 할애 되는 시간이 많아지기 때문에 효율적이라 할 수 없다. 많은 IaaS 서비스들이 ‘배포’작업에 자동화를 지원하고있다.
    배포 자동화란 개발자가 코드를 저장소에 push 하기만 하면 build부터 deploy에 이르는 일련의 과정을 자동으로 진행해주는 기능이다.

  • 배포 자동화가 적용된 프로젝트 배포 구조

  1. master branch push
    1. 자신이 작성한 코드를 원격 저장소에 합병시키는 과정이다.
      원격 저장소에 보관된 코드를 통해 수동으로 배포를 원할 경우 별도의 deploy 스크립트를 작성하여 배포할 수 있다.
    2. deploy.sh
  2. 배포용 .jar파일 전달
    1. Travis-ci는 GitHub에서 제공하는 CI / CD 서비스 이다. Travis-ci는 .tavis.yml파일을 감지하여 동작을 수행한다.
      Travis-ci에서 AWS의 S3에 접근하기 위해서는 별도 권한이 필요하다.

    2. S3권한 생성 및 부여

      1. Travis-ci 해당 repository에 S3 생성 후 전달받은 access_key와 secret_key를 등록
    3. .travis.yml

      language: java
      jdk:
        - openjdk8
      
      branches:
        only:
          - master
      
      cache:
        directories:
          - '$HOME/.m2/repository'
          - '$HOME/.gradle'
      
      script: "./gradlew clean build"
      
      before_install:
        - chmod +x gradlew
      
      #deploy가 실행되기 이전에 실행할 작업 명시 ( 폴더 생성 -> 스크립트 복사 -> 이전 배포파일 옮김 )
      before_deploy:
        - mkdir -p before-deploy
        - cp scripts/*.sh before-deploy/
        - cp appspec.yml before-deploy/
        - cp build/libs/*.jar before-deploy/
        - cd before-deploy && zip -r before-deploy *
        - cd ../ && mkdir -p deploy
        - mv before-deploy/before-deploy.zip deploy/springboot-webservice.zip
      
      #deploy 실행할 위치 지정 ( access_key, secret_key는 travis통해 사전 등록 )
      deploy:
        - provider: s3
          access_key_id: $AWS_ACCESS_KEY
          secret_access_key: $AWS_SECRET_KEY
          bucket: springboot-study-s3-jw
          region: ap-northeast-2
          skip_cleanup: true
          acl: private
          local_dir: deploy
          wait-until-deployed: true
      
        - provider: codedeploy
          access_key_id: $AWS_ACCESS_KEY
          secret_access_key: $AWS_SECRET_KEY
          bucket: springboot-study-s3-jw
          key: springboot-webservice.zip
          bundle_type: zip
          application: springboot-webservice-cd
          deployment_group: springboot-webservice-cdgr
          region: ap-northeast-2
          wait-until-deployed: true
      
      #deploy 완료 후 상태 전송받을 이메일
      notifications:
        email:
          recipients:
            - "jongbell4@gmail.com"
  3. 배포용 .jar 파일 전달
      1. .travis.yml 참조
  4. 배포 요청
      1. .travis.yml 참조
  5. 배포
    1. AWS의 codedeploy 서비스는 S3에 보관된 파일을 읽어와 설정된 EC2에 프로젝트를 자동으로 배포하는 역할을 한다.
      .travis.yml 파일의 deploy 부분에 배포 관련 명령어를 명시하게 되고, 배포 과정에서 해당 명령어가 실행된다.

  • 배포 자동화가 적용되었다면 개발자의 push 동작 하나로 자동으로 서버에 배포까지 완료되는 것을 확인 할 수 있다.
    하지만 배포 과정에서 이루어지는 서비스의 재기동 과정에서는 Client 입장에서 서비스를 사용할 수 없게 된다. ( 500 error )
    이러한 불편함을 해소하기 위해 ‘무중단 배포’를 적용해 보도록 한다.

  • 무중단 배포가 적용 된 프로젝트 배포 구조

profile
2년차 백앤드 개발자입니다.

0개의 댓글