AWS Lambda

LambdaにPythonの外部モジュールをzipで読み込ませる方法

こんにちは
最近時間があればウクレレ練習してる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関数の作成

  1. AWSのコントロールパネルにログインしサービスから[Lambda]を選択します。
  2. 関数画面の右上にある[関数の作成]を選択します。
    関数の作成
  3. 今回は[一から作成]を選択し、
    関数名は適当な名前にして、ランタイムは[Python3.8]を選択します。
    その他は特にいじらず右下の[関数の作成]を選択
    lambda作成

デプロイパッケージアップロード

関数の作成が完了したら以下の手順でデプロイパッケージをアップロードします。

  1. 画面を少し下までスクロールして関数コードの右側にある[アクション]を開いて
    [.zipファイルをアップロード]を選択します。
    アクション
  2. [アップロード]をクリックし先ほど作成したzipファイルをアップロードして[保存]を選択します。
    アップロード

デプロイパッケージのアップロードも完了!

これで最初に失敗したrequestsモジュールを使った処理も
エラーなく実行できるようになりました。

あとがき

今回はzipファイルを直接アップロードしましたが
他にもServerless frameworkを使った方法などもあるようなので
今後別の方法も調べて記事にしてみたいと思います。

参考:Python 用の AWS Lambda デプロイパッケージを作成するには、どうすればよいですか?

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA