이노베이션 캠프

[TIL] 32일차

hjkim0502 2022. 9. 2. 00:05

팀과제를 잘 마무리하고 배포까지 기분좋게 끝냈다. 다음 주차부터는 또 새로운 사람들과 프론트까지 묶여서 협업하게 될텐데, 기대반 걱정반인 것 같다.

 

1. JAVA InputStream

  • Stream: 외부의 데이터가 입력/출력되는 통로
    • InputStream(입력 통로), OutputStream(출력 통로)
    • 둘은 추상 클래스로서 추상 메소드를 오버라이딩해서 다양한 역할을 수행한다
  • 과제에서 요청으로 multipartfile을 받아서 InputStream 객체로 변환한 것을 AwsS3Client 객체가 S3에 저장해주었었다

https://bamdule.tistory.com/179

 

2. Github Actions

  • 이 기능을 이용해 자동 배포하라는 요구사항이 있었어서 공부해보았다
  • CI(Continous Integration), CD(Continuous Deployment)을 위한 서비스
  • repo에서 발생하는 특정 이벤트에 대해 특정 작업을 자동으로 진행해주거나, 반복적으로 어떤 작업을 하도록 설정할 수 있다
    • 예: PR 생성 시 자동 검사, main에 푸시가 오면 자동 배포, 특정 시각에 하루 통계 데이터 수집 등
  • 사람이 하기에 비효율적이고 실수할 가능성이 있는 이러한 작업들에 대해 자동으로 도와주는 서비스이다

Workflows

  • repo의 .github/workflows 폴더 아래에 yml파일로 설정하며, 한 repo에 여러 파일이 존재할 수 있음
  • on: 어떤 상황에서 특정 작업을 수행할 것인지
  • jobs: 그 상황에서 어떤 작업을 수행할 것인지
    • runs-on: 필수 속성, 실행 환경 지정
    • steps: 순서가 필요한 작업에 순서 지정
      • run: 커맨드스크립트 실행
      • uses: 액션 사용
      • YAML 문법에서 시퀀스 타입을 사용하기 때문에 각 단계 앞에 '-' 꼭 붙혀야 함
// 푸시 이벤트 발생 시
on:
  push:
    branches:
      - main

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm install
      - run: npm test
  job2:
    # job2에 대한 세부 내용
  job3:
    # job3에 대한 세부 내용

 

// 스케줄링 된 작업 시
on:
  schedule:
  - cron: "0 0 * * *"
  • Actions: Github Actions에서 빈번하게 필요한 반복 단계를 재사용하기 용이하게 만들어 놓은 것
    • 하나의 repo 안에 여러 workflow에 공유 및 여러 repo에서 공유 가능
    • 예) actions/checkout

https://www.daleseo.com/github-actions-basics/

 

 

3. Github Actions CD

  • EC2에 Spring Boot 프로그램을 배포해보았다
  • main 브랜치에 푸시하면 자동으로 EC2까지 배포되는 Workflow이다
  • 이전에 파일질라를 이용해서 EC2에 복사하고 Git Bash SSH로 접속해 서버를 실행했던 것과 다른 방식이다

1. EC2 인스턴스 생성

 

2. 탄력적 IP: EC2 인스턴스가 서버를 중지하고 재실행하면 퍼블릭 IP가 계속 바뀌기 때문에 변하지 않는 IP로 만들어줌

 

3. SSH 클라이언트로 서버 접속: SSH config 파일 생성하여 호스트를 등록해 쉽게 로그인 할 수 있게 처리

 

4. EC2 보안 그룹 설정: 인스턴스와 별개로 생성하여 다른 인스턴스에도 바로 적용 가능

  • 인바운드(외부 -> 내부 접근), 아웃바운드(내부 -> 외부 접근)

https://bcp0109.tistory.com/356

 

5. EC2 태그 추가: CodeDeploy 생성 시 어떤 인스턴스에서 수행할 지 구분하기 위함

 

6. IAM 역할 추가: EC2 인스턴스에서 S3에 저장된 파일에 접근가능하게 하기 위함

 

7. CodeDeploy Agent 설치

 

8. AWS S3 생성: 빌드한 프로젝트 코드를 압축해서 S3에 저장한 후 EC2에서 이 압축파일을 읽어옴

 

9. CodeDeploy 생성: 배포를 도와주는 CodeDeploy 생성 및 설정

 

10. CodeDeploy 전용 IAM 역할 추가

 

11. Github Actions에서 사용할 IAM 사용자 추가: Github Actions 워크플로우에서 AWS에 접근하기 위함

 

12. appspec.yml 파일 생성: 프로젝트 루트 디렉토리에 위치하며 CodeDeploy가 배포를 위해 참조하는 파일

 

13. 배포 스크립트 작성: appspec 파일에서 지정한 위치에 저장하며, appspec 파일에서 실행할 스크립트 파일이다

  • 맨위 #!/bin/bash 로 설정 및 jar 파일명 주의 (주의 필요없음)

14. build.gradle 파일 수정: -plain.jar 파일은 만들어지지 않도록 설정 추가

 

15. Github Actions Workflow 작성: 프로젝트 빌드 -> AWS S3에 저장 -> CodeDeploy가 AWS EC2에 배포

https://bcp0109.tistory.com/363

많은 시행착오 끝에 배포에 성공해서 매우 뿌듯했다 ㅎ.ㅎ