見出し画像

AWS LambdaでのPython関数のデプロイと実行のトラブルシューティング

今日はAWS LambdaでPython関数をデプロイして実行する際に直面した問題とその解決策についてお話しします。この記事が同じ状況に直面している方の参考になれば幸いです。



1.基本的なAWS Lambda環境設定手順

1.依存関係の準備:

requirements.txt に依存するパッケージをリストします。

os
random
requests
tweepy
configparser
openai
time
logging

上記の内容を持つ requirements.txt を作成し、上記の docker コマンドを使用してLambda用の依存関係レイヤーをビルドします。

2.Lambda関数のハンドラーを定義

AWS LambdaがPythonスクリプトを起動するとき、特定の「ハンドラー関数」を呼び出します。あなたの場合、このハンドラー関数は main 関数ですが、AWS Lambdaは引数 eventcontext を期待しています。以下のように main 関数を変更します。

def lambda_handler(event, context):
    main()

そして、AWS Lambdaの設定でハンドラーとして wp-tweet.lambda_handler を設定します。

3.AWS Lambda関数の作成

  • AWS Management Consoleにログインし、Lambdaサービスに移動します。

  • 「関数の作成」をクリックし、関数名とランタイム(Python 3.9)を指定します。

  • 「関数の作成」をクリックして関数を作成します。

4.コードのアップロード

wp-tweet.py ファイルと config.ini ファイル、および requirements.txt でインストールした依存関係を一つのZIPファイルにまとめて、Lambda関数の「関数コード」セクションにアップロードします。

5.Lambda関数の設定

  • Handler のセクションで、wp-tweet.lambda_handler を設定します。

  • 必要に応じて、環境変数、タイムアウト、メモリなどのLambda関数の設定を調整します。

6.IAM Roleの設定

Lambda関数が外部リソース(例:Twitter、OpenAI、WordPress)と通信するための適切なIAMロールと権限を設定します。

7.テスト

AWS Lambdaコンソールで「テスト」ボタンをクリックし、関数をテストします。

注意: openai などの外部APIとの通信は、インターネットを通じて行われるため、Lambda関数がVPC内に配置されている場合は、VPCの設定を適切に行い、NATゲートウェイ経由でインターネットアクセスが可能であることを確認してください。


2.遭遇した問題と解決法

1. 問題: Dockerコマンドのエラー

最初に直面した問題はDockerコマンドのエラーでした。

(base) D:\python\LambdaLayer\wp-tweet-env>docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.9" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"
Unable to find image 'public.ecr.aws/sam/build-python3.9:latest' locally
latest: Pulling from sam/build-python3.9
ccb06c247962: Pull complete
590fcde6cb56: Pull complete
4a0b10bc604d: Pull complete
79a77e7c1be9: Pull complete
1e7740aea7b4: Pull complete
c3962bc61e24: Pull complete
340c3a8cd6cc: Pull complete
5345af45680e: Pull complete
8c613e239f6b: Pull complete
9f4650783890: Pull complete
e2248a3bbb19: Pull complete
Digest: sha256:702cb80dffc811ffc6db0acb035351326e1ff97274aa00a90586cd5fbb77053d
Status: Downloaded newer image for public.ecr.aws/sam/build-python3.9:latest
docker: Error response from daemon: create $PWD: "$PWD" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.

このエラーメッセージは、Dockerが$PWDという変数を正しく解釈していないことを示しています。解決のためには、絶対パスを明示的に指定する必要があります。Windows環境では以下のようにします。

Command Prompt:

docker run -v "%cd%":/var/task "public.ecr.aws/sam/build-python3.9" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"

PowerShell:


docker run -v "${PWD}:/var/task" "public.ecr.aws/sam/build-python3.9" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"



2. 問題: Lambda関数のハンドラーのエラー

Lambda関数を実行した際に、次のエラーが表示されました:

csharpCopy code[ERROR] Runtime.HandlerNotFound: Handler 'lambda_handler' missing on module 'lambda_function'

解決策:

このエラーは、指定されたハンドラ関数が見つからないことを示しています。具体的には、lambda_functionというモジュールの中にlambda_handlerという関数が存在しないということです。

wp-tweet.pyというファイル内にlambda_handler関数を作成し、それを実行するようにハンドラーを指定する必要があります。

例:wp-tweet.lambda_handler の設定方法:

  1. AWS Management Consoleにログインして、Lambdaサービスにアクセスします。

  2. 作成したLambda関数を選択します。

  3. 「関数コード」のセクションをスクロールダウンして、「ハンドラ」フィールドを探します。

  4. このフィールドに wp-tweet.lambda_handler と入力します。

  5. 変更を保存します。

この設定は、wp-tweet.py というファイルの中の lambda_handler という関数を指しています。この関数は、前述の通り、次のように定義する必要があります:

def lambda_handler(event, context):
    main()

ここで、event はLambda関数が受け取る入力データ、context はLambda関数の実行に関する情報を提供するオブジェクトです。このケースでは、これらの引数は使用されませんが、AWS Lambdaの要件として存在しています。

この設定が完了すると、Lambda関数を実行するたびに wp-tweet.py ファイル内の main() 関数が呼び出されます。


3. ハンドラのセクションの場所

もしLambdaコンソール内で「ハンドラ」セクションを見つけるのが難しい場合、以下の手順でアクセスできます。

  1. AWS Management Consoleにログインし、Lambdaサービスに移動。

  2. 「関数」を選択。

  3. 対象のLambda関数を選択。

  4. 「設定」タブを選択。

  5. 「関数のコード」セクションまでスクロールし、「ハンドラ」フィールドを確認。


3.まとめ

AWS Lambdaのデプロイや実行は初めての方には少し難しく感じるかもしれませんが、エラーメッセージをしっかり読み、一つ一つトラブルシューティングすることで、問題を解決することができます。この記事が同様の問題に直面している方の参考になれば嬉しいです。頑張ってください!

参考

[ChatGPT]OpenAI APIでGPT-3.5系のモデル「gpt-3.5-turbo」と「text-davinci-003」をLambdaで試してみた
貼り付け元 https://dev.classmethod.jp/articles/open-api-lambda-test/

この記事が気に入ったらサポートをしてみませんか?