この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
re:Invent 2018で発表されたLambda Layersを利用すると、複数のLambda関数が利用するような共通ライブラリを外出しして管理出来ます。
Lambda関数の運用フェーズでLambda Layerをアップデートしたい時、どのような作業が発生するのか確認してみました。
結論からいえば
- Lambda Layerをアップデートし
- Lambda関数に紐づくLambda Layerを新しいバージョンに付け替える
だけの想定通りの手順です。
作業の流れ
Lambda のランタイムには Python 3.7 を利用し、Lambda Layer には requests ライブラリを利用します。
以下の流れでLambda Layerで管理する requests ライブラリを 2.20.0 から 2.21.0 にアップデートします
- Lambda Layerの登録
- Layerを利用するLambda関数を作成
- Lambda Layerをアップデート
- Lambda関数が利用するLayerを更新
- リリース済み Lambda 関数を確認
1. Lambda Layerの登録
まずはrequestsライブラリをLambda Layerとして登録します。
今回はバージョンアップが狙いのため、pip コマンド実行時にバージョンを指定し、バージョン情報をlayerのdescriptionに付与します。
$ pip install -t python requests==2.20.0
$ zip -r requests-2.20.0.zip python
$ aws lambda publish-layer-version \
--layer-name requests \
--description "requests 2.20.0" \
--zip-file fileb://requests-2.20.0.zip \
--compatible-runtimes python3.6 python3.7
{
"Content": {
"Location": "https://awslambda-eu-west-1-layers.s3.eu-west-1.amazonaws.com/snapshots/...",
"CodeSha256": "rt/94UDWVgczkLtumF8gvSTJAyFT/a/6LFrGcvH/oz4=",
"CodeSize": 906027
},
"LayerArn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests",
"LayerVersionArn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:1",
"Description": "requests 2.20.0",
"CreatedDate": "2018-12-12T17:58:35.237+0000",
"Version": 1,
"CompatibleRuntimes": [
"python3.6",
"python3.7"
]
}
Lambda関数からLambda Layerを利用する際には、LayerVersionArn
を利用します。 このARNを控えておいてください。
2. Layerを利用するLambda関数を作成
このLayerを利用するLambda関数を作成します。
requestsライブラリのバージョンを表示するだけのシンプルな関数です。
test.py
def lambda_handler(event, context):
import requests
return requests.__version__
requests Layerを利用するようにLambda関数を登録します。
--layers
引数に Layer の ARN を指定します。
$ zip test.zip test.py
...
$ aws lambda create-function \
--function-name test \
--runtime python3.7 \
--role arn:aws:iam::123456789012:role/lambda_basic_execution \
--handler test.lambda_handler \
--zip-file fileb://test.zip \
--layers arn:aws:lambda:eu-west-1:123456789012:layer:requests:1 --region eu-west-1
{
"FunctionName": "test",
...
"Layers": [
{
"Arn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:1",
"CodeSize": 906027
}
]
}
動作確認
動作確認します。
$ aws lambda invoke --function-name test output.txt
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
$ cat output.txt
"2.20.0"
期待通り、Layer でパッケージングした requests のバージョンが返ってきています。
リリース
動作確認ができたため、lambda:PublishVersion
API でLambda関数をリリースします。
$ aws lambda publish-version --function-name test
{
"FunctionName": "test",
"FunctionArn": "arn:aws:lambda:eu-west-1:123456789012:function:test:1",
…
"Version": "1",
…
"Layers": [
{
"Arn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:1",
"CodeSize": 906027
}
]
}
初回リリースのため、Version:1
となっています。
3. Lambda Layerをアップデート
ステップ1と同じ要領で requests ライブラリをLayerとしてリリースします。
requests のバージョンを 2.20.0 から 2.21.0 に更新します。
なお Layer リリース時には、新規・更新関係なく lambda:PublishLayerVersion
API を利用します。
Layer名をキーにバージョンがインクリメントされます。
$ pip install -t python requests==2.21.0
$ zip -r requests-2.21.0.zip python
...
$ aws lambda publish-layer-version \
--layer-name requests \
--description "requests 2.21.0" \
--zip-file fileb://requests-2.21.0.zip \
--compatible-runtimes python3.6 python3.7 --region eu-west-1
{
...
"LayerArn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests",
"LayerVersionArn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:2",
"Description": "requests 2.21.0",
"CreatedDate": "2018-12-12T18:10:34.609+0000",
"Version": 2,
"CompatibleRuntimes": [
"python3.6",
"python3.7"
]
}
Version が 2 に増えています。
lambda:ListLayerVersions
API を利用すると、レイヤーのバージョン一覧を確認出来ます。
$ aws lambda list-layer-versions --layer-name requests
{
"LayerVersions": [
{
"LayerVersionArn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:2",
"Version": 2,
"Description": "requests 2.21.0",
"CreatedDate": "2018-12-12T18:10:34.609+0000",
"CompatibleRuntimes": [
"python3.6",
"python3.7"
]
},
{
"LayerVersionArn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:1",
"Version": 1,
"Description": "requests 2.20.0",
"CreatedDate": "2018-12-12T17:58:35.237+0000",
"CompatibleRuntimes": [
"python3.6",
"python3.7"
]
}
]
}
4. Lambda関数が利用するLayerを更新
Lambda 関数本体のコードは変更せず、Layer を先程リリースしたものに更新します。
$ aws lambda update-function-configuration \
--function-name test \
--layers arn:aws:lambda:eu-west-1:123456789012:layer:requests:2
{
"FunctionName": "test",
…
"Layers": [
{
"Arn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:2",
"CodeSize": 903488
}
]
}
動作確認
動作確認します。
$ aws lambda invoke --function-name test output.txt
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
$ cat output.txt
"2.21.0
期待通り、アップデートした Layer のバージョンが返ってきています。
リリース
動作確認ができたため、lambda:PublishVersion
API でリリースします。
$ aws lambda publish-version --function-name test
{
"FunctionName": "test",
"FunctionArn": "arn:aws:lambda:eu-west-1:123456789012:function:test:2",
...
"Version": "2",
...
"Layers": [
{
"Arn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:2",
"CodeSize": 903488
}
]
}
アップデート完了です。
5. リリース済み Lambda 関数を確認
Lambda 関数のバージョン一覧を確認
最後に、test 関数のバージョン一覧を確認します。
$ aws lambda list-versions-by-function --function-name test
{
"Versions": [
{
"FunctionName": "test",
"FunctionArn": "arn:aws:lambda:eu-west-1:123456789012:function:test:$LATEST",
…
"Version": "$LATEST",
…
"Layers": [
{
"Arn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:2",
"CodeSize": 903488
}
]
},
{
"FunctionName": "test",
"FunctionArn": "arn:aws:lambda:eu-west-1:123456789012:function:test:1",
…
"Version": "1",
…
"Layers": [
{
"Arn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:1",
"CodeSize": 906027
}
]
},
{
"FunctionName": "test",
"FunctionArn": "arn:aws:lambda:eu-west-1:123456789012:function:test:2",
…
"Version": "2",
…
"Layers": [
{
"Arn": "arn:aws:lambda:eu-west-1:123456789012:layer:requests:2",
"CodeSize": 903488
}
]
}
]
}
Lambda関数のバージョンとして
- $LATEST
- 1
- 2
を確認出来ます。
また、Lambda関数のバージョン 1&2 には、それぞれ個別の Layer バージョンが紐付いています。
Lambda関数のそれぞれのバージョンで実行してみます。
Version 1 で実行
$ aws lambda invoke --function-name 123456789012:function:test:1 output.txt
{
"StatusCode": 200,
"ExecutedVersion": "1"
}
$ cat output.txt
"2.20.0"
Version 2 で実行
$ aws lambda invoke --function-name 123456789012:function:test:2 output.txt
{
"StatusCode": 200,
"ExecutedVersion": "2"
}
$ cat output.txt
"2.21.0"
Layers のバージョンに紐付いたレスポンスがかえってきています。 成功です。
注意事項
Layerリリース時の API
Layer リリース時には、新規・更新関係なく lambda:PublishLayerVersion
API を利用します。
Layer名をキーにバージョンがインクリメントします。
バージョン番号
全バージョンを削除したあとで、同じ名前でLayer登録しても、バージョンは1から始まりません。 バージョン3まで利用済みだった場合、バージョン4というように、過去の延長上で採番されます。
Layer の権限設定
Layerはアカウント共有することが可能です。 そのような権限設定はLayerのバージョンに紐付いています。
Layerに権限を設定している場合は、Layer更新時に権限情報も合わせて更新してください。
最後に
Lambda関数の運用フェーズでLambda Layerをアップデートしたい時、どのような作業が発生するのか確認してみました。
AWS Lambda Layersの狙い通り、Lambda 関数本体のコード修正は不要で、以下の様に Layer の更新を行なうだけで作業は完了します。
- Layer を更新
- (option)Layer の権限を更新
- Lambda 関数のLayerを更新
- Lambda 関数をpublish
それでは。