
外部の Lamda Layer (Python)を使用してファイルサイズの節約!
lambda Python
Lamda Layer は通常 zipで固めてアップロードする形で利用しますが、外部ライブラリを指定するだけで利用できます(Python)。ここでは Python(ver3.9) の「pymysql」を例にして設定してみます。
1.使用する外部ライブラリーを選択
Layerの情報はこちらのgithubにありますので、ページに移動します。
下部にスクロールすると、「List of ARNs」という部分があり、こちらで「Python 3.11」があるので移動します。「Layers for Python 3.11」と表示されるので、一覧からLamdaを使用するリージョンより選択します。(json、csv、html とありますが、ここでは「ap-northeast-1」の「html」を選択しました。)
選択すると、ライブラリ一覧が表示されるので「pymysql」の「arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-p311-pymysql:1」をコピーします。
2.関数にレイヤーを追加
追加の方法はマネジメントコンソールやserverless framework、aws sam, terraformそれぞれの設定方法を紹介します。
●マネジメントコンソールでレイヤーを追加
AWSマネジメントコンソールからLamdaを選択し、Layerを使用させたい関数を選びます。関数のページの最下部に「Layers(レイヤー)」の項目があるので、ここで「Add Layer(レイヤーの追加)」を押下します。
「Add Layer(追加)」を押下すると、以下の画面が表示されるので、「Specify an ARN(ARN を指定)」を選んで、1でコピーしたarnを張り付けて「検証(Verify)」を押下して確認します。OKなら「Add(追加)」します。
●Serverless Frameworkでレイヤーを追加
handler と同じレベルで選択した arn に設定します。関数と同じリージョンのレイヤーを使用する必要があります。
check:
handler: 02_pipeline/check.main
description: Checks for package on PyPi via the API
runtime: python3.11
timeout: 30
memorySize: 256
layers:
- arn:aws:lambda:${self:provider.region}:770693421928:layer:Klayers-p38-PyMySQL:2
●aws samでレイヤーを追加
関数と同じリージョンのレイヤーを使用する必要があります。
ServerlessFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: .
Handler: my_handler
Runtime: Python3.11
Layers:
- arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-p38-PyMySQL:2
●terraformでレイヤーを追加
terraform-provider-klayerをプロバイダーに設定します。
Terraform Registry
terraform {
required_providers {
klayers = {
version = "~> 1.0.0"
source = "ldcorentin/klayer"
}
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
data "klayers_package_latest_version" "pymysql" {
name = "pymysql"
region = "ap-northeast-1"
}
resource "aws_lambda_function" "test_lambda" {
filename = "index.zip"
function_name = "lambda-test"
role = aws_iam_role.iam_for_lambda.arn
handler = "index.handler"
runtime = "python3.11"
layers = [
data.klayers_package_latest_version.pymysql.arn
]
}
3.関数で読み込み
関数のコードには通常どおり import するだけです。
import pymysql