GitHub Actions와 AWS S3를 결합하여 CI/CD 파이프라인을 구축하는법

jsonLee·2023년 9월 5일
1
post-thumbnail

개발자로서 코드의 변경사항을 신속하게 라이브 환경에 반영하는 것은 중요합니다. GitHub Actions와 AWS S3를 활용하면 쉽고 빠르게 CI/CD 파이프라인을 구축할 수 있습니다. 이 포스팅에서는 그 방법을 자세히 알아보겠습니다.

1. AWS S3 버킷 생성 및 정적 사이트 호스팅 설정하기

1.1 버킷 생성하기

  • 로그인: AWS Management Console에 로그인

  • S3로 이동: 서비스 목록에서 S3를 선택.

  • 버킷 생성: '버킷 생성' 버튼을 클릭하여 이름과 리전을 설정합니다.

  • 버킷 생성 시 '퍼블릭 엑세스 차단' 옵션을 해제합니다. (이로써 모든 사용자가 호스팅된 파일에 접근할 수 있게 됩니다.)

1.2 정적 웹 사이트 호스팅 설정

  • 생성한 버킷을 클릭하고 '객체' 탭으로 이동합니다
  • 빌드된 파일을 업로드 합니다(build폴더를 업로드 하면 안되고 빌드 폴더 안에 있는 파일을 업로드 해야한다)
  • '속성' 탭으로 이동합니다.

  • 맨아래 '정적 웹 사이트 호스팅' 옵션을 선택하고, '활성화'을 선택합니다.

  • 인덱스 문서와 오류 문서 이름을 입력하고 저장합니다.

1.3 버킷 권한 설정하기

버킷의 보안 및 접근 권한을 적절히 설정하는 것은 중요합니다. 이를 통해 누가 버킷에 접근하고, 어떤 작업을 수행할 수 있는지를 제어할 수 있습니다.

  • 버킷 접근 권한 설정: 생성한 버킷을 클릭하고 '권한' 탭으로 이동합니다.

  • ACL(Access Control Lists): 여기서 객체의 접근 권한을 세부적으로 설정할 수 있습니다. 일반적으로는 기본 설정을 유지하는 것이 안전합니다.

  • 버킷 정책: 버킷에 대한 액세스 권한을 지정하기 위해 사용되는 JSON 문서입니다. 예를 들어, 특정 IP에서만 접근을 허용하는 정책을 설정할 수 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<bucket-name>/*"
        }
    ]
}

  • CORS(Cross-Origin Resource Sharing) 설정: 필요한 경우, 다른 도메인에서 이 버킷의 리소스에 접근할 수 있도록 CORS를 설정할 수 있습니다.

2. GitHub Actions의 이해

GitHub Actions는 코드를 자동으로 빌드, 테스트, 배포하는 작업을 자동화하는 도구입니다.

2.1 작동 원리

  • GitHub 저장소에서 이벤트(예: push, pull request)가 발생하면 지정된 workflow가 시작됩니다.
  • 각 job은 별도의 러너에서 동시에 실행됩니다.
  • 모든 step과 action은 순차적으로 실행됩니다.

2.2 주요 용어와 개념

출처: GitHub Actions 공식문서(https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions)

  1. Workflow

    • Workflow: 하나 이상의 job으로 구성된 자동화된 절차입니다.
    • GitHun Actions상에서 실행될 자동화된 일련의 작업 흐름을 의미합니다. YAML 형식의 파일을 통해서 Workflow를 설정할 수 있습니다.
    • 레파지토리 안에서 발생하는 이벤트나 예약된 스케줄에 의해서 실행될 수 있으며, 직접 수동으로 실행하는 것 또한 허용됩니다.
  2. Event

    • 레파지토리에서 발생하는 push, pull request open, issue open등의 특정한 활동을 의미합니다.
    • GitHub Actions에서는 특정한 Event가 발생했을 시 그에 맞는 CI/CD 파이프라인을 구동하도록 설정할 수 있습니다.
  3. Jobs

    • 하나의 runner에서 실행될 여러 step의 모음을 의미합니다.
    • 하나의 workflow안에 여러 job들을 설정할 수 있습니다.
    • workflow의 job은 별도의 러너에서 동시에 실행됩니다.
    • 일부 job의 경우에는 다른 job에 의존성을 설정해서 다른 job이 완료되고 난 뒤 실행하도록 할 수 있습니다.
  4. Step

    • 개별 실행 명령입니다.
    • step은 실행가능한 하나의 shell script 또는 action을 의미합니다.ex) npm run test, npm ci(install)
    • job안의 step들은 순차적으로 실행됩니다.
  5. Actions

    • GitHub Workflow에서 자주 사용되는 기능들을 모아둔 일종의 커스텀 애플리케이션입니다.
    • 설정파일에서 use 키워드와 함께 사용할 수 있으며 브랜치로 체크아웃하고, 환경을 설정하는 등 복잡하지만 자주 사용되는 과정들을 미리 정의해두고 편리하게 활용할 수 있습니다.
    • GitHub Marketplace에서 Action들을 검색하고 활용할 수 있습니다.
  6. Runner

3. GitHub Actions Workflow 작성하기

3.1 기본 구조

Workflow는 YAML 형식의 파일로 .github/workflows 디렉터리에 저장됩니다. 예: main.yml.


name: CI/CD Pipeline

on:
  push:
    branches:
      - main
    repositories:
      - upstream/repository-name
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Install dependencies
      run: npm ci
      
	- name: Test
      run: npm run test

    - name: Build
      run: npm run build

3.2 AWS S3로 배포하기
AWS CLI를 사용하여 빌드 결과물을 S3에 업로드할 수 있습니다.

    - name: deploy to s3
      uses: jakejarvis/s3-sync-action@master
      with:
        args: --delete
      env:
        AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_REGION: 'ap-northeast-2'
        SOURCE_DIR: 'build'
  • 이때, AWS 인증 정보는 GitHub Secrets에 안전하게 저장하고 사용합니다.

  • --delete 옵션은 이전 배포되어있는 파일을 삭제하고 다시올리는 작업입니다.

profile
풀스택 개발자

5개의 댓글

comment-user-thumbnail
2023년 9월 21일

선생님 깃허브가 안보여서 그런데 괜찮다면 팔로우 해주십셩. 종종 구경가고 싶습니당
https://github.com/pengooseDev

답글 달기
comment-user-thumbnail
2023년 10월 11일

I have to press two of them initially, followed by the third or fourth key.

답글 달기
comment-user-thumbnail
2023년 10월 11일

I have to press two of them initially, followed by the third or fourth key.

답글 달기
comment-user-thumbnail
2023년 10월 11일

I have to press two of them initially, followed by the third or fourth key.

답글 달기
comment-user-thumbnail
2023년 10월 11일

I have to press two of them initially, followed by the third or fourth key.

답글 달기