AWSメモ >
これまでは、複数の 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 でも同様の事は可能。
pip install awscli --upgrade --user
mkdir -p ~/sample_layer1/python cd ~/sample_layer1
Lambda Layerとして提供するモジュールは全て、python 配下に配置していく。
例) boto3 を使用する場合
pip install boto3 -t ./python
提供するモジュールは全て、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 -r sample-layer1.zip python
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" } } ] }
mkdir ~/use_lambda_layer1 cd ~/use_lambda_layer1
index.js
# coding: utf-8 # 利用側は普通にPythonモジュールとして import するだけ。 import sample1 def handler(event, context): message = sample1.hello('Daisuke') return { 'statusCode': 200, 'body': message }
zip -r use_lambda_layer1.zip .
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!"}
共通処理側は処理を変更して 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