본문 바로가기
Cloud/AWS

AWS 람다에서 python으로 구글 시트 데이터 쓰기

by 크라크라 2025. 2. 16.

 2025년 2월 기준으로 사용가능한 방법을 작성하였습니다.

라이브러리 변경 등에 의해서, 실제로 사용 가능한 라이브러리나 함수는 변동될 수 있습니다. 

 

 간혹, 프로그램 수준에서 구글독을 다루기 위한 수요가 있습니다.

저의 경우에는 데이터를 aws 바깥으로 빼내어서 구글 엑셀 시트에 데이터를 옮기려는 용도로 사용하였습니다. 

 

 

작업 순서는 다음과 같습니다. 

1. 구글 API 설정 

2. python 라이브러리 람다에 추가 ( python3.13 기준)

3. 람다 작성 ( + 1에서 설정한 파일을 업로드)

4. 권한 설정

 


 

1. 구글 API 설정 

 

 (1) 구글 계정을 준비합니다.

 (2) Google Cloud Console ( https://console.cloud.google.com/ ) 에 로그인합니다. 

 (3) 프로젝트를 생성합니다. ( 이미 생성되어있으면 패스하면 됩니다.) 

 

 로그인 된 콘솔 화면에서 좌측 상단의 "프로젝트 선택" 버튼을 클릭합니다.  

 

 프로젝트 선택 창의 우측 상단의 "새 프로젝트" 버튼을 누릅니다.

만약 조직 계정이라면, 별도의 조직에 속해야지만 프로젝트가 생성 가능합니다. 개인 계정이라면 조직 없음 하위에 신규 프로젝트 생성이 가능합니다. 

 

 

 

만약 조직 계정이라면, 별도의 조직에 속해야지만 프로젝트가 생성 가능합니다. 개인 계정이라면 조직 없음 하위에 신규 프로젝트 생성이 가능합니다. 

 

 * 왼쪽은 개인 계정인 경우로 "위치" 없이 바로 생성 가능하고, 오른쪽은 조직 계정이라서 "위치" 설정이 필수입니다.   

자세한 건 조직 계정 관리자에게 문의하세요~ 

 

정상적으로 프로젝트가 생성되었다면, 바로 프로젝트 화면으로 전환이 될 것입니다. 

좌측 상단에 프로젝트 명이 "GoogleSheetTest" 로 변경된 것을 확인할 수 있습니다. 

(4) Google Sheets API를 사용가능하도록 설정합니다. 

 

 * 화면 상단의 검색 창에 " Google Sheets API" 를 검색합니다. 

 * 클릭 후  사용 버튼을 눌러줍니다.

 

(5) 사용자 인증정보를 생성합니다. 

 

Google Sheets API 를 사용 설정하고 나면, 우측 상단에  "사용자 인증 정보 만들기" 버튼이 활성화 될 것입니다. 

이것까지 다 생성해줘야만 제대로 호출해서 사용할 수 있습니다. 

 

만들기 화면에서 애플리케이션 데이터를 선택한 후 다음 버튼을 누릅니다.

 

서비스 계정을 새로 만들어야하므로, 필요한 계정명을 입력해봅시다. 이상한 값을 입력하면, 구글이 알아서 데이터를 생성해줍니다. google-sheet-test 라는 계정을 하나 만들었습니다. 완료버튼을 누릅니다. 

 

 완료 버튼을 누르면 API 세부정보 화면으로 리다이렉트됩니다.  좌측의 "사용자 인증 정보"를 눌러봅니다. 

그럼 제가 만든 계정을 확인할 수 있습니다.

 

 

계정을 클릭하면 세부정보 설정으로 들어갈 수 있습니다.

그 중에서 다시 "" 를 눌러보면 다음 화면이 보입니다.

 

화면 하단의 "키추가" 버튼을 눌러서 새로 생성해줍니다. 형식은 json 을 선택하면 됩니다. 

그럼 바로 json 파일이 생성됩니다. 

 

해당 파일을 열어보면 다음과 같은 내용이 있습니다.

{
  "type": "service_account",
  "project_id": "xxxxxxxxxx",
  "private_key_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "client_email": "google-sheet-test@xxxxxxxxxxxxx.iam.gserviceaccount.com",
  "client_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-sheet-test%xxxxxxxxxxxxxxx.iam.gserviceaccount.com",
  "universe_domain": "googleapis.com"
}

 

다운받은 파일명은 "credentials.json" 으로 바꿔줍시다. 

이제 구글 클라우드 설정은 끝났습니다. 

 

 

 

2. python 라이브러리 람다에 추가

 

 기본적으로 AWS 람다에서 지원하는 파이썬 라이브러리 중에서 구글 독을 바로 지원하진 않습니다.

필요한 python 라이브러리를 추가로 업로드해야합니다. 

가장 간단한 방식으로 사용하기 위해서는 라이브러리 3개를 받아주면 됩니다.

 

(1) 폴더를 따로 만들어주고 파이썬 라이브러리 파일을 내려받습니다.

pip3 install google-auth google-auth-oauthlib gspread -t .

 

(2) 그리고 해당 파일을 python.zip 으로 압축하고, 람다 레이어에 추가합니다. 

 

* Lambda -> 계층 (Layer) -> 계층 생성을 눌러서 진행합니다. 

* 이름과 호환 아키텍처, 호환 런타임을 선택하고 python.zip 파일을 선택해서 업로드 후 생성 버튼을 누르면 됩니다. 

 

3. 람다 작성 ( + 1에서 설정한 파일을 업로드)

 

 이제 람다 파일을 작성해봅시다. 

 

 (1) credentials.json 파일 추가

 * 람다 화면 좌측에 credentials.json 파일을 만들고, 아까 다운받은 파일을 복사한 후 저장합니다.

 

 

 (2) 레이어 추가

 레이어는 람다 함수 하단으로 쭉 내려가보면 "계층" 이라는 영역이 있습니다. 여기에서 Add a Layer 버튼을 눌러주면 다음 화면이 나옵니다. 

사용자 지정 계층을 선택하고, 아까 만든 레이어 및 버전을 선택한 후 추가 버튼을 눌러줍시다. 

 

 (3) 코드 작성

 

구글 드라이브의 엑셀 파일 ID 와 시트명을 지정한 뒤에 credentials.json 파일의 계정정보를 이용해 로그인 한 뒤에 RawData 라는 시트에 데이터 한 줄을 람다가 대신 써주는 코드입니다.

보안 때문에 엑셀 파일 ID는 환경변수로 지정했습니다. 

환경 변수 지정 역시 좌측의 "Environment Varaibles" 영역에서 추가하면 됩니다. 

귀찮다면 아래 코드의 os.environ.get 부분을 제거하고, 바로 원하는 파일 ID를  선택하면 되겠습니다. 

 

SPREADSHEET_ID 에 들어갈 ID는 구글 드라이브에서 프로그램에서 접근하길 원하는 엑셀 파일을 눌렀을 때의 주소창에서 spreadsheets/d 와 edit 사이 부분입니다. 


https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit?gid=0#gid=0

 

import json
import gspread
import os
from google.oauth2.service_account import Credentials
from boto3.dynamodb.conditions import Key, Attr

# Google Sheets 설정
# 환경변수 읽기
SPREADSHEET_ID = os.environ.get("SPREADSHEET_ID")
SHEET_NAME = "RawData"

# 서비스 계정 인증
def get_google_sheet():
    scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
    creds = Credentials.from_service_account_file("credentials.json", scopes=scope)
    client = gspread.authorize(creds)
    return client.open_by_key(SPREADSHEET_ID).worksheet(SHEET_NAME)



def lambda_handler(event, context):
    print(event)

    sheet = get_google_sheet()
    data = ['A1', 'I am Student','399']  # 추가할 데이터            
    sheet.append_row(data)  # 마지막 행에 추가
    
    return {
        "statusCode": 200,
        "body": "Data written successfully!"
    }

 

4. 권한 설정

 

여기까지 잘 따라하신 뒤에 실행을 해보시면 함수 실행 시에 권한 에러 (Permission Error) 가 뜰 것입니다. 

아직, 구글 클라우드에서 설정한 서비스 계정 정보를 구글 독에 추가하지 않았기 때문입니다. 

 

(1) credentials.json 파일을 열고, client_email 옆의 값을 복사합니다. 

(2) 구글 드라이브로 가서 우측 상단의 "공유" 버튼을 클릭합니다.

(3) 공유 버튼을 누른 후 , 사용자 추가 창에 복사한 client_email 값을 편집자 권한을 주어서 추가합니다. 

(4) 그럼 이제 함수를 다시 실행해보면 WorkSheetNotFound 에러가 뜰 것입니다. 

     에러 없이 실행하기 위해서는 RawData 라는 시트를 하나 생성해줘야합니다. (생성 역시 소스코드로 할 수 있습니다.)

(5) RawData 시트 생성 후 함수를 재실행을 해봅시다. 

    아래처럼 처음 한 줄의 데이터가 추가된 것을 볼 수 있습니다. 

 

 

 

여기까지 따라오느라 고생하셨습니다. 

 

다음에는 조금 더 복잡한 내용을 다뤄보도록 하겠습니다. 

 

 

 

 

댓글