AWSメモ >

AWS Lambda Layerで共通処理を作成する

概要

これまでは、複数の Lambda で使用するような共通処理を作成する場合、各 Lambda に共通処理自体含める必要があったが、Lambda Layer として共通処理を外出しする事ができるようになった。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html

以降では Lambda Layer の作成 及び 利用方法を記載する。
※サンプルでは Lambda Layer 及び 呼び出し側の Lambda作成等は全て aws cli で行っているが、もちろんマネージメントコンソール 及び Cloud Formartion でも同様の事は可能。

準備

aws cli を最新にしておく

pip install awscli --upgrade --user

作業用ディレクトリ作成

mkdir -p ~/sample_layer1/python
cd ~/sample_layer1

Lambda Layerとして提供するモジュールは全て、python 配下に配置していく。

例) boto3 を使用する場合

pip install boto3 -t ./python

Lambda Layerの作成

ファイル/フォルダ構成

提供するモジュールは全て、python 配下に配置する必要がある。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html#configuration-layers-path

登録する Lambda Layer(zip) の中身

 .
├ python
│   └ module1.py
│   └ package1
│          └ moduleA.py
│          └ moduleB.py

※依存モジュールを pip install する場合も python ディレクトリ配下にインストールする事。

共通機能の作成

python/sample1.py

# coding: utf-8

def hello(name):
    return f"Hello {name}!"

zipファイル化

zip -r sample-layer1.zip python

注意)解凍した時に、直下に python ディレクトリが含まれるように zip化する事。
.
└ python
     └ sample1.py

Lambda Layerを登録

aws lambda publish-layer-version --layer-name sample-layer1 --description "Sample layer1" \
--zip-file fileb://sample-layer1.zip --compatible-runtimes python3.6

{
    "LayerVersionArn": "arn:aws:lambda:ap-northeast-1:123456789012:layer:sample-layer1:1", 
    "Description": "Sample layer1", 
    "CreatedDate": "2019-01-01T01:01:01.123+0000", 
    "LayerArn": "arn:aws:lambda:ap-northeast-1:123456789012:layer:sample-layer1", 
    "Content": {
        "CodeSize": 8062916, 
        "CodeSha256": "SkPmtNrqQiNCT...", 
        "Location": "https://awslambda-..."
    }, 
    "Version": 1, 
    "CompatibleRuntimes": [
        "python3.6"
    ]
}

※自分でバージョンの指定は出来ない模様(自動的に採番される)

登録されたか確認

aws lambda list-layers --compatible-runtime python3.6

{
    "Layers": [
        {
            "LayerName": "sample-layer1", 
            "LayerArn": "arn:aws:lambda:ap-northeast-1:123456789012:layer:sample-layer1", 
            "LatestMatchingVersion": {
                "LayerVersionArn": "arn:aws:lambda:ap-northeast-1:123456789012:layer:sample-layer1:1", 
                "Version": 1, 
                "CompatibleRuntimes": [
                    "python3.6"
                ], 
                "Description": "Sample layer1", 
                "CreatedDate": "2019-01-01T01:01:01.123+0000"
            }
        }
    ]
}

利用側のLambdaを作成

Lambdaの作成(Layerを使用する側の処理)

mkdir ~/use_lambda_layer1
cd ~/use_lambda_layer1

Lambda関数を入力

index.js

# coding: utf-8

# 利用側は普通にPythonモジュールとして import するだけ。
import sample1 

def handler(event, context):
    message = sample1.hello('Daisuke')
    return {
        'statusCode': 200,
        'body': message
    }

zipファイル化

zip -r use_lambda_layer1.zip .

注意)こっちは、直下に python ディレクトリが含まれていない事に注意。(普通のLambda)

Lambdaを登録

aws lambda create-function \
  --function-name use_lambda_layer1 \
  --runtime python3.6 \
  --role arn:aws:iam::123456789012:role/lambda-role1 \
  --handler index.handler \
  --zip-file fileb://use_lambda_layer1.zip \
  --layers arn:aws:lambda:ap-northeast-1:123456789012:layer:sample-layer1:1

※roleは予め作成しておいたもの
※layersには作成しておいた Lambda Layer の arn と バージョン。※形式: ARN:バージョン

テスト実行

aws lambda invoke \
--invocation-type RequestResponse \
--function-name use_lambda_layer1 \
--region ap-northeast-1 \
--log-type Tail \
outputfile.txt && cat outputfile.txt && echo ""

{
    "LogResult": "U1RBUlQgUmVxdWVzdElk...", 
    "ExecutedVersion": "$LATEST", 
    "StatusCode": 200
}
{"statusCode": 200, "body": "Hello Daisuke!"}

補足

共通処理(Lambda Layer)のバージョンを上げる

共通処理側は処理を変更して publish-layer-version するだけ。(新規登録時と同じ)

aws lambda publish-layer-version --layer-name sample-layer1 --description "Sample layer1" \
--zip-file fileb://sample-layer1.zip --compatible-runtimes python3.6

{
    "LayerVersionArn": "arn:aws:lambda:ap-northeast-1:123456789012:layer:sample-layer1:2",         ...   バージョンが 2 に上がっている
    "Description": "Sample layer1", 
    "CreatedDate": "2019-01-01T01:01:01.123+0000", 
    "LayerArn": "arn:aws:lambda:ap-northeast-1:123456789012:layer:sample-layer1", 
    "Content": {
        "CodeSize": 8062917, 
        "CodeSha256": "QYKmU04K+3...", 
        "Location": "https://awslambda-..."
    }, 
    "Version": 2,                      ...   バージョンが 2 に上がっている
    "CompatibleRuntimes": [
        "python3.6"
    ]
}

利用側のLambdaは update-function-configuration で新しいバージョンを指定するだけでOK

aws lambda update-function-configuration --function-name use_lambda_layer1 \
--layers arn:aws:lambda:ap-northeast-1:123456789012:layer:sample-layer1:2

恐らくパフォーマンス検証は必要

Lambda Layer の登録(publish-layer-version)時に、以下のように表示されている事からも分かるように、
Lambda Layer として作成した共通処理は aws 上の何処か(S3?)にソースが登録されている。

Location": "https://awslambda-..."

これを、使用側のLambda実行時に動的に取得してLambda に組み込むような仕組みと思われる為、
この Lambda Layer のコンテンツ取得にかかる遅延がどの程度なのか検証が必要かもしれない。

Clodスタート時のイメージ

cold-start-image.png


TODO: 検証結果



トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS