일반적으로 aws cli 만을 활용해서 lambda 함수를 관리해도 상관없지만 
serverless 프레임워크를 활용하면 좀더 편하고 다양한 기능들을 제공하니 활용해봅시다!

serverless 프레임워크 설치

우선 serverless 프레임 워크 설치 메뉴얼을 참고해서 설치를 하겠습니다.
https://serverless.com/framework/docs/getting-started/

설치하기 전에 node 가 설치되어 있어야 합니다. 
node를 설치하는 방법은 아래 두가지 중에 편하신 방법을 참고하셔서 진행해주세요.
[설치 파일로 직접설치] / [패키지 매니저로 설치]

# Installing the serverless cli 
$ npm install -g serverless

serverless 환경 생성

# Generating boilerplate 
$ serverless create -t aws-python -p aws_serverless_test 

# serverless 프로젝트 폴더로 이동 
$ cd aws_serverless_test

이후부터는 별도의 언급이 없으면 serverless 프로젝트 폴더[ ex) ~/aws_serverless_test ] 에서 진행하는것으로 간주합니다.

virtualenv ( 파이썬 가상환경 ) 만들기

# 가상환경 생성
$ virtualenv venv --python=python3

# 가상환경 상태 활성화
$ source venv/bin/activate
(venv) $

RequestsBeautiful Soup 패키지 설치

# virtualenv 활성화 상태에서 진행
(venv) $ pip install requests
(venv) $ pip install bs4

# 설치된 패키지들은 requirements.txt 파일에 저장 ( 추후 aws lambda 에서 사용하기 위함? )
(venv) $ pip freeze > requirements.txt
(venv) $ cat requirements.txt
beautifulsoup4==4.7.1
bs4==0.0.1
certifi==2019.3.9
chardet==3.0.4
idna==2.8
requests==2.21.0
soupsieve==1.9.1
urllib3==1.24.2

메인 실행 파일 작성

파일위치: {$serverless project dir}/handler.py

# handler.py 

import requests
from bs4 import BeautifulSoup


def main(event, context):
    print("StartCode..")

    req = requests.get('https://www.pexels.com')
    html = req.text

    soup = BeautifulSoup(html, 'html.parser')

    images = soup.select(
        'a > img'
    )
    
    for image in images:
       print(image.get('src'))


if __name__ == "__main__":
    main('', '')

serverless 환경 설정

# serverless.xml

service: lambda-test

plugins:  
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: non-linux

provider:
  name: aws
  runtime: python3.6

functions:
  crawler:
    handler: handler.main

AWS에 배포

AWS 인증 정보 설정

https://www.youtube.com/watch?v=71cd5XerKss

AWS 콘솔 로그인 > 내 보안 자격 증명 > 액세스 키 생성

비밀 키는 생성시점에만 확인/다운로드가 가능하므로 꼭 별도로 보관.

AWS credentials 파일 설정

$ vi ~/.aws/credentials

[serverless]
aws_access_key_id = ####################
aws_secret_access_key = ####################
# aws lambda function 배포 (venv) 
$ serverless deploy --aws-profile serverless 

# lambda function 실행 및 실행결과 표시 (venv)
$ serverless invoke -f crawler --log

# 오류해결

배포 명령어 실행시 node 관련 오류

node v8 에서 serverless deploy 명령어 실행시 아래와 같은 오류가 발생한다면 node 버전 업데이트 후 시도

$ serverless deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
_stream_readable.js:545
  switch (state.pipesCount) {
               ^

TypeError: Cannot read property 'pipesCount' of undefined
    at module.exports.Readable.pipe (_stream_readable.js:545:16)
...

NVM

# 현재 배포된 node 버전(8.x.x) 중 가장 안정된 최신 버전을 설치한다.
$ nvm install --lts 8
# nvm update 시 serverless 패키지 재설치 필요
$ npm install -g serverless

homebrew

$ brew update
$ brew upgrade node
$ npm update -g npm

패키지/메뉴얼 설치( macOS Installer (.pkg), macOS Binary (.tar.gz) )

https://nodejs.org/ko/download/


– 참고한 페이지

감사합니다. 😀