Snowflake Connector(Python)용 AWS Lambda Custom Layer

Soonmo Seong
Cloud Villains
Published in
6 min readJul 8, 2024

Snowflake의 Task를 AWS Lambda를 이용하면 필요한 조건에 따라서 실행할 수 있습니다. 그렇지만 AWS Lambda에서는 Snowflake Connector를 기본적으로 지원하지 않기 때문에 Custom Layer를 생성해서 함수가 잘 작동할 수 있도록 환경을 구성해야 합니다. 따라서 오늘은 Snowflake Connector(Python)용 AWS Lambda Custom Layer를 아래의 순서로 생성해보겠습니다.

  • 미리 알아두어야 할 사항
  • 리눅스 환경에서 파일을 생성하기 위해서 Ubuntu EC2를 생성
  • Dependencies 설치 및 압축 파일 만들기
  • AWS Lambda Custom Layer 생성
  • Sample 코드 실행으로 정상적인 동작 확인하기

미리 알아두어야 할 사항

Python용 AWS Lambda Custom Layer는 Amazon Linux에서 동작합니다. 그래서 리눅스 환경에서 Zip File을 생성해야 합니다. 특히 개인 랩탑(Mac, Windows)에서 Zip File 생성 시 잘 동작하지 않습니다. 현시점(2024–07–08) 기준으로 Snowflake는 Python 버전 3.11을 추천합니다.

리눅스 환경에서 파일을 생성하기 위해서 Ubuntu EC2를 생성

  • 인스턴스에서 Launch Instances를 클릭합니다
  • 이름을 넣고 우분투를 선택하고 key pair를 생성합니다.
  • Connect to your instance를 클릭합니다.
  • 아래의 방법을 참고하여 생성된 EC2 인스턴스에 SSH를 통해서 접속합니다.

Dependencies 설치 및 압축 파일 만들기

  • 접속한 SSH Client(Terminal)에서 아래의 코드를 실행하여 Dependency를 설치합니다.
# sudo apt를 업데이트합니다
sudo apt update

# python dependency를 설치하기 위해 pip를 설치합니다
sudo apt install pip

# 압축파일을 만들기 위해 zip을 설치합니다.
sudo apt install zip

# 디렉토리를 만들고 snowflake connector를 설치합니다.
mkdir -p temp/python
cd temp/python
pip3 install snowflake-connector-python -t .
  • 압축 파일 만들기
# zip 파일을 생성합니다
cd ..
zip -r9 ../snowflake-connector-python.zip .
  • 로컬 폴더에 압축 파일 다운로드하기
# 새로운 터미널에서 아래의 명령어를 실행합니다
# pem키, EC2 디렉토리, 로컬 PC 디렉토리는 사용자의 상황에 맞게 변경합니다
scp -i "snowflake_connector_ec2_key.pem" ubuntu@ec2-3-36-67-138.ap-northeast-2.compute.amazonaws.com:/home/ubuntu/snowflake-connector-python.zip /Users/mzc01-ssm/Downloads snowflake-connector-python.zip

AWS Lambda Custom Layer 생성

  • Layers를 선택하고 Create layer를 클릭합니다.
  • 이름을 기입하고 zip file을 업로드하고 생성합니다. 생성 후 ARN을 복사합니다.

Sample 코드 실행으로 정상적인 동작 확인하기

  • 함수를 생성합니다.
  • 함수 이름, 런타임을 설정하고 함수를 생성 완료합니다.
  • Add a layer를 클릭하고 복사 된 ARN으로 Layer를 더합니다.
  • 아래의 함수를 넣고 Deploy를 누릅니다.
import json
import snowflake.connector

conn = snowflake.connector.connect(
user='xxxxxxxxxxxxx',
password='xxxxxxxxxxxxx',
account='xxxxxxxxxxxxx',
warehouse='xxxxxxxxxxxxx',
database='xxxxxxxxxxxxx',
schema='xxxxxxxxxxxxx'
)
cs = conn.cursor()
cs.execute('execute task mzc_test_task1')
one_row = cs.fetchone()

cs.close()
conn.close()

def lambda_handler(event, context):

# TODO implement
return {
'statusCode': 200,
'SnowflakeTaskStatus': one_row[0]
}
  • Test를 눌러서 테스트를 생성하고 코드를 실행합니다.
  • 테스트 결과 정상적으로 Python Connector가 동작하고 있을 것을 확인할 수 있습니다.

--

--