目次 †
概要 †これまでは、複数の Lambda で使用するような共通処理を作成する場合、各 Lambda に共通処理自体含める必要があったが、Lambda Layer として共通処理を外出しする事ができるようになった。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html 以降では Lambda Layer の作成 及び 利用方法を記載する。 準備 †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 配下に配置する必要がある。 登録する 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.py # 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は予め作成しておいたもの テスト実行 †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
恐らくパフォーマンス検証は必要 † |