본문 바로가기
WIKI 기술 지식 베이스

lakeFS의 Actions와 Hooks

원문 보기 위키 갱신

lakeFS를 다루다 보면 진행 과정의 여러 단계에서 특정 검사를 수행해 주면 좋을 때가 있어요. lakeFS의 actions가 어떻게 도움이 되는지 살펴봐요. 커밋 시점에 규칙을 강제하는 액션을 만들고, Lua 훅으로 커밋 메시지와 메타데이터를 검증해 볼 거예요.

출처: 문서

본문

lakeFS와 상호작용할 때, 진행 과정 중간중간 특정 검사가 수행되면 유용할 때가 있어요. lakeFS의 actions가 어떻게 도움이 되는지 살펴봐요.

우리는 etl로 시작하는 모든 브랜치에 커밋이 이뤄질 때 다음 규칙을 강제할 거예요:

  • 커밋 메시지는 비어 있으면 안 돼요

  • job_name과 version 메타데이터가 반드시 있어야 해요

  • version은 숫자여야 해요

이를 위해 action을 만들 거예요. lakeFS에서 액션은 자신을 트리거할 하나 이상의 이벤트를 지정하고, 트리거됐을 때 실행할 하나 이상의 hook를 참조해요. 액션은 lakeFS 저장소의 _lakefs_actions/ 폴더 아래에 쓰여 있는 YAML 파일이에요.

훅은 lakeFS가 직접 실행하는 Lua 스크립트, 외부 웹훅, 또는 Airflow DAG일 수 있어요. 이 예제에서는 Lua 훅을 사용해요.

액션 설정하기

  • lakeFS에서 add_action이라는 새 브랜치를 만드세요. UI로 해도 되고 lakectl로 해도 돼요:
lakectl branch create lakefs://quickstart/add_action --source lakefs://quickstart/main
  • 좋아하는 텍스트 에디터(혹은 emacs)를 열고 다음 YAML을 붙여 넣으세요:
name: Check Commit Message and Metadata
on:
  pre-commit:
    branches:
      - etl**
hooks:
  - id: check_metadata
    type: lua
    properties:
      script: |
          commit_message=action.commit.message
          if commit_message and #commit_message>0 then
              print("✅ The commit message exists and is not empty: " .. commit_message)
          else
              error("\n\n❌ A commit message must be provided")
          end

          job_name=action.commit.metadata["job_name"]
          if job_name == nil then
              error("\n❌ Commit metadata must include job_name")
          else
              print("✅ Commit metadata includes job_name: " .. job_name)
          end

          version=action.commit.metadata["version"]
          if version == nil then
              error("\n❌ Commit metadata must include version")
          else
              print("✅ Commit metadata includes version: " .. version)
              if tonumber(version) then
                  print("✅ Commit metadata version is numeric")
              else
                  error("\n❌ Version metadata must be numeric: " .. version)
              end
          end
  • 이 파일을 /tmp/check_commit_metadata.yml로 저장하세요

  • 다른 곳에 저장해도 되지만, 업로드할 때 아래 경로를 꼭 바꿔 주세요

  • check_commit_metadata.yml 파일을 add_action 브랜치의 _lakefs_actions/ 아래로 업로드하세요. 위와 마찬가지로 UI로 해도 되고(이때 올바른 브랜치를 선택했는지 꼭 확인하세요), lakectl로 해도 돼요:

lakectl fs upload lakefs://quickstart/add_action/_lakefs_actions/check_commit_metadata.yml --source /tmp/check_commit_metadata.yml
  • UI의 Uncommitted Changes 탭으로 가서, 표시된 경로에 새 파일이 보이는지 확인하세요.

Commit Changes를 클릭하고 적절한 메시지를 넣어 이 새 파일을 브랜치에 커밋하세요.

  • 이제 이 새 브랜치를 main으로 머지할 거예요. UI의 Compare 탭에서 main 브랜치와 add_action을 비교하고 Merge를 클릭하세요

액션 테스트하기

액션이 강제할 규칙이 무엇이었는지 다시 상기해 볼게요.

etl로 시작하는 모든 브랜치에 커밋이 이뤄질 때:

  • 커밋 메시지는 비어 있으면 안 돼요

  • job_name과 version 메타데이터가 반드시 있어야 해요

  • version은 숫자여야 해요

etl 패턴에 맞는 브랜치를 하나 만들고, 변경 사항을 커밋해 보면서 액션이 어떻게 동작하는지 확인할 거예요.

  • etl_20230504라는 새 브랜치를 만드세요(필요하면 위의 브랜치 만들기 안내를 참고하세요). 소스 브랜치로 반드시 main을 사용하세요. 새 브랜치에서 아까 만들어 머지한 액션이 보일 거예요:

  • ETL 잡을 흉내 내 보려고 내장 DuckDB 에디터로 SQL을 실행하고, 그 결과를 lakeFS 브랜치에 다시 쓸 거예요. Objects 탭에서 etl_20230504 브랜치의 lakes.parquet 파일을 여세요. SQL 문을 다음으로 바꾸세요:

COPY (
    WITH src AS (
        SELECT lake_name, country, depth_m,
            RANK() OVER ( ORDER BY depth_m DESC) AS lake_rank
        FROM READ_PARQUET('lakefs://quickstart/etl_20230504/lakes.parquet'))
    SELECT * FROM SRC WHERE lake_rank <= 10
) TO 'lakefs://quickstart/etl_20230504/top10_lakes.parquet'
  • UI의 Uncommitted Changes 탭으로 가면, 커밋을 기다리는 top10_lakes.parquet 파일이 생긴 걸 볼 수 있어요.

이제 커밋 규칙을 직접 시험해 보고, 규칙을 어겼을 때 무슨 일이 일어나는지 볼 준비가 됐어요.

  • Commit Changes를 클릭하고 Commit message를 비워 둔 채 확인을 위해 Commit Changes를 클릭하세요. 훅이 실패했기 때문에 커밋이 실패한다는 점에 주목하세요 pre-commit hook aborted 그리고 훅 코드의 출력이 표시돼요 ❌ A commit message must be provided

  • 같은 절차를 반복하되, 이번엔 메시지를 넣어 보세요:

그래도 커밋이 실패해요. 메타데이터도 포함해야 하거든요. 오류가 그걸 알려주고 있죠 ❌ Commit metadata must include job_name

  • Commit Changes 대화상자를 다시 열고 Add Metadata field로 필요한 메타데이터를 추가하세요:

거의 다 왔는데, 그래도 (그래야 하니까) 실패해요. 버전이 완전히 숫자가 아니라 v와 ß가 들어 있거든요: ❌ Version metadata must be numeric: v1.00ß 커밋 시도를 반복하면서 이번엔 버전을 1.00으로 지정해 보세요. 그러면 커밋이 성공하니 기뻐하세요

Action 탭에서 모든 액션 실행 이력을 볼 수 있어요:

← 변경 사항 롤백하기 로컬 환경에서 lakeFS 데이터 다루기 →

더 알아보기 (Learn more)

공식 문서의 자세한 내용은 https://docs.lakefs.io/quickstart/actions-and-hooks/에서 확인하실 수 있어요.