[CI & CD - Github Actions] with AWS Code Deploy

2023. 4. 9. 15:04·⚙️ Ops/CI & CD
목차
  1. 💡 Github Actions
  2. 동작 과정
  3. 💡 배포
  4. Github Actions 생성 & 설정
  5. gradle.yml 수정
  6. AWS CodeDeploy & 배포그룹 생성
  7. gradle.yml & appspec.yml & deploy.sh 작성
  8. EC2 인스턴스 생성 (Elastic IP 설정)
  9. 보안그룹 포트 오픈
  10. Github SSH Key 등록
  11. EC2 내부 패키지 설치
  12. IAM Role 생성

💡 Github Actions


동작 과정

  • Github Repository 변화 감지 (push 트리거 등)
  • Github Actions 작동
  • Github Actions에서 빌드 결과물 생성
  • S3로 전송 & 저장
  • Github Actions에서 AWS CodeDeploy에 배포 명령
  • CodeDeploy가 EC2에 Deploy & Run

💡 배포

준비사항

  1. Github Actions 생성
  2. S3 버킷 & 정적 웹 호스팅 비활성화 & Public Access 차단 해제
  3. AWS Code Deploy
  4. EC2 생성

Github Actions 생성 & 설정

  • java with gradle -> start commit
  • repo -> settings - secrets/actions -> new repository secret
  • AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY 등록

키 추가 완료

img


gradle.yml 수정

  • Build with Gradle 부분을 설정하여 직접 빌드 방식으로 빌드 진행
name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]

permissions:
  contents: read

env:
  S3_BUCKET_NAME: deploy011-bucket-replicaset

jobs:
  build:

    runs-on: centos

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
    - name: Build with Gradle
      run: ./gradlew build

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

    # build한 후 프로젝트를 압축합니다.
    - name: Make zip file
      run: zip -r ./main.zip .
      shell: bash

    # Access Key와 Secret Access Key를 통해 권한을 확인합니다.
    # 아래 코드에 Access Key와 Secret Key를 직접 작성하지 않습니다.
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옵니다.
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옵니다.
        aws-region: ap-northeast-2

    # 압축한 프로젝트를 S3로 전송합니다.
    - name: Upload to S3
      run: aws s3 cp --region ap-northeast-2 ./main.zip s3://$S3_BUCKET_NAME/main.zip

CI 성공

img


S3로 빌드 결과물 자동 전송 완료

img


AWS CodeDeploy & 배포그룹 생성

CodeDeploy (인스턴스 내에 CodeDeploy-Agent 설치가 되어있어야함)

  • 어플리케이션 - 생성 - 배포그룹 생성
  • IAM & Instance Tag 지정, LoadBalancer 비활성화

어플리케이션 & 배포그룹 생성

img


gradle.yml & appspec.yml & deploy.sh 작성

    # gradle.yml에 추가
    # CodeDeploy에게 배포 명령을 내립니다.
    - name: Code Deploy
      run: >
        aws deploy create-deployment --application-name main
        --deployment-config-name CodeDeployDefault.AllAtOnce
        --deployment-group-name main-group
        --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=main.zip

# appspec.yml

version: 0.0
os: linux
files:
  - source:  /
    destination: /root
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: root
    group: root

hooks:
  ApplicationStart:
    - location: scripts/deploy.sh
      timeout: 60
      runas: root

#!/bin/bash

# deploy.sh

BUILD_JAR=$(ls /root/main/build/libs/main1-0.0.1-SNAPSHOT.jar)
JAR_NAME=$(basename $BUILD_JAR)

echo "> 현재 시간: $(date)" >> /root/main/deploy.log

echo "> build 파일명: $JAR_NAME" >> /root/main/deploy.log

echo "> build 파일 복사" >> /root/main/deploy.log
DEPLOY_PATH=/root/seb41_main_011
cp $BUILD_JAR $DEPLOY_PATH

echo "> 현재 실행중인 애플리케이션 pid 확인" >> /root/main/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)

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


DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포"    >> /root/main/deploy.log
sudo nohup java -jar $DEPLOY_JAR >> /root/main/deploy.log 2>/root/main/deploy_err.log &

EC2 인스턴스 생성 (Elastic IP 설정)

img


보안그룹 포트 오픈

  • 3306 - DB Connection Endpoint
  • 3000 - React Connection Endpoint 1
  • 3001 - React Connection Endpoint 2
  • 8080 - Spring Boot Endpoint
  • 22 - SSH Endpoint
  • 6379 - RDS Endpoint
  • 5000 - Docker Private Registry Endpoint

img


Github SSH Key 등록

img


EC2 내부 패키지 설치


JDK 설치

  • amazon-linux-extra install -y openjdk11


GIT 설치

  • yum -y install git


AWS CLI 설치

  • curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip["](https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip") -o "awscliv2.zip"
  • unzip awscliv2.zip
  • sudo ./aws/install

img


CodeDeploy Agent 설치

  • yum -y update
  • yum -y install gcc (C Compiler)
  • gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
  • curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import - -> import gpg key
  • curl -sSL https://get.rvm.io | bash -s stable (rvm 설치 스크립트)
  • source /etc/profile.d/rvm.sh (시스템 환경변수 & rvm 정보 업데이트)
  • rvm reload
  • rvm requirements run (rvm 의존성 패키지 설치)
  • rvm list known
  • rvm install [version] (2.7)
  • rvm list
  • rvm use [version] --default
  • ruby -v
  • gem install aws-sdk (Ruby용 sdk 설치)
  • wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
  • chmod +x install
  • ./install auto > /tmp/logfile
  • service codedeploy-agent status

Code Deploy Agent 설치

img


IAM Role 생성

  • AmazonS3FullAccess
  • AmazonEC2RoleforAWSCodeDeploy
  • AWSCodeDeployRole
  • AmazonSSMFullAccess
  • AmazonEC2FullAccess
  • IAM Role 과 IAM UserGroup의 태그 연결하기

추가한 정책 목록

img


신뢰정책에 내 리전의 codedeploy 서비스 추가

img


EC2에 IAM Role 연결

img

저작자표시 (새창열림)

'⚙️ Ops > CI & CD' 카테고리의 다른 글

[CI & CD - AWS] 5 - Automated Deployment  (0) 2023.04.16
[CI & CD - AWS] 4 - ELB & Cert & Route53  (0) 2023.04.16
[CI & CD - AWS] 3 - Connect RDS  (0) 2023.04.16
[CI & CD - AWS] 2 - Deploy Client  (0) 2023.04.16
[CI & CD - AWS] 1 - Deploy Server  (0) 2023.04.16
  1. 💡 Github Actions
  2. 동작 과정
  3. 💡 배포
  4. Github Actions 생성 & 설정
  5. gradle.yml 수정
  6. AWS CodeDeploy & 배포그룹 생성
  7. gradle.yml & appspec.yml & deploy.sh 작성
  8. EC2 인스턴스 생성 (Elastic IP 설정)
  9. 보안그룹 포트 오픈
  10. Github SSH Key 등록
  11. EC2 내부 패키지 설치
  12. IAM Role 생성
'⚙️ Ops/CI & CD' 카테고리의 다른 글
  • [CI & CD - AWS] 4 - ELB & Cert & Route53
  • [CI & CD - AWS] 3 - Connect RDS
  • [CI & CD - AWS] 2 - Deploy Client
  • [CI & CD - AWS] 1 - Deploy Server
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      React #Markdown
      GStreamer #Pipeline
      Lock #Thread #Concurrency
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    [CI & CD - Github Actions] with AWS Code Deploy
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.