CloudFormationでLambdaレイヤー作成
本ページでは、CloudFormationでLambdaレイヤーを作成する方法を確認します。
Lambda レイヤーは、Lambda 関数で使用できるライブラリとその他の依存関係をパッケージ化するための便利な方法を提供します。
Lambda レイヤーの作成と共有
VPC内外のLambda関数用のLambdaレイヤーを作成し、実際の挙動を確認します。
構築する環境
VPC内外にLambda関数を1つずつ作成します。
それぞれFunction URLを作成し、インターネット越しにアクセスできるように設定します。
なおLambda関数のランタイム環境はPython3.8とします。
両関数用でLambdaレイヤーを作成します。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
https://github.com/awstut-an-r/awstut-fa/tree/main/040
テンプレートファイルのポイント解説
今回の構成の大部分は以下のページと同様です。
例えばLambda Function URLや、Lambda関数をVPC内に設置する方法については、上記ページをご確認ください。
本ページはLambdaレイヤーに関する内容を中心に取り上げます。
LambdaレイヤーパッケージをZIP化してS3バケットにアップロードする
Lambdaレイヤーに配置するパッケージ類を準備します。
パッケージの構成は言語ごとに定められています。
詳細は以下のページをご確認ください。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html
今回はランタイム環境にPythonを選択しておりますので、以下のディレクトリ構成を用意します。
python
└── mylayer
├── __init__.py
└── mylayer.py
Code language: plaintext (plaintext)
Lambda関数から読み込むモジュールとしてmylayer.pyを作成します。
同モジュールの内容は以下の通りです。
def myfunc(func_name):
return 'hello from {func_name}.'.format(func_name=func_name)
Code language: Python (python)
シンプルな関数です。
引数で渡された文字列を使って新たな文字列を作成して返す内容です。
パッケージの準備が整いましたら、次はパッケージをZIP化します。
$ zip -r layer.zip python
adding: python/ (stored 0%)
adding: python/mylayer/ (stored 0%)
adding: python/mylayer/mylayer.py (deflated 29%)
adding: python/mylayer/__init__.py (stored 0%)
Code language: Bash (bash)
ZIPファイルをS3バケットにアップロードします。
以下はAWS CLIでアップロードする例です。
$ aws s3 cp layer.zip s3://[s3-bucket-name]/
upload: ./layer.zip to s3://[s3-bucket-name]/layer.zip
Code language: Bash (bash)
Lambdaレイヤー作成
Lambdaレイヤーを確認します。
Resources:
LambdaLayer:
Type: AWS::Lambda::LayerVersion
Properties:
CompatibleArchitectures:
- arm64
- x86_64
CompatibleRuntimes:
- python3.8
Content:
S3Bucket: !Ref S3Bucket
S3Key: !Ref S3Key
Description: !Ref Prefix
LayerName: !Ref Prefix
Code language: YAML (yaml)
CompatibleArchitecturesプロパティで、本レイヤーを使用可能な関数のアーキテクチャを指定できます。
後述しますが、今回2つのLambda関数を作成します。それぞれARM64、x86_64上で動作させるように設定します。そのため2種類のアーキテクチャを設定しています。
CompatibleRuntimesプロパティで、本レイヤーを使用可能なランタイム環境を指定できます。
こちらも後述しますが、今回作成する2つの関数のランタイム環境はPython3.8とします。そのため同環境を設定しています。
Contentプロパティで、レイヤーに含めるパッケージに関する情報を設定します。
パッケージ類はZIP化した上でS3バケットに設置し、そのオブジェクトを指定します。先ほど触れたパッケージファイルのファイル名およびバケット名を指定します。
LambdaレイヤーをLambda関数に適用
Lambda関数にLambdaレイヤーを指定する方法を確認します。
Resources:
Function1:
Type: AWS::Lambda::Function
Properties:
Architectures:
- arm64
Code:
ZipFile: |
from mylayer import mylayer
def lambda_handler(event, context):
return mylayer.myfunc('func1')
FunctionName: !Sub "${Prefix}-function-01"
Handler: !Ref Handler
Layers:
- !Ref LambdaLayer
Runtime: !Ref Runtime
Role: !GetAtt FunctionRole1.Arn
Code language: YAML (yaml)
2つの関数を作成しますが、ほとんど同じですので、関数1のみを取り上げます。
ポイントはLayersプロパティです。
先ほど確認したレイヤーを指定することで、Lambdaレイヤー内のパッケージを使用することができるようになります。
関数1と関数2の違いは3つです。
1つ目はアーキテクチャです。それぞれARM64、x86_64を設定しています。
2つ目はVPCに関する設定です。それぞれVPC外、VPC内で実行するように設定しています。
3つ目は実行する関数の内容です。先述の自作した関数(myfunc)実行時に、それぞれ「func1」、「func2」を引数として渡すように設定しています。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- Lambdaレイヤー:fa-040
- Lambda関数1のFunction URL:https://hvbnf6cbrsxwd53u5xgmocpvne0rgnzv.lambda-url.ap-northeast-1.on.aws/
- Lambda関数2のFunction URL:https://nfnixjukfrdu2pctiqmizkdj6a0iynea.lambda-url.ap-northeast-1.on.aws/
AWS Management Consoleからも、Lambdaレイヤーを確認します。
正常にLambdaレイヤーが作成されています。
対象のランタイム環境やアーキテクチャもCloudFormationテンプレートで指定した通りです。
本レイヤーに関係している関数も確認できます。
今回作成した2関数が確認できます。
先述の通り、異なるアーキテクチャ上に構成した関数でも、統一したレイヤーを参照することができます。
動作確認
準備が整いましたので、各Function URLにアクセスします。
まず関数1です。
正常に応答が返ってきました。
このようにVPC外の関数でも、Lambdaレイヤーを参照し、関数を実行することができます。
続いて関数2です。
こちらも正常に応答が返ってきました。
このようにVPC内の関数でも、Lambdaレイヤーを参照し、関数を実行することができます。
まとめ
CloudFormationを使用したLambdaレイヤーの作成方法と、Lambda関数への適用方法を確認しました。
Lambdaレイヤーは関数側のアーキテクチャやVPC内外に関係なく、適用できることを確認しました。