AWS

CFNでLambdaレイヤー作成

CloudFormationでLambdaレイヤー作成

本ページでは、CloudFormationでLambdaレイヤーを作成する方法を確認します。

Lambda レイヤーは、Lambda 関数で使用できるライブラリとその他の依存関係をパッケージ化するための便利な方法を提供します。

Lambda レイヤーの作成と共有

VPC内外のLambda関数用のLambdaレイヤーを作成し、実際の挙動を確認します。

構築する環境

Amazon.co.jp: AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版 : NRIネットコム株式会社, 佐々木 拓郎, 林 晋一郎, 金澤 圭: 本
Amazon.co.jp: AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版 : NRIネットコム株式会社, 佐々木 拓郎, 林 晋一郎, 金澤 圭: 本
Diagram of create Lambda layers using CloudFormation.

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レイヤーに配置するパッケージ類を準備します。
パッケージの構成は言語ごとに定められています。
詳細は以下のページをご確認ください。

Lambda レイヤーでの作業 - AWS Lambda
このセクションでは、AWS レイヤーを使用してアプリケーションコードを依存関係から分離する方法について説明します。

今回はランタイム環境にPythonを選択しておりますので、以下のディレクトリ構成を用意します。

python
└── mylayer 
    ├── __init__.py
    └── mylayer.pyCode 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 layers.

正常にLambdaレイヤーが作成されています。
対象のランタイム環境やアーキテクチャもCloudFormationテンプレートで指定した通りです。

本レイヤーに関係している関数も確認できます。
今回作成した2関数が確認できます。
先述の通り、異なるアーキテクチャ上に構成した関数でも、統一したレイヤーを参照することができます。

動作確認

準備が整いましたので、各Function URLにアクセスします。
まず関数1です。

The Result of Lambda Function 1 Invocation.

正常に応答が返ってきました。
このようにVPC外の関数でも、Lambdaレイヤーを参照し、関数を実行することができます。

続いて関数2です。

The Result of Lambda Function 2 Invocation.

こちらも正常に応答が返ってきました。
このようにVPC内の関数でも、Lambdaレイヤーを参照し、関数を実行することができます。

まとめ

CloudFormationを使用したLambdaレイヤーの作成方法と、Lambda関数への適用方法を確認しました。
Lambdaレイヤーは関数側のアーキテクチャやVPC内外に関係なく、適用できることを確認しました。

タイトルとURLをコピーしました