こんにちは
最近時間があればウクレレ練習してるSRE課栩野です。
目次
LambdaにPythonの外部モジュールをzipで読み込ませる方法
先日SlackのWebhookをLambdaで実行しようと
Pythonのrequestsモジュールをimportして実行してみたのですが...
{
"errorMessage": "Unable to import module 'lambda_function': No module named 'requests'",
"errorType": "Runtime.ImportModuleError"
}
こんな感じでrequestsモジュールなんてないよと怒られました。
原因はLambdaに標準で同梱されているモジュールにrequestsが含まれていないことみたいです。
こういう場合は外部モジュールをLambdaにアップロードする必要があるようなので
今回はデプロイパッケージというものをzipで作成してLambdaにアップロードしてみようと思います。
デプロイパッケージの作成とアップロード
環境
- pipとzipコマンドが使える環境が準備できている前提
デプロイパッケージの作成
まずはモジュールをインストールするための適当なディレクトリを作成します。
# mkdir TestDir
pipコマンドに -t オプションをつけて先ほど作成したディレクトリをインストール先に指定して
今回はrequestsをインストールします。
# pip install requests -t ./TestDir
デプロイパッケージにLambda関数を含めておくために
lambda_function.pyを作成します。
# touch ./TestDir/lambda_function.py
lambda_function.pyの中身はなんでもいいですが、今回はSlackにWebhookでメッセージを飛ばす処理を記載しておきます。
import json, requests
def lambda_handler(event, context):
WEB_HOOK_URL = "webhookのURL"
requests.post(WEB_HOOK_URL, data = json.dumps({
'text': 'testメッセージ'
}))
return {
'statusCode': 200
}
先ほど作成したディレクトリ配下のファイル権限をすべて755にしておきます。
# chmod -R 755 ./TestDir/
最後に先ほど作成したディレクトリ配下のファイルをzipで固めます。
ファイル名は適当な名前にします。
# zip -r ./myDeploymentPackage.zip ./TestDir/*
これでデプロイパッケージの作成は完了!
デプロイパッケージのアップロード
AWS Lambda側で適用なPython関数を作成して
作成したデプロイパッケージをアップロードしていきます。
Lambda関数の作成
-
AWSのコントロールパネルにログインしサービスから[Lambda]を選択します。
-
関数画面の右上にある[関数の作成]を選択します。
-
今回は[一から作成]を選択し、
関数名は適当な名前にして、ランタイムは[Python3.8]を選択します。
その他は特にいじらず右下の[関数の作成]を選択
デプロイパッケージアップロード
関数の作成が完了したら以下の手順でデプロイパッケージをアップロードします。
-
画面を少し下までスクロールして関数コードの右側にある[アクション]を開いて
[.zipファイルをアップロード]を選択します。
-
[アップロード]をクリックし先ほど作成したzipファイルをアップロードして[保存]を選択します。
デプロイパッケージのアップロードも完了!
これで最初に失敗したrequestsモジュールを使った処理も
エラーなく実行できるようになりました。
あとがき
今回はzipファイルを直接アップロードしましたが
他にもServerless frameworkを使った方法などもあるようなので
今後別の方法も調べて記事にしてみたいと思います。
参考:Python 用の AWS Lambda デプロイパッケージを作成するには、どうすればよいですか?
運用サービス課 課長
運用・監視の設計から導入まで、運用サービスを担当してます。
運用監視やセキュリティ関連の話題に興味があるので、そのあたりのブログを多めで投稿していきたいと思ってます。
LINK
クラウドベリージャム:プロフィールページ