AWS 노트

AWS 서비스 상에서 Python 라이브러리 사용하기

Jonchann 2020. 6. 11. 12:25

Lambda든 Glue든 zip으로 만들어서 upload해야 한다.
다른 점은 어디에 upload 해야하느냐 뿐이다.

zip 파일의 이름은 라이브러리 이름으로 하지만 내부 폴더 이름은 python이어야 한다.

$ cd ~ && mkdir python
$ cd python && python3 -m pip install package_name -t .

zip으로 압축한다.

$ zip -r package_name.zip ./python

Lambda

Layer에 upload한다.
콘솔에서 하는게 확실하고 빠르고 편하다.

cli에서 하자면 아래와 같다.

$ aws lambda publish-layer-version --layer-name package_name --zip-file fileb://package_name.zip --compatible-runtimes python3.7

runtime정보는 아래 중에서 고를 수 있다.

  nodejs
  nodejs4.3
  nodejs6.10
  nodejs8.10
  nodejs10.x
  nodejs12.x
  java8
  java11
  python2.7
  python3.6
  python3.7
  python3.8
  dotnetcore1.0
  dotnetcore2.0
  dotnetcore2.1
  dotnetcore3.1
  nodejs4.3-edge
  go1.x
  ruby2.5
  ruby2.7
  provided

Glue

S3 버킷에 넣어두고 스크립트 상에서 다운로드 한다.
그러고보니 Lambda와 다른 점이 있었다.
이번엔 package_name으로 폴더를 만들어서 압축해야 한다.
그렇지 않으면 그런 이름의 모듈을 찾을 수 없다고 에러가 난다.

$ cd where/you/make/package/zip/file/path && mkdir package_name
$ python3 -m pip install package_name -t .
$ zip -r package_name.zip ./package_name
$ aws s3 cp ./package_name.zip s3://bucket_name/key_path/package_name.zip --profile profile_name

Glue는 PySpark가 더 사용하기 쉽게 되어 있지만 나는 Python shell을 사용하므로.

from awsglue.utils import getResolvedOptions

args = getResolvedOptions(sys.argv, ['S3_BUCKET'])
s3 = boto3.resource('s3')
bucket = s3.Bucket(args['S3_BUCKET'])

bucket.download_file('no/need/bucket_name/path/package_name.zip', 'package_name.zip')
os.system('unzip package_name.zip')

import psycopg2