Airflow 구글 스프레드시트 연동

박단이·2024년 1월 3일
0

Airflow

목록 보기
2/2

Airflow는 엔지니어들이 셋업하지만 데이터를 주로 사용하는 사람들은 비개발자(데이터 분석, 영업팀, 마케팅팀 등)인 경우가 많다. 데이터를 개발자, 비개발자는 모두 구글 스프레드시트를 쉽게 사용하고 이 시트에 데이터를 많이 저장하고 관리하기 때문에 이 시트를 Airflow와 연동하는 방법에 대해서 알아보자.

Airflow에 구글 스프레드시트를 연동하기 위해서는 세팅이 필요하다.

  1. 구글 시트 API를 활성화하고 구글 서비스 어카운트를 생성해 그 내용을 담은 JSON 파일을 다운로드 한다.
  2. JSON 파일에서 준 이메일 주소를 Airflow와 공유할 구글 스프레드시트에 공유한다.
  3. Airflow DAG에서 해당 JSON 파일을 사용해 정보를 인증하고 시트를 조작한다.

1) 구글 서비스 어카운트 JSON 파일

  1. 구글 클라우드에 로그인한다.
    https://console.cloud.google.com/
  2. 새로운 프로젝트를 생성한다. 위에 있는 프로젝트 선택 버튼을 누른다. 새로 뜨는 창에서 새 프로젝트를 클릭한다.
    https://console.cloud.google.com/apis/library/sheets.googleapis.com
    JSON 1
  3. 프로젝트 이름을 원하는 이름으로 주고 만들기 버튼을 클릭한다. 위치는 현재 무직이라 아무것도 없으니 선택하지 않아도 된다!
    JSON 2
  4. Google Sheets API 활성화할 수 있는 화면으로 넘어온다. 사용 버튼을 눌러 활성화 시킨다.
    JSON 3
  5. 구글 서비스 어카운트를 만들기 위해 사용자 인증 정보 탭에 들어가서 사용자 인증 정보 만들기를 열고 서비스 계정을 클릭해 들어간다.
    JSON 4
  6. 서비스 계정 이름에 원하는 이름을 작성하면 서비스 계정 ID가 자동으로 생성되고 그 아래에 이메일 주소(빨간 네모)가 생긴다. 이 주소를 사용하는 것!!! 만들고 계속하기 버튼을 클릭해서 다음 단계로 넘어간다.
    JSON 5
  7. 역할에는 편집자를 주고 계속 버튼을 눌러 다음 단계로 넘어간다.
    JSON 6
  8. 3단계에서는 아무것도 작성하지 않고 완료를 눌러 서비스 계정을 생성한다.
    JSON 7
  9. 사용자 인증 정보 탭에 내가 만든 서비스 계정이 있는 것을 확인할 수 있다. 이메일(빨간 네모)을 클릭해서 상세 페이지로 이동한다.
    JSON 8
  10. 탭으로 넘어가 키 추가 버튼을 누르고 새 키 만들기를 눌러 키를 생성한다.
    JSON 9
  11. JSON을 선택하고 만들기 버튼을 누른다. 자동으로 JSON 파일이 저장되고 이 파일을 DAG에 연결해야하므로 이 파일을 잘 저장하고 있어야 한다.
    JSON 10
  12. Airflow > Admin > Varialbes에 들어가서 방금 다운받은 JSON 파일 내용을 value로 하는 key를 만든다.
    JSON 11

여기까지 하면 서비스 계정을 만들고 Airflow에 연결하는 작업까지 끝난 것이다.

2) 이메일을 구글 시트에 공유

이메일은 1)-9 과정에서 만났던 이메일 주소를 copy해서 사용해도 되고 다운로드받은 JSON 파일에서 client_email 키의 값을 copy해서 사용해도 된다.

  1. Airflow에 공유하고 싶은 구글 시트로 이동해서 공유 버틀을 클릭한다.
    공유 1
  2. copy해둔 이메일을 붙여넣고 권한을 부여한다. Airflow에서 값을 읽기만 할 것이라면 뷰어, 수정까지 할 것이라면 편집자로 세팅한다.
    이메일은 보낼 필요가 없기 때문에 이메일 알림 보내기 체크를 해제했지만 사실 아무 상관 없다.
    공유 2

이제 설정한 구글 시트는 아까 JSON 파일 내용을 Variables로 저장한 Airflow에서 사용할 수 있다.

3) Airflow DAG에서 연동

Airflow DAG에서 사용하기 위해 설정을 해줘야한다.
JSON 파일의 내용은 기밀사항이기 때문에 Docker Image안에 저장해서 옮길 수 없기 때문에 Variables를 사용하여 해당 구글 시트에 접속할 때마다 JSON 파일을 생성하여 사용한다.

from airflow.models import Variable
from oauth2client.service_account import ServiceAccountCredentials
import gspread

# data를 저장하고 불러올 경로
data_dir = Variable.get("DATA_DIR")
# 구글시트 인증 json 파일을 만들기 위한 경로
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
gs_json_file_path = data_dir + 'google-sheet.json'
# JSON 생성 
write_variable_to_local_file('google_sheet_access_token', gs_json_file_path)
    
# JSON 파일을 사용하여 구글 시트에 접속 인증
credentials = ServiceAccountCredentials.from_json_keyfile_name(gs_json_file_path, scope)
gc = gspread.authorize(credentials)

위의 3개의 과정을 거쳐서 구글 시트와 airflow dag를 연동해서 사용할 수 있도록 세팅을 했다.
Dag의 내용은 자신이 원하는 대로 python operator와 helper 함수를 작성하여 사용하면 된다.

예1) 구글 시트 -> Redshift

  1. 시트의 내용을 csv로 copy해서 local repository에 저장한다.
  2. csv를 S3에 업로드한다.
  3. S3의 csv 파일을 Redshift로 bulk update한다.

예2) Redshift -> 구글 시트

  1. reshift의 데이터를 pandas의 dataframe 형태로 받는다.
  2. 데이터를 넣을 sheet의 내용를 clear한다.
  3. dataframe의 데이터를 sheet에 넣는다.

예시 처럼 원하는 방식을 만들어서 그대로 구현하여 사용하면 완료!

profile
데이터 엔지니어를 꿈꾸는 주니어 입니다!

0개의 댓글