はじめに
Lambda 関数デプロイ時に JWT デコードに利用する cryptography を同梱してデプロイしたかった。
そのため、cryptography を含む AWS Lambda Layer を作成 or 再利用しようとしたのだが、Lambda@Edge 用の関数は Layer を利用できないという制約がある。
最初は local で pip でインストールしようとしたのだが、 cryptography のライブラリ自体が pip でインストールする時に環境依存のバイナリを入れてくるため、pip -t .
でインストールしたモジュールをアップロードしても、基本的には動作しない。
そのための解消方法をメモする。
が、正直、原始的なやり方であり、かなり限定的なユースケースでしかないので、代用が可能ならそちらを利用した方が良いので本当に最終手段として。
方法
1. AWS Lambda で利用されている Python 特定バージョンの Docker Image を選択する。
2. 以下の Dockerfile をビルドして、必要なライブラリをインストール
FROM public.ecr.aws/lambda/python:3.9
RUN mkdir -p /opt/export
RUN pip3 install pyjwt -t /opt/export
RUN pip3 install cryptography -t /opt/export
3. インストールしたファイル一式を持ち出して zip にまとめ、Lambda にアップロードする
オチ
よくよく仕様を見ると、Lambda@Edge の最大コードサイズは 1MB であった。
ので、cryptography を使うような python コードは実質 Lambda@Edge では利用できないと考えた方がよさそう。
Cognito を使う場合は AWS が提供している aws-jwt-verify を使うのがよさそう。
参考