外部の Lamda Layer (Python)を使用してファイルサイズの節約!

外部の 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
© 2024 Chinta