背景
-
AWS Lambdaで
Python
を実行する際、pandasなどの外部ライブラリはLambda
に事前にinstall
されていないため、いずれかの方法でLambda
に外部ライブラリ等をinstall
させる必要があります。 - 私が知る限りでは、AWS Lambdaで
Python
を実行する際に、外部ライブラリを使用できるようにする方法は以下の3つです。- Lambda レイヤーを使用する方法。
- zip デブロイを用いる方法。
- コンテナイメージデブロイを用いる方法。
- それぞれの方法にメリット・デメリットがありますが、今回は、最もよく使用されているであろう「 2. zip デブロイを用いる方法。」についてご紹介します。
目標
- 外部ライブラリを含む
Python code
をzip
デブロイ方式によって、AWS Lambdaで関数を実行できるようになる。
AWS Lambdaとは
- 本題に入る前に、AWS Lambdaというサービスについて少しご紹介します。
- なお、ここの解説は私の脳みその記憶ベースで記載していることにご留意ください。
- AWS LambdaはAWSの代表的なサーバーレスサービスの一つで、サーバーを構築することなく手軽にプログラムを動かすことができるサービスとして知られています。
- 様々な用途に使用できるサービスですが、よく使用される方法の一つとしては、Amazon API GatewayをトリガーとしてAPIサービスを構築するのに使用されたりします。
- APIなどの必要な時にちょっことプログラムが動けば良いようなサービスの場合は、AWS Lambdaを使用することにより、Amazon EC2などを使用してずっとサーバーを起動させているよりサーバーコストが安くなるなどのメリットがあります。
- また、今回の内容につながりますが、AWS Lambdaを支える裏側の技術はコンテナ仮想化技術を使用しています。
- そのため、実行時におそらく
Amazon linux
をベースとしたイメージを用いたコンテナで処理が実行されているため、外部ライブラリを使用する際は何かしらの方法で外部ライブラリデータをAWS Lambdaに渡す必要があります。 - 今回ご紹介する方法は、
zip
ファイルに外部ライブラリのデータも含ませておくことにより、Python
関数で外部ライブラリ等もimport
して使用できるようにする方法になります。
デブロイするzipファイルを作成するDocker環境の構築
- 今回のデブロイ方法は、AWSのLambda公式ページでは.zip ファイルアーカイブで Python Lambda 関数をデプロイするのページの「依存関係のあるデプロイパッケージ」の項目に該当します。
- 公式ページでは、ローカル環境で
zip
ファイルを作成していましたが、私はDocker
信者(Docker
ならどんな環境でも動くから安心と信じてるマン、私の造語です。)ですので、今回はDocker
でzip
ファイルを作成する環境作成からご紹介します。 - 下記の
github
リポジトリをクーロンもしくはDLしていただき、$docker-compose up --build
でPython
を実行できるコンテナを立ち上げます。
- 下記の記事を参考に立ち上げたコンテナ内部に
VS Code
で入ります。 - 続きの解説は、「小ネタ:コンテナのルートディレクトリでフォルダを開く方法」まで実施した想定で進めています。
VS Codeを使用してDocker環境でデブロイ用のzipファイルを作成する方法
- コンテナに接続した
VS Code
でターミナルを開きます。
-
$cd workdir
でworkdir
ディレクトリに移動します。
-
$mkdir
コマンドで、新しいディレクトリを作成します。
$mkdir zip_lambda_deploy
-
$cd
コマンドで、新しいディレクトリに移動します。
$cd zip_lambda_deploy
-
$touch
コマンドで新しいpy
ファイルを作成します。
$touch lambda_function.py
-
$touch
コマンドで新しいtxt
ファイルを作成します。
$touch requirements.txt
-
lambda_function.py
に以下のcode
を記載します。
lambda_function.py
#はじめにimportの検索pathを追加するcodeを記載する。
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), './packages'))
import requests
def lambda_handler(event, context):
response = requests.get("https://www.example.com/")
print(response.text)
return response.text
-
requirements.txt
に必要な外部ライブラリ名を記載します。
ここでは、requests
が必要なので、requests
を記載しています。
requirements.txt
requests==2.28.2
- 必要なライブラリを
pip
でinstall
します。
#requirements.txtを使用して一気にinstall
$pip install --target ./packages -r requirements.txt
#補足:ライブラリ名を個別に指定してinstallする方法
$pip install --target ./packages requests
-
zip
コマンドでライブラリごとzip化します。
$zip -r ../zip_lambda_deploy .
Lmabdaにzipデブロイを行う方法
- 最後に作成した
zip
ファイルをLmabda
にデブロイします。
AWSのコンソール画面から「Lmabda」のコンソール画面に移動します。
サイドバーから「関数」をクリックしてから、「関数の作成」をクリックします。
Lmabda関数を「一から作成」で作成します。
- ここでは、「関数名」は
zip_lambda
とします。 - 「ランタイム」は
Python3.9
を選択します。 - 「アーキテクチャ」は
zip
ファイルを作成した環境に合わせて選択してください。
なお、docker-python-lambda-zip-useからクローンしたdockerfile
を用いて、ここまで解説通りに進めてきた方はx86_64
を選択して進めてください。
「アップロード元」をクリックし、選択肢から「.zipファイル」を選択します。
「アップロード」をクリックし、先ほど作成したzip_lambda_deploy.zip
を選択し「保存」をクリックしてzip
ファイルをLambda
にアップロードします。
「テスト」タブをクリックします。
「テスト」をクリックしLmabda
関数を実行します。
「詳細」を開き、ログにHTMLが記載されていれば成功です。
参考資料
個人ブログ