Serverless frame work에서 Snowflak 터치

이거 뭐야?


이 글은 Snowflake Advent Calendar 2021 넷째 날의 글이다.
↑ 기사를 쓸 사람을 모집하고 있는 것 같으니 꼭 참석해 주세요!
혹시 AWS Lambda에서 Snowflak에 가끔 문의하고 싶으신가요?
나는 업무에서 측정계의 통지 등의 운용용도로 자주 쓰인다.
간단하게 조회를 수행하고 싶다면, 스노우 빌리지 촌장이 쓴 Lambda에서 Snowflak으로 연결하고 싶어요!이 가장 이용하기 쉬운 방법이라고 생각합니다!
https://qiita.com/foursue/items/394f39786693ee362fef
이번엔 촌장 기사에서 구상을 얻어 Serverless Framework를 활용해 람바다부터 스노우플랙까지 연결이 가능한지 시험해보자.

할 일


우선 Serverless Framework에서 파이톤용 Snowflake 커넥터를 사용할 수 있도록 다양한 설정을 한다.
serverless create --template aws-python3 --name snowflake-lambda
sls plugin install -n serverless-python-requirements
pipenv --python 3.8
pipenv shell
pipenv install "snowflake-connector-python[pandas]"
pipenv lock -r > requirements.txt
serverless-python-requirements는 파이톤의 외부 모듈을 zip화한 플러그인입니다.Serverless.yml에는 다음과 같은 내용이 추가됐다.
Serverless.yml
custom:
  pythonRequirements:
    dockerizePip: true

plugins:
  - serverless-python-requirements
또 이번에는 Snowflake 데이터를 판다스 DataFrame에 저장할 수 있는 파이썬 커넥터를 사용했다.
https://docs.snowflake.com/ja/user-guide/python-connector-pandas.html
실제로 Snowflak에 조회를 시도해 봅니다.
Snowflake의 Warehouse 리소스를 이용하여 1과 2의 기록을 생성하고 이를 데이터화된 Lambda에 추가하는 것은 정말 신비로운 일이다😇
handler.py
import os
import snowflake.connector


def main(event, context):
    sf_account = os.environ['SF_ACCOUNT']
    sf_user = os.environ['SF_USER']
    sf_pw = os.environ['SF_PW']
    conn = snowflake.connector.connect(
        account = sf_account,
        user = sf_user,
        password = sf_pw
    )
    cur = conn.cursor()
    try:
        cur.execute("select NUM from (values (1),(2)) as t (NUM)")
        df = cur.fetch_pandas_all()
    finally:
        cur.close()
        conn.close()

    response = {
        "statusCode": 200,
        "body": str(df['NUM'].sum())
    }
    print(response)

    return response
번거롭기 때문에 비밀번호는 환경 변수에서 꺼내는 것이고, 업무를 사용하려면 SSM이나 KMS로 관리하는 것이 좋다.

커넥터 용량 과대 문제


현지에서 테스트를 시도해 보세요.
pipenv run npx sls invoke local --log -f snowflake-lambda 
무사하다고 말씀해 주세요.
{'statusCode': 200, 'body': '3'}
{
    "statusCode": 200,
    "body": "3"
}
수수께끼 같은 쿼리가 Snowflak에서 실행되는 것도 확인했다😇

그래서 디자인을 해봤어요.
sls deploy
Snowflake의 Python connector 용량이 상당히 커서 용량 오류가 발생했습니다!
Resource handler returned message: "Unzipped size must be smaller than 262144000 bytes
따라서 1+2의 설정에 다음과 같은 내용을 보충하여 용량을 삭감해 보자.
참조:
https://zenn.dev/ryo_kawamata/articles/python-exclude-package-on-serverless-framework
Serverless.yml
custom:
  pythonRequirements:
    dockerizePip: true
    zip: true
    slim: true

plugins:
  - serverless-python-requirements
동시에 람다의 시작에도 이곳을 추기해야 한다.
handler.py
try:
  import unzip_requirements
except ImportError:
  pass
디자인 다시 할게요.
sls deploy
디자인 성공!

이벤트를 실행할 때마다 설정하기 때문에 시간당 한 번, 제 신용카드로 계산serverless-python-requirements1+2입니다!감사합니다!

오피스


Snowflake의 데이터를 이용하여 대량 처리와 간단한 ELT 처리를 할 수도 있고, 도량 주위의 표를 참조하여 일상적으로 활용하는 요약을 만들 수도 있다고 생각합니다!
슬랙의 웹훅에 올려놓으면 일상적인 활용도 수월해지겠죠!
그리고 코드 관리 능력과 프로그램도 하나하나 실행할 수 있기 때문에 나는 상당히 가벼워졌다고 생각한다!

최후


드디어 다음 주 12/07(화요일)~12/08(수요일), 스노우플레이크의 활동'스노우데이'가 시작된다!
https://www.snowflake.com/snowday-japan/?utm_source=japan&utm_medium=email&utm_campaign=SnowVillage
국내외의 고객 사례와 스노우플래크의 개발 정보 등이 많습니다!
저는 개인적으로 매년 세계 최신 데이터 공학의 흐름을 추적하기에 가장 적합한 활동이라고 생각하기 때문에 데이터와 관련된 사람들이 검사해도 된다고 생각합니다.
12/08 (수) 15:20~15:50에도 출연할 거니까 시간 되시면 잘 부탁드려요!

좋은 웹페이지 즐겨찾기