2021년 5월 20일 목요일

AWS 자동배포 연습해보기

 

이전 포스팅(https://cotmulgyu.blogspot.com/2020/07/blog-post.html)에서 github의 webhooks 를 통해 push가 되면 젠킨스에서 빌드하고 특정 명령어를 실행해서 배포할 수 있음을 확인하였다.

이번에는 CI/CD 서버에서 빌드 후 실제 배포 서버(aws)에 빌드된 파일을 보내고 배포서버에서 바로 배포까지 할 수 있도록 해본다!

  • aws 인스턴스 생성과정은 생략

1_프로젝트 설정

REPOSITORY=/home/ec2-user/project/todolist
PROJECT_NAME=to-do-list

echo "> Build 파일복사"

cp $REPOSITORY/zip/*.jar $REPOSITORY/


echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

echo "현재 구동중인 애플리케이션 pid: $CURRENT_PID"


if [ -z "$CURRENT_PID" ]; then
        echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
        echo "> kill -15 $CURRENT_PID"
        kill -15 $CURRENT_PID
        sleep 5
fi

echo "> 새 애플리케이션 배포"

JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"


echo "> $JAR_NAME 실행"

nohup java -jar \
        -Dspring.config.location=classpath:/application.yml,/home/ec2-user/project/properties/application-oauth.properties \
        -Dspring.profiles.active=real \
        $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
  • AWS CodeDeploy에서 사용할 appspec.yml 파일을 생성한다.

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ec2-user/project/todolist/zip # S3에서 이동시킬 경로
    overwrite: yes

permissions: # 권한설정이 없으면 root로 설정되므로 다음의 설정 필요
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
    - location: start.sh # 애플리케이션 실행
      runas: ec2-user


2_AWS 설정

  • http://m.yes24.com/Goods/Detail/83849117 해당 책을 참고하면 자세하게 설명되어있다...

  • IAM

    • Identity and Access Management(IAM)는 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스. IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어함
    • IAM > 사용자 추가
      • 엑세스유형: 프로그래밍 방식 엑세스
      • 권한 설정: 기존정책 직접 연결 > AmazonS3FullAccess , AWSCodeDeployFullAccess 체크
      • 엑세스키와 비밀 엑세스 키는 잘 관리하도록한다..
  • S3 버킷

    • AWS의 S3 서비스는 일종의 파일 서버임 (파일들을 저장하고, 접근 권한을 관리, 검색을 지원)
    • S3 > 버킷 만들기
      • 다른 건 기본설정..
      • 퍼블릭 엑세스 차단 : 모든퍼블릭 엑세스 차단 체크
  • CodeDeploy

    • AWS CodeDeploy는 Amazon EC2 인스턴스 및 온프레미스에서 실행 중인 인스턴스를 비롯하여 모든 인스턴스에 대한 코드 배포를 자동화하는 서비스

    • IAM > 역할만들기

      • 역할은 EC2에서 사용할 것임
      • 신뢰할 수 있는 유형의 개체 선택 : AWS 서비스
      • 이 역할을 사용할 서비스 선택 : EC2
      • 정책 : AmazonEC2RoleforAWSCodeDeploy 체크
    • EC 인스턴스로 이동 > 인스턴스 우클릭 > 인스턴스 설정 > IAM 역할 연결/바꾸기 > 아까 역할 추가후 재부팅 (보안-IAM 연결 수정)

    • CodeDeploy 에이전트 설치

      • CodeDeploy의 요청을 받을 수 있도록 EC2에 에이전트를 설치한다.

      • EC2에서 다음 명령어 입력

        aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-  northeat-2
        
        
        chmod -x ./install
        
        
        sudo ./install auto
        
    • CodeDeploy 권한 생성

      • CodeDeploy가 EC2에 접근하려면 권한이 필요하다.
      • IAM > 역할 생성
        • 서비스 : AWS 서비스 > CodeDeploy
        • 사용사례 선택 : CodeDeploy
        • 권한 : AWSCodeDeployRole
    • CodeDeploy 생성

      • CodeDeploy > 애플리케이션 생성

      • 컴퓨팅 플랫폼 : EC2/온프레미스

      • 배포그룹 생성

        • 서비스역할: CodeDeploy IAM 역할 선택
        • 배포유형 : 현재 위치
        • 환경 구성 : Amazon EC2 인스턴스
        • 배포 구성 : CodeDeployDefault.AllAtOnce
        • 로드 밸런서 : 로드 밸런싱 활성화 해제


3_젠킨스 설정

  • 젠킨스 - Jenkins 관리 - 플러그인 관리 - 다음 플러그인 설치 (AWS CodeDeploy Plugin for Jenkins)

    • 해당 플러그인은 빌드 후 AWS CodeDeploy를 사용할 수 있는 플러그인으로 빌드 후 특정 경로를 압축하여 S3에 업로드한다. 그리고 설정한 배포를 시작한다



  • 이전에 설정한 Build-Execute Shell 부분에 자신의 프로젝트에 맞는 빌드명령어를 실행한다. (build, bootJar 등)




  • Build-Execute Shell 부분에 AWS CodeDeploy에서 사용할 파일(appspec.yml, start.sh)과 빌드된 jar를 포함하여 복사시킨다.

    • 여기있는 파일들을 aws S3 Bucket으로 이동시킴 (zip)

    • CodeDeploy 말고 다른플러그인으로 S3 업로드만도 가능한데 그러면 여기서 미리 압축이 필요하다.




  • 빌드 후 조치 추가 - Deploy an application to AWS CodeDeploy

    • AWS CodeDeploy Application Name : AWS CodeDeploy 에서 만든 어플리케이션 이름

    • AWS CodeDeploy Deployment Group : 설정한 그룹 이름

    • AWS CodeDeploy Deployment Config : 설정한 CodeDeploy 배포 구성

    • S3 Bucket : AWS S3 Bucket 이름

    • S3 Prefix : 버킷에 생성될 디렉토리

    • Subdirectory : 젠킨스 서버에서 포함될 파일이 저장될 디렉토리

    • Include Files : 포함될 파일

    • Use Access/Secret keys : AWS 에서 생성한 IAM 정보





  • 젠킨스 빌드 후 AWS S3 버킷을 확인해보면 다음과 같이 설정한 디렉토리 밑에 zip 파일이 생기는 것을 확인할 수 있음



  • AWS CodeDeploy 에서 아까 생성한 애플리케이션을 들어가보면 다음과 같이 배포 이력을 볼 수 있음



    • 배포 실패 시 /var/log/aws/codedeploy-agent 경로에서 로그확인 가능!!
    • appspec.yml 에 명시된 경로에 s3 zip파일이 풀려있는 것을 확인할 수 있다.



    • start.sh에 의해 jar가 복사되고 애플리케이션 로그를 볼 수 있는 nohup.out 파일이 생성된 것을 확인할 수 있음