스터디/AWS

AWS Lambda Python 자주 쓰는 패키지 편하게 추가하기. Layer ARN 리스트 (KLayers == 개꿀)

Dalmangyi 2022. 7. 19.

AWS의 Lambda에 Python을 이용할때, 기본 포함 패키지가 아닌 패키지를 추가할땐, 정말 귀찮은 작업이 필요합니다.

패키지를 압축하고 AWS Lambda의 Layer에 미리 등록시켜놓고, 이를 Lambda에서 사용할 수 있게 Layer를 추가해서 사용해야 합니다.

 

하지만 개발을 하다보면 패키지는 많은 사람들이 사용하는걸 사용할 가능성이 높습니다. 

대중적으로 사용하는 패키지를 Layer에 쉽게 추가할 수 있도록 ARN(Amazon Resource Name)을 제공해 주는 KLayer를 소개해드릴까 합니다.

 

 

 

먼저, 기본적인 방법부터 KLayer를 이용하는 방법까지 소개해드릴까 합니다.

 

 

1. Layer에 라이브러리 등록하기

Layer는 Lambda가 구동될때, 미리 다른 패키지를 추가 시키고, 미리 빌드시키는 패키지를 말합니다. 

Lambda에서 Layer를 추가하고, 코드상에 import를 쓰면 사용할 수 있게 됩니다.

먼저 람다로 이동합니다.

 

하단에 보면 계층(Layer)이 보입니다.

 

왼쪽 패널을 펼쳐보면 '추가 리소스 > 계층'을 눌러봅니다.

저는 기존에 KLayer를 몰랐을때 추가한 계층 리스트를 볼 수 있습니다..

 

'계층 생성' 버튼을 눌러서 직접 추가해 보겠습니다.

솔직히 뭘 적을지 막막하지만, 그런 느낌은 AWS를 하면서 무수히 겪을 것이기 때문에 무서워 하시면 안됩니다 (?)

 

 

 

Layer에 업로드할 파일 패키지 압축파일 준비 해보겠습니다.

예제로 크롤링할때 자주 쓰이는 패키지인 beautifulsoap4(bs4)를 만들어보겠습니다.

 

bs4를 다운받고 싶지만 명령어를 몰라서 다른 패키지가 다운받아질 수 있기 때문에 

pypi.org로 접속해서 검색 해봅니다.

https://pypi.org/search/?q=beautifulsoup 

가장 처음에 있는 검색결과를 클릭해보니 설치 명령어를 알려주네요

'pip install beautifulsoup4'

 

 

명령어를 이렇게 입력하면 패키지(MODULE_NAME)를 지정위치(TARGET_PATH)에 받을 수 있습니다.

$ pip install {{ MODULE_NAME }} –t {{ TARGET_PATH }}

 

터미널을 켜서 명령어를 입력해서 다운받아봅니다.

AWS Lambda의 Layer에 추가해주기 위해선 python폴더를 압축해야되기 때문에 아래 명령어처럼

python폴더에 다운로드 하게 해줍니다.

$ pip install beautifulsoup4 -t ./python

폴더를 확인해보니 잘 다운된게 보입니다. 

 

통채로 압축해줍니다.

 

계층(Layer) 생성 페이지로 돌아갑니다.

이름을 적고 미리 압축해둔 python.zip를 추가합니다.

호환 런타임에는 로컬에서 개발하는 환경을 선택해줍니다.

그리고 생성 버튼을 눌러 계층을 등록합니다.

 

이렇게 생성 완료된 계층은 ARN까지 생기게 됩니다. 

 

 

 

 

 

 

 

 

 

 

2. Lambda에 Layer(계층) 추가

개발하려는 람다로 돌아와서 하단에 보면 'Add a layer' 버튼을 클릭합니다.

 

여러 방법으로 추가 할 수 있습니다.

 

저희가 직접 추가해놓은 계층은 '사용자 지정 계층'에서 확인 할 수 있습니다.

test_bs4를 선택하고 계층을 같은 이름으로 zip를 덮어쓰기 할 수 있기 때문에, 버전이 생깁니다.

저희는 생성만 하고 업데이트를 한적이 없기 때문에 1 버전이 나옵니다.

버전 1을 선택하고, 오른쪽 아래 있는 '추가'를 클릭합니다.

 

추가하고보니 람다 하단에 추가된 계층으로 test_bs4가 보입니다.

 

 

 

 

3. 중간점검 & 주의할점 (왜 이런걸 안 알려주는거야....)

람다에 패키지를 추가할려면 위 과정을 거쳐야 합니다...

생각보다 많이 귀찮죠....

beautifulsoup4 패키지를 별 탈 없이 추가해서 사용할 수 있지만,

openCV같은 패키지는 c++코드가 포함되어 있어서 사용하는 환경 CPU의 아키텍처까지 신경써야 합니다. 

로컬과 AWS와 환경이 다를 수 있으니 직접 다운받아서 압축시킨 패키지가 aws에서 실행된다고 장담할 수 없습니다....

 

거기다가 람다는 패키지를 최대 5개 밖에 추가하지 못합니다.

심플한 사용을 목적으로 설계된 람다에 6개 이상을 세팅하려 하지 맙시다......

하려면 여러 패키지를 1개로 압축해서 업로드 하시면 됩니다. 

 

아무튼 이런 패키지를 매번 다운받고, 압축하고, 업로드하고, 추가하고 보통 귀찮은게 아닙니다.

그래서 이런 불필요한 과정을 줄여준 프로젝트가 KLayer 입니다.

 

 

 

4. KLayers (Keithhrozario's Layers)

https://github.com/keithrozario/Klayers

 

 

대충 이런 과정으로.... AWS 람다에 쓸 수 있게 Layer가 Publish 된다고 합니다.

덕분에 편하게 쓰고 있습니다. 🧡

 

 

 

 

 

 

 

 

 

 

 

 

 

5. KLayers 사용 방법

 

자신이 사용하는 python 리스트로 이동합니다.

https://github.com/keithrozario/Klayers/tree/master/deployments/python3.8

https://github.com/keithrozario/Klayers/tree/master/deployments/python3.9

저는 3.8을 이용하고 있기 때문에 python 3.8로 이동해봅니다.

KLayers에는 3.9보다 3.8에서 추가된 패키지가 더욱 많습니다.

 

 

aws region 마다 ARN 리스트를 제공해 주고 있고

서울리전 기준으로 ap-northeast-2로 이동해 보겠습니다.

https://api.klayers.cloud//api/v2/p3.8/layers/latest/ap-northeast-2/html

 

 

 

 

 

저희가 직접 추가했던 bs4 라이브러리도 볼 수 있습니다.

 

arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-beautifulsoup4:1

 

 

 

 

 

 

람다의 계층 추가 (Add a layer) 화면으로 와서, Klayers에서 찾은 ARN 주소를 입력해줍니다.

그리고 오른쪽 '추가' 버튼을 누르면 끝!!

 

정말 간단합니다.......

 

 

 

 

 

6. 번외. Klayers에서 많이 쓰는 패키지들.

Klayers에는 정말 많이 쓰이는 패키지들이 등록되어있습니다.

pycountry 22.3.5 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pycountry:1 언어, 국가, 통화
aws-requests-auth 0.4.3 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-aws-requests-auth:8 requests를 이용한 aws auth
pdf2image 1.16.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pdf2image:2 pdf파일을 이미지로 변환
ldap3 2.9.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-ldap3:6  
tabulate 0.8.9 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-tabulate:1  
gremlinpython 3.6.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-gremlinpython:2  
chevron 0.14.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-chevron:2  
lambda-decorators 0.6.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-lambda-decorators:11  
itsdangerous 2.1.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-itsdangerous:2  
SQLAlchemy 1.4.44 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-SQLAlchemy:8  
jinja2 3.1.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-jinja2:3  
ccxt 2.2.46 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-ccxt:11  
rdklib 0.2.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-rdklib:11  
textdistance 4.5.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-textdistance:3  
praw 7.6.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-praw:8  
black 22.10.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-black:9  
PyMySQL 1.0.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-PyMySQL:4  
crhelper 2.0.11 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-crhelper:1  
dynamodb-encryption-sdk 3.1.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-dynamodb-encryption-sdk:11  
google-auth 2.14.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-google-auth:10  
Cerberus 1.3.4 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-Cerberus:3  
ffmpeg-python 0.2.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-ffmpeg-python:1  
opencv-python-headless 4.2.0.34 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-opencv-python-headless:11 openCV
slackclient 2.9.4 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-slackclient:7  
requests 2.28.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-requests:8 http 요청
construct 2.10.68 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-construct:1  
beautifulsoup4 4.11.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-beautifulsoup4:1 html또는 xml 파서
mpld3 0.5.8 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-mpld3:12  
cryptography 38.0.4 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-cryptography:7  
flashtext 2.7 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-flashtext:1  
python-docx 0.8.10 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-python-docx:4  
scipy 1.3.3 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-scipy:1  
libgthread-so 1.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-libgthread-so:1  
envelopes 0.4 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-envelopes:1  
reportlab 3.6.12 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-reportlab:7  
attrs 22.1.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-attrs:2  
aws-lambda-powertools 2.4.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-aws-lambda-powertools:11  
PyJWT 2.6.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-PyJWT:3  
cloudsplaining 0.5.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-cloudsplaining:11  
arrow 1.2.3 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-arrow:1  
spacy_model_en_small 2.25 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-spacy_model_en_small:1  
tldextract 3.4.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-tldextract:10  
geopy 2.3.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-geopy:1  
ansible 2.9.13 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-ansible:19  
aws-xray-sdk 2.11.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-aws-xray-sdk:11  
pyarrow 8.0.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pyarrow:5  
aws-psycopg2 1.3.8 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-aws-psycopg2:1  
translate 3.6.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-translate:9  
elasticsearch 8.5.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-elasticsearch:12  
aiohttp 3.8.3 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-aiohttp:6 비동기 http 요청 (requests보단이거지)
asyncio 3.4.3 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-asyncio:1  
parliament 1.6.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-parliament:11  
pika 1.3.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pika:3  
pyqldb 3.2.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pyqldb:12  
pymongo 4.3.3 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pymongo:5  
jsonschema 4.17.3 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-jsonschema:9  
PyMUPDF 1.21.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-PyMUPDF:5  
spacy_model_es_small 2.3.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-spacy_model_es_small:1  
nltk 3.7 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-nltk:8  
langdetect 1.0.9 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-langdetect:2  
dropbox 11.36.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-dropbox:10  
spacy 3.0.6 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-spacy:42  
gspread 5.7.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-gspread:11  
openpyxl 3.0.10 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-openpyxl:1  
pycryptodome 3.16.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pycryptodome:3  
PyYAML 6.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-PyYAML:5  
Pillow 9.3.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-Pillow:5 다양한 이미지 분석 및 처리
로드, 변환, 저장
jellyfish 0.9.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-jellyfish:6  
twilio 7.15.4 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-twilio:10  
ccxtpro 1.0.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-ccxtpro:1  
graphene 2.1.8 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-graphene:2  
pandas 1.5.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pandas:10 데이터 처리와 분석
cvs, excel, read, write, 통계
kafka-python 2.0.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-kafka-python:4  
passlib 1.7.4 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-passlib:1  
numpy 1.23.5 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-numpy:9 C언어로 구현된 고성능 계산
행렬, 벡터 계산
requests-html 0.10.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-requests-html:10  
pygsheets 2.0.6 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pygsheets:12  
DBnomics 1.2.3 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-DBnomics:1  
tweepy 3.9.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-tweepy:1  
records 0.5.3 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-records:8  
simplejson 3.18.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-simplejson:1  
matplotlib 3.6.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-matplotlib:12  
grpcio 1.51.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-grpcio:8  
pydantic 1.9.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pydantic:5  
pyOpenSSL 22.1.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pyOpenSSL:7  
aiobotocore 2.4.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-aiobotocore:11  
PyNaCl 1.5.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-PyNaCl:1  
pytesseract 0.3.10 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pytesseract:6  
redshift-connector 2.0.909 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-redshift-connector:11  
lxml 4.9.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-lxml:3  
boto3 1.26.20 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-boto3:11 AWS SDK
s3, ec2, dynamoDB
pulp 2.7.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pulp:1  
paramiko 2.7.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-paramiko:1  
opensearch-py 2.0.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-opensearch-py:7  
bcrypt 4.0.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-bcrypt:4  
xarray 2022.11.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-xarray:11  
tablib 3.2.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-tablib:1  
idna 3.4 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-idna:1  
exchangelib 4.9.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-exchangelib:10  
tradologics 0.0.22 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-tradologics:10  
boltons 21.0.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-boltons:6  
pytz 2022.6 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pytz:3  
tinydb 4.7.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-tinydb:1  
loguru 0.6.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-loguru:7  
pyparsing 3.0.9 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pyparsing:2  
kazoo 2.9.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-kazoo:2  
lambda-cache 0.8.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-lambda-cache:1  
datadog 0.44.0 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-datadog:8  
shapely 1.8.5.post1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-shapely:4  
google-auth-oauthlib 0.7.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-google-auth-oauthlib:11  
python-Levenshtein-wheels 0.13.2 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-python38-python-Levenshtein-wheels:2  
pysftp 0.2.9 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pysftp:10  
pybit 2.4.1 arn:aws:lambda:ap-northeast-2:770693421928:layer:Klayers-p38-pybit:10  

 

 

 

 

 

 

댓글