Background
Python3.6 以降でvenv
を使ってpipしたパッケージを保存していたのですが、AWS上で出来ないかと調べているとlayerという手頃な機能があったので使ってみた。
venv
作業PC上ではこれでOK
python -m venv [仮想環境名]
./[仮想環境名]/bin/activate
([仮想環境名]) pip install [パッケージ名]
パッケージ用のzip作成
AWS lambda を使ってWebスクレイピングしたった-Development (Webスクレイピング)と同様にAWS上にuploadするためにzipファイルを作ります。
mkdir packages
cd packages
pip install [パッケージ] -t ./
pip install [パッケージ] -t ./
......
zip -r ./myDeploymentPackage.zip ./packages
#Layer
pip環境を作成するにはLayerを作成します。
Development (error)
ここでAWS lambda を使ってWebスクレイピングしたった-Development (Webスクレイピング)でbeautifulsoupを使ったコードを書いてみます。
import json
import requests
from bs4 import BeautifulSoup
def lambda_handler(event, context):
# TODO implement
response = requests.get('https://mainichi.jp/editorial/')
soup = BeautifulSoup(response.text)
pages = soup.find("ul", class_="list-typeD")
articles = pages.find_all("article")
links = [ "https:" + a.a.get("href") for a in articles]
return {
'statusCode': 200,
'links' : links
}
とすると、
{
"errorMessage": "Unable to import module 'lambda_function'"
}
importエラーが出てしまいます。
Lambda@Pythonのレイヤーを使う際の基本的な注意点(レイヤーに上げたファイルがimport出来ない人向け)-注意点
を見ると、zipファイルは /opt/
配下に解凍されるみたいです。
この場合だと、/opt/packages/
に作業用PCにpipでインストールしたパッケージがあるので、
import sys
sys.path.append('/opt/packages')
にして事前にパスを通しておく必要があります。
Development (modified)
import sys
sys.path.append('/opt/packages')
import json
import requests
from bs4 import BeautifulSoup
def lambda_handler(event, context):
# TODO implement
response = requests.get('https://mainichi.jp/editorial/')
soup = BeautifulSoup(response.text)
pages = soup.find("ul", class_="list-typeD")
articles = pages.find_all("article")
links = [ "https:" + a.a.get("href") for a in articles]
return {
'statusCode': 200,
'links' : links
}
{
"statusCode": 200,
"links": [
"https://mainichi.jp/articles/20201120/ddm/005/070/067000c",
"https://mainichi.jp/articles/20201120/ddm/005/070/065000c",
"https://mainichi.jp/articles/20201119/ddm/005/070/119000c",
"https://mainichi.jp/articles/20201119/ddm/005/070/118000c",
"https://mainichi.jp/articles/20201118/ddm/005/070/115000c",
"https://mainichi.jp/articles/20201118/ddm/005/070/114000c",
"https://mainichi.jp/articles/20201117/ddm/005/070/114000c",
"https://mainichi.jp/articles/20201117/ddm/005/070/113000c",
"https://mainichi.jp/articles/20201116/ddm/005/070/043000c"
]
}
Post Scripting
zipで圧縮するときに"/packages/"なしでできればいいんすけどね