目次 †
概要 †これまでは、複数の 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
恐らくパフォーマンス検証は必要 † |