関連記事:[AWS SAM] Lambda Layerの定義(nodejs)
目的
- Lambdaで外部ライブラリ(Pandas)を使用するためにLayer化する
- AWS SAMでLayerをデプロイする
SAMでのLambda Layer定義 & デプロイ(2024/02)
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/building-layers.html
上記に記載されている通り、
以下のような構成、テンプレートを用意すれば良い
├─ lambda/
│ └─ common_layer/
│ └─ requirements.txt
├─ template.yaml
CommonLayer:
Type: AWS::Serverless::LayerVersion
Properties:
ContentUri: lambda/common_layer/
CompatibleRuntimes:
- python3.11
LayerName: !Sub ${StackName}_CommonLayer
Metadata:
BuildMethod: python3.11
AWS::Serverless::LayerVersion
の Metadata
は必須
上記を sam build
すると、.aws-sam/build/CommonLayer/python
フォルダ内に
requirements.txt
で指定したパッケージがインストールされる
LayerをアタッチしたLambdaは、パッケージがインストールされている体で実装すればよい
パッケージの作成 ※ 以降は旧内容
外部ライブラリをLayer化するためには
- 外部ライブラリをまとめたzipファイルを作成する
- 使用する外部ライブラリが参照している他の外部ライブラリも含める
- Amazon Linux でデプロイパッケージを作成する ※Lambdaの実行環境がAmazon Linuxのため
- Lambdaの実行環境に合わせたRuntimeで作成する
今回はEC2でAmazon Linuxのインスタンスを使用した
Amazon LinuxへのSSH接続
デフォルトのユーザ名:ec2-user
EC2からダウンロードした秘密鍵:****.pem
を使用してログインする
Python3インストール
参考:【2020年版】AWSのEC2にPython3をインストールする方法
以下でインストール(※3.7系がインストールされました)
$ sudo yum update
$ sudo yum install python3 -y
Lambda実行環境が3.8系だったため以下で3.8系をインストール
$ sudo amazon-linux-extras install -y python3.8
以下でバージョン確認
$ python3.8 -V
パッケージ作成
以下でパッケージを作成し、FTP等を使用して手元にzipファイルを転送
$ mkdir python
$ pip3.8 install -t ./python pandas
$ zip -r python.zip python
SAM環境ファイル構成
lambda-layer/
├─ layers/
│ └─ pandas-layer/
│ └─ python.zip/
│ └─ python/
│ ├─ numpy
│ ├─ pandas
│ ├─ pytz
│ ├─ ...
│
│
└─ template.yaml # SAMテンプレート
SAMテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
child stack (lambda Layer)
Parameters:
StackName:
Type: String
Resources:
PandasLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: !Sub ${StackName}_pandas
ContentUri: pandas-layer/python.zip
CompatibleRuntimes:
- python3.8
RetentionPolicy: Delete
Outputs:
PandasLayerArn:
Value: !Ref PandasLayer