【Lambda x Python】pipライブラリの使い方

マッシュルーム
2024-06-17
2024-06-17

AWSの代表的なサーバレスサービスであるLambdaを使用して、簡単なPythonプログラムを作成していきます。
今回は外部モジュールも取り入れたプログラムにしたいと思います。

目次

Lambda関数の作成

 コードの編集

外部ライブラリの準備

 Lambdaレイヤーの作成

● Lambdaレイヤーと関数の紐付け

Lambdaレイヤーはとても便利

 

Lambda関数の作成

最初に、Lambda関数を作成しましょう。

lambda_pip_1ランタイムには「Python」を選択し、「関数の作成」を押下します。
(バージョンは2024年5月時点の最新を選択)

 

lambda_pip_2関数が作成できました

Lambdaはデフォルトでも動作するようにあらかじめコードが記述されており、試しに動作させてみると「Hello from Lambda!」とレスポンスが返ってきました。

lambda_pip_3

 

コードの編集

では早速コードを編集しましょう。
現在は「Hello from Lambda!」という文字列がレスポンスされるプログラムとなっていますが、「おはよう」「こんにちは」という文字列が配列でレスポンスされるコードに変更します。

def lambda_handler(event, context):
    # 配列に値をセット
    array = ["おはよう", "こんにちは"]

    return {
        'statusCode': 200,
        'body': array
    }

実行します。

lambda_pip_4正しく動作しました。

次に、「numpy」という外部ライブラリをインポートし、numpyのappendメソッドを使用して配列に「こんばんは」という文字列を追加します。

import numpy

def
lambda_handler(event, context):

    # 配列に値をセット
    array = ["おはよう", "こんにちは"]

    #「こんばんは」を追加
    array = numpy.append(array, ["こんばんは"]).tolist()


    return {
        'statusCode': 200,
        'body': array
    }

実行します。

lambda_pip_5怒られました

No module named 'numpy'
 → numpyなんてモジュールは無いよって言われています。

あれ?
Lambdaってpipコマンドどこから叩くの?コンソールとかあるの?

 

外部ライブラリの準備

色々な方法がありますが、今回はLambdaレイヤーを使用した方法で進めていきます。

ローカルPCを使用し、numpyライブラリをインストールします。
Lambda関数がpython3.12なので、ローカルのpythonも3.12をインストールし、pipコマンドを実行します。

pip install numpy -t ./python

インストール先は必ずpythonディレクトリ上を指定してください。
ここはかなりの落とし穴なのですが、これはLambdaレイヤーの命名規則で決まっており、この形でないと正しく読み込むことができません。

インストール後、pythonディレクトリごとzip形式で圧縮します。

zip -r upload.zip *

 

Lambdaレイヤーの作成

次に、Lambdaレイヤーを作成します。

lambda_pip_6numpyライブラリが詰まったzipファイルをアップロードします。
「互換性のあるランタイム」には、Lambda関数のPythonのバージョンと合わせてください。

 

lambda_pip_7作成できました。

 

 

Lambdaレイヤーと関数の紐付け

次に、レイヤーをLambda関数と紐付けます。

lambda_pip_8

「カスタムレイヤー」を選択し、作成したLambdaレイヤーを選択します。
「バージョン」は最新のものを選択します。

lambda_pip_9

関数とレイヤーとの紐付けが完了したら、再度実行します。

lambda_pip_10numpyライブラリが読み込まれ、正しく動作しました。

 

Lambdaレイヤーはとても便利

Lambda x Pythonでの外部ライブラリの指定方法は、かなり詰まるポイントかと思います。
Lambdaレイヤーはとても便利で、今回のような外部ライブラリの指定だけに留まらず、Lambda関数間での共通ライブラリなど、共通で使用する処理等の置き場所としても打ってつけです。

良きLambdaライフを!