はじめに
AWS LambdaでPythonのレイヤーを作成する際に、うまく動作しない問題に直面しました。原因を特定し、GitHub Actionsを活用することで解決できたため、同じような課題に直面している方の参考になればと思い、共有します
問題の概要
Windows環境でPythonモジュール(例:numpy)をインストールし、それをLambdaレイヤーとして利用しようとすると、AWS LambdaがLinux環境で動作しているため、Windows特有のファイルや依存関係が含まれてしまい、正常に動作しませんでした
エラー内容
numpy: Error importing numpy: you should not try to import numpy from
its source directory; please exit the numpy source tree, and relaunch
your python interpreter from there.
このエラーは、numpyのインストール方法や環境に起因するもので、Lambda上での実行に適していない構成になっていることが原因です
解決策
GitHub Actionsを使って、Linux環境上でPythonモジュールをインストールし、その成果物をそのままS3にアップロードすることで、Lambdaレイヤーとして利用可能な形に整えました。
この方法により、Lambdaの実行環境と一致した依存関係を持つレイヤーを作成でき、問題を回避することができました。
name: レイヤーの作成
on:
push:
branches:
- main
jobs:
build-and-upload:
runs-on: ubuntu-latest
steps:
# リポジトリのチェックアウト
- name: Checkout repository
uses: actions/checkout@v2
# モジュール用のフォルダの作成
- name: Create directory
run: mkdir -p python
# 必要なモジュールのインストール
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install --target=python -r requirements.txt
# フォルダのzip化
- name: Zip the layer
run: zip -r layer.zip python
# S3へのアップロード
- name: Upload to S3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ap-northeast-1
run: |
aws s3 cp layer.zip s3://your-s3-bucket-name/lambda-layers/layer.zip # S3へアップロード
プロジェクトのフォルダ構成
your-project/
├── .github/
│ └── workflows/
│ └── layer-build.yml ← GitHub Actionsの定義ファイル(今回のYAML)
├── requirements.txt ← Python依存パッケージの定義ファイル
└── その他のファイルやコード
さいごに
解決策を探している際、英語の情報ばかりで苦労しました。同じような問題に直面している方の助けになれば幸いです