본문 바로가기
공부/Spring

[Spring] 깃허브 액션과 AWS CodeDeploy로 CI/CD 구축 (스프링 부트)

by 웅대 2023. 7. 3.
728x90
반응형

https://growth-coder.tistory.com/220

이전 포스팅에서 깃허브 액션만 사용하여 CI/CD를 구축했었다.

 

ssh-action과 scp-action을 통해서 배포 자동화를 구축했는데 이번에는 AWS CodeDeploy를 사용하여 배포 자동화를 구축해보려고 한다. (CI 생락)

 

아키텍처는 다음과 같다.

진행에 앞서 프로젝트 상황을 다음과 같이 가정하겠다.

  1. ssh 방식이 아닌 AWS 서비스를 사용하여 파일을 가져온다.
  2. application.properties 파일을 깃허브에 올리지 않는다,

우선 AWS 서비스에 접근할 수 있어야 하기 때문에 권한을 부여해야 한다.

 

github actions가 S3와 AWS CodeDeploy에 접근하기 위해 해당 권한을 부여한 IAM 사용자 계정을 만들어준다.

 

코드에서 접근해야하기 때문에 프로그래밍 방식 액세스를 해줘야 한다.

 

AWSCodeDeployFullAccess와 AmazonS3FullAccess 권한을 가진 사용자를 생성한다.

 

 

사용자를 생성하고나면 Access key를 생성해야 한다.

 

(Access key 생성 방법은 아래 포스팅 참고)

https://growth-coder.tistory.com/158

 

[AWS][Spring] Amazon Lex 스프링 부트에 배포하기 (2)

https://growth-coder.tistory.com/152 이전 포스팅에서 간단하게 날씨와 미세먼지를 알려주는 Amazon Lex 챗봇을 만들어보았다. 물론 람다를 연결하지 않았기 때문에 실제로 동작하지는 않고 단지 의도를 분

growth-coder.tistory.com

이제 이 Access key를 github secrets에 등록해준다.

 

그리고 application.properties도 github secrets에 등록해줘야 한다.

 

만약 application.properties에 민감한 정보가 담겨있어서 깃허브에 올리지 않는다면 secrets를 통해서 생성해야하기 때문이다.

 

region 정보도 넣어준다.

 

Deploy agent 설치

EC2에 Deploy agent를 설치해야 CodeDeploy를 적용할 수 있다.

 

EC2에 접속하여 다음 명령어를 차례대로 입력한다. 마지막 명령어를 했을 때 running 메시지가 뜨면 성공적으로 설치한 것이다.

sudo yum update
sudo yum install ruby
sudo yum install wget
wget https://bucket-name.s3.region-identifier.amazonaws.com/latest/install
chmod +x ./install
sudo service codedeploy-agent status

(자세한 옵션을 주고 싶으면 다음 링크 참고)

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html

 

Amazon Linux 또는 RHEL용 CodeDeploy 에이전트 설치 - AWS CodeDeploy

앞의 명령에서 /home/ec2-user는 Amazon Linux 또는 RHEL Amazon EC2 인스턴스의 기본 사용자 이름을 나타냅니다. 사용자 지정 AMI를 사용하여 인스턴스를 만든 경우 AMI 소유자가 다른 기본 사용자 이름을 지

docs.aws.amazon.com

그리고 EC2에 역할을 연결해야 한다.

 

IAM -> 역할에서 AmazonEC2RoleforAWSCodeDeploy 권한을 가진 역할을 생성하고 EC2에 연결한다.

CodeDeploy 설정

CodeDeploy -> 애플리케이션 -> 애플리케이션 생성에 들어간다. 컴퓨팅 플랫폼을 EC2로 선택한다.

생성된 애플리케이션에서 배포 그룹을 생성한다.

배포 그룹 이름을 정하고 서비스 역할을 선택한다.

 

EC2에 AmazonEC2RoleforAWSCodeDeploy 권한을 가진 역할이 연결되어야 EC2 인스턴스를 선택할 수 있다. 

현재 위치를 선택하고 태그 그룹에 EC2 인스턴스를 선택한다.

로드 밸런서를 사용하지 않는다면 로드 밸런서 활성화도 풀어주고 배포 그룹을 생성한다.

 

Workflow 작성

Workflow의 과정은 다음과 같다.

 

  1. 환경 세팅을 진행한다.
  2. github secrets에 넣어둔 PROPERTIES 파일로 application.properties를 만들어서 /src/main.resources 아래에 생성한다.
  3. 빌드를 한다.
  4. AWS 인증을 한다.
  5. cicd 디렉토리를 생성한다.
  6. cicd 디렉토리 안에 jar 파일, appspec yml, deploy.sh 파일을 넣고 압축해서 deploy.zip 파일을 만든다.
  7. AWS S3에 이 zip 파일을 복사한다.
  8. code deploy에 배포를 진행한다.
  9. /home/ec2-user/cicd에 압축 파일을 가져온다.
  10. deploy.sh를 실행한다.

 

name: Java CI/CD

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - uses: actions/checkout@v3
      - run: touch ./src/main/resources/application.properties
      - run: echo "${{ secrets.PROPERTIES }}" > ./src/main/resources/application.properties
      - run: cat ./src/main/resources/application.properties
      - name: make gradlew executable
        run: chmod +x ./gradlew

      - name: Build with Gradle
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          arguments: build

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Make dir
        run: mkdir cicd

      - name: Copy jar
        run: cp ./build/libs/*.jar ./cicd

      - name: Copy appspec
        run: cp ./appspec.yml ./cicd

      - name: Copy script
        run: cp ./deploy.sh ./cicd

      - name: Make zip
        run: zip -r -qq -j ./deploy.zip ./cicd
      - run: ls -al

      - name: Upload S3
        run: aws s3 cp --region ${{ secrets.AWS_REGION }} ./deploy.zip s3://ci-cd-test-123/ci-cd/
      - name: Code Deploy
        run: aws deploy create-deployment --application-name cd-test --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name CD --s3-location bucket=ci-cd-test-123,bundleType=zip,key=ci-cd/deploy.zip

 

<deploy.sh>

#!/bin/bash
 CURRENT_PID=$(pgrep -f .jar)
 echo "$CURRENT_PID"
 if [ -z $CURRENT_PID ]; then
         echo "no process"
 else
         echo "kill $CURRENT_PID"
         kill -9 $CURRENT_PID
         sleep 3
 fi

 JAR_PATH="/home/ec2-user/cicd/*.jar"
 echo "jar path : $JAR_PATH"
 chmod +x $JAR_PATH
 nohup java -jar $JAR_PATH >> /home/ec2-user/cicd/deploy.log 2>> /home/ec2-user/cicd/deploy_err.log &
 echo "jar fild deploy success"

<appspec.yml>

version: 0.0
os: linux

files:
  - source:  /
    destination: /home/ec2-user/cicd
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
    - location: deploy.sh
      timeout: 60
      runas: ec2-user

참고

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html

 

Amazon Linux 또는 RHEL용 CodeDeploy 에이전트 설치 - AWS CodeDeploy

앞의 명령에서 /home/ec2-user는 Amazon Linux 또는 RHEL Amazon EC2 인스턴스의 기본 사용자 이름을 나타냅니다. 사용자 지정 AMI를 사용하여 인스턴스를 만든 경우 AMI 소유자가 다른 기본 사용자 이름을 지

docs.aws.amazon.com

 

728x90
반응형

댓글