본문 바로가기
DevOps/CI CD

[DataOps/GCP] GitHub Actions를 사용해 Composer에 CI/CD 파이프라인 구성하기

by 달구우우우우 2023. 12. 9.
반응형

🗂️ GitHub Actions란?

GitHub Actions는 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼입니다. 이름에서 파악되는 것처럼 GitHub Actions은 GitHub에서 제공하는 플랫폼입니다. GitHub Actions는 GitHub에서 제공하는 만큼 리포지토리 접근성이 좋습니다. 이런 장점으로 GitHub Actions은 진입 장벽이 낮아 배포 환경을 구현할 때 많이 사용하는 환경입니다.

 

더 설명하면, GitHub Actions는 워크플로를 구성하여 사용합니다. 워크플로는 리포지토리에 대한 요청에 따라서 실제 코드를 테스트 환경 혹은 프로덕션 환경에 반영하는 등의 역할을 수행합니다. 워크플로는 Linux, Windows와 같은 운영 체제의 가상 머신을 제공받아 동작합니다. 또한 AWS, GCP와 같은 클라우드 서비스나 온프레미스 환경에도 쉽게 호스팅 할 수 있어 다양한 환경에 맞춰 구성할 수 있는 장점이 있습니다.

 

(GitHub Actions와 관련하여 자세한 내용은 아래 문서를 참고하세요.)

https://docs.github.com/ko/actions/learn-github-actions/understanding-github-actions

 

GitHub Actions 이해 - GitHub Docs

GitHub Actions is a continuous integration and continuous delivery (CI/CD) platform that allows you to automate your build, test, and deployment pipeline. You can create workflows that build and test every pull request to your repository, or deploy merged

docs.github.com

 

💡 Composer란?

그럼 Composer는 무엇일까요? Cloud Composer(이하 Composer)는 GCP(구글 클라우드 플랫폼)에서 운영하는 서비스입니다. GCP 공식 문서에서는 Composer를 워크플로 파이프라인을 생성, 예약, 모니터링, 관리할 수 있는 완전 관리형 워크플로 조정 서비스라고 소개합니다. Composer는 Airflow라는 오픈소스를 기반으로 구성합니다. 따라서 Python 프로그래밍 언어로 작동하는 특징이 있습니다.

 

(Composer와 관련해 자세한 내용은 아래 공식 문서를 참고하세요.)

https://cloud.google.com/composer/docs/concepts/overview?hl=ko

 

Cloud Composer 개요  |  Google Cloud

의견 보내기 Cloud Composer 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Cloud Composer 1 | Cloud Composer 2 Cloud Composer는 클라우드 및 온프레미스 데이터 센

cloud.google.com

 

🔍 Composer에 배포 파이프라인을 구성해야 하는 이유?

그렇다면, Composer에 왜 배포 파이프라인을 구성해야 할까요?. Composer 역시 Airflow 오픈소스를 기반으로 구성했기 때문에 UI 및 사용 방식도 Airflow와 동일합니다. 따라서 Airflow와 마찬가지로 DAG(Directed Acyclic Graph)를 사용하고 이를 Python 코드로 정의합니다. 따라서 Composer를 운영하기 위해선 Python 코드로 DAG를 작성해야 합니다. 또한 DAG 외에 Composer를 효율적으로 사용하기 위한 유틸성 코드 등도 포함될 수 있기 때문에 코드를 관리할 필요가 있습니다. 앞서 말한 이유로 Composer를 더욱 안전하게 사용하기 위해선 배포 파이프라인을 구성해야 합니다.

 

🔨 Composer 환경 간단하게 파악하기

GitHub Actions CI/CD를 구성하기 전에 Composer 구성에 대해 조금 살펴볼 필요가 있습니다. 먼저 Composer를 자신의 환경에 맞게 구성하면 아래와 같이 환경이 세팅된 것을 볼 수 있습니다.

Composer 초기 화면

위 이미지의 DAG 폴더 열기를 눌러 살펴보면 아래와 같이 GCS(Google Cloud Storage) 안에 Python 파일이 있는 것을 확인할 수 있습니다.

Cloud Storage에 구성된 Composer DAG 폴더(버킷 ID 모자이크 처리)

Composer DAG 폴더 열기를 눌렀을 때 GCS로 이동하는 것을 보면 다음을 유추할 수 있습니다. 먼저 Composer 환경을 구성하면 GCS 버킷을 하나 생성한다는 것입니다. 두 번째는 Composer는 해당 버킷과 마운트 된다는 걸 알 수 있습니다. 마지막으로 DAG 구성하기 위해선 해당 버킷에 코드를 작성해야 된다는 것입니다.

 

🪛 GitHub Actions 구성하기

위에서 대략적으로 Composer 구성을 보면서 우리는 힌트가 생겼습니다. Composer와 관련된 코드는 해당 버킷을 통해 관리할 수 있도록 설계됐다는 점입니다. 따라서 Composer 환경을 생성할 때 같이 만들어진 버킷에 CI/CD 구성을 하면 된다는 걸 알 수 있습니다.

 

CI/CD 구성은 앞서 소개한 GitHub Actions를 사용합니다. GitHub Actions는 위에서 언급했듯이 리포지토리에 대한 요청(트리거)을 수행하는 워크플로를 작성하여 사용할 수 있습니다. 그럼 어떻게 구성하면 될까요? 이해를 돕기 위해 GitHub 공식 문서 예시를 캡처하여 가져왔습니다.

GitHub Docs GitHub Actions 이해

이미지 내용에 따르면, 먼저 리포지토리에 워크플로를 저장할 .github/workflows/ 디렉터리를 생성합니다. 다음 단계로 .yml 파일을 생성하고 예시 코드를 작성합니다. 마지막으로 GitHub 리포지토리에 푸시합니다. GitHub Actions의 워크플로를 구성하려면, 사용할 리포지토리에 언급한 3가지 단계를 따르면 됩니다. 단 여기서 우리는 예제 코드가 아닌, Composer 버킷에 관한 워크플로를 작성하면 됩니다.

 

본론으로 들어가기 전 아래 링크를 참고합니다.

https://github.com/marketplace/actions/set-up-gcloud-cloud-sdk-environment

 

Set up gcloud Cloud SDK environment - GitHub Marketplace

Downloads, installs, and configures a Google Cloud SDK environment. Adds the `gcloud` CLI command to the $PATH

github.com

해당 링크를 간략히 설명하면, GitHub Actions 환경에서 Google Cloud SDK 구성에 대한 내용입니다. Google Cloud SDK를 구성하면 GitHub Actions 환경에서 gcloud  gsutil 등의 GCP 관련 명령어를 사용할 수 있게 됩니다.

 

하지만 SDK를 구성하고 활용하려면 먼저 인증이 필요합니다. 클라우드 서비스에서 제공하는 명령어를 사용하기 위해선 인증이 필요한데, GitHub Actions 역시 인증 과정이 필요합니다. 인증과 관련해서 여러 방법이 있지만, 저의 경우 인증과 관련한 서비스 계정이 직접 워크플로 코드에 기재되는 것이 안 좋다고 판단하여 서비스 계정을 발급하고, JSON 키를 통해 인증하는 방식을 선택했습니다. 해당 방식을 사용하는 과정은 아래와 같습니다.

 

먼저 GCP의 IAM 및 관리자 항목으로 들어가 서비스 계정을 만듭니다.

GCP IAM 및 관리자 서비스 계정 생성

서비스 계정 생성이 완료되면, 뒤에서 사용하기 위해 생성한 서비스 계정에 저장소(GCS)에 관한 권한을 미리 부여합니다. 키를 생성하면 JSON 파일로 키가 발급됩니다.

 

다시 GitHub로 돌아가 워크플로를 작성한 리포지토리의 설정으로 들어갑니다. 설정에선 아래 이미지와 리포지토리와 관련된 시크릿을 생성할 수 있는데, 여기서 발급받은 JSON 파일 값을 작성하여 저장합니다.

GitHub 리포지토리 세팅 화면

시크릿까지 구성이 완료되면 Google SDK를 사용하기 위한 준비는 모두 완료됩니다. 이제 본격적으로 활용하기 위해 문서에서 예시로 제공한 워크플로 코드를 살펴봅니다.

job:
  job_id:
    steps:
    - id: 'auth'
      uses: 'google-github-actions/auth@v1'
      with:
        credentials_json: '${{ secrets.GCP_CREDENTIALS }}'

    - name: 'Set up Cloud SDK'
      uses: 'google-github-actions/setup-gcloud@v1'

    - name: 'Use gcloud CLI'
      run: 'gcloud info'

steps를 살펴보면 인증, SDK 셋업, gcloud CLI 사용 3가지의 단계를 확인할 수 있습니다. 여기서 응용할 부분은 마지막 부분입니다. SDK를 구성하면, 해당 워크플로는 인증에 사용된 서비스 계정에게 주어진 권한 안에서의 명령을 수행할 수 있게 됩니다. 앞서 버킷과 관련한 권한을 해당 서비스 계정에 미리 부여했기 때문에 바로 저장소와 관련된 명령어를 실행할 수 있게 됩니다. 여기서 사용할 명령어는 gsutil rsync 명령어입니다. 해당 명령어에 대한 설명은 아래 링크를 참고하면 됩니다. https://cloud.google.com/storage/docs/gsutil/commands/rsync

 

rsync - Synchronize content of two buckets/directories  |  Cloud Storage  |  Google Cloud

Send feedback Stay organized with collections Save and categorize content based on your preferences. rsync - Synchronize content of two buckets/directories Important: gsutil is not the recommended CLI for Cloud Storage. Use gcloud storage commands in the G

cloud.google.com

위 과정을 거치면 아래와 같이 워크플로를 작성할 수 있습니다.

name: Google Composer Deploy

on:
  push:
    branches:
    - prod

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2
      with:
        ref: prod

    - name: Google Cloud Auth
      uses: google-github-actions/auth@v1
      with:
        credentials_json: ${{ secrets.GCS_SERVICE_ACCOUNT_KEY }}

    - name: Google Cloud SDK
      uses: google-github-actions/setup-gcloud@v1

    - name: Google Composer Deploy
      run: |
        gsutil -m rsync -r dags gs://your-bucket/dags

 

위 코드를 대략 설명하면 이렇습니다. 먼저 브랜치를 체크합니다. 조건에 맞는 브랜치에 푸시가 되면, 우분투 기반의 가상 환경이 구성됩니다. 이후 Google SDK 구성을 위한 인증 절차 및 셋업 과정을 거칩니다. 마지막으로 gsutil rsync 명령어를 통해 리포지토리의 dags 디렉터리를 Composer와 함께 구성된 버킷에 동기화합니다.

 

🏝️ 마무리하며

실제로 구성 자체는 크게 어려운 부분은 없습니다. 다만 GitHub나 GCP 혹은 Composer와 같은 환경에 대해 익숙하지 않거나 이해가 부족하면, 조금 헤맬 수 있습니다. 이 글이 환경을 이해하는 과정에 도움을 주고, 실질적인 액션에도 도움이 되면 좋겠습니다.

반응형