Lambda Layerにnode_modulesと自作モジュールを含めてCloudFormationでLambdaデプロイする

Lambda Layerにnode_modulesと自作モジュールを含めてCloudFormationでLambdaデプロイする

前提
node.js v18

Lambdaレイヤーに自作モジュールであるcommon.mjsを含めてデプロイします。

layerの構成です。node_modules直下にlib/common.mjsを配置しています。

layer
 └─nodejs
    │
    ├─node_modules
    │   ├─lib
    │   │  └─common.mjs // 自作モジュール
    │   └─luxon
    ├─package.json
    └─package-lock.json

Lambda

Lambdaの構成です。

src
 └─index.mjs

index.mjsです。

import {DateTime} from 'luxon'
import {Log} from 'lib/common.mjs' //★
export const handler = async(event) => {

  const date = DateTime.now().setZone('Asia/Tokyo').toFormat('yyyy/MM/dd')
  Log.info(data) // console.log()みたいなものと思って..
  return {
    statusCode: 200,
    body: `Hello`
  }
}

CloudFormation

cloudformationのymlです。cfn.ymlとします。

AWSTemplateFormatVersion: "2010-09-09"
Transform: "AWS::Serverless-2016-10-31"
Resources:
  LambdaLayer:
    Type: "AWS::Serverless::LayerVersion"
    Properties:
      LayerName: layername
      ContentUri: layer/
      CompatibleRuntimes:
        - nodejs18.x
      RetentionPolicy: Delete
  TestFunction:
    Type: "AWS::Serverless::Function"
    Properties:
      FunctionName: functionname
      Handler: index.handler
      Runtime: nodejs18.x
      CodeUri: src/
      Layers:
        - !Ref LambdaLayer

package deploy

package & deployします。

$ aws cloudformation package --template-file cfn.yml --s3-bucket バケット名 --output-template-file cfn_out.yml
$ aws cloudformation deploy --template-file cfn_out.yml --stack-name スタック名 --capabilities CAPABILITY_IAM

これでLambdaがデプロイされ、正常動作します。

テストコード

テストコードの構成です。

test
 └─index.test.mjs

Lambda Layerにnode_modulesと自作モジュールを含めてCloudFormationでLambdaデプロイする

layer配下に自作モジュールがあるので、プロジェクト直下のnode_modulesにlibフォルダのシンボリックリンクを作成すればテストコードも実行できます。

※npm iが動作しなくなるケースがあるとの事 https://github.com/npm/npm/issues/10013

コマンドプロンプト(管理者権限)

c:\<プロジェクトルート>\node_modules\>mklink /D lib ..\layer\nodejs\node_modules\lib

Lambda Layerにnode_modulesと自作モジュールを含めてCloudFormationでLambdaデプロイする

自作モジュールはCodeArtifactでnpmプライベートリポジトリにpublishする方がよさそうです。

AWS CodeArtifactでLambda(node.js)のライブラリ管理する」参照

参考サイト

Lambda レイヤーでの作業 - AWS Lambda
このセクションでは、AWS レイヤーを使用してアプリケーションコードを依存関係から分離する方法について説明します。
Modules: ECMAScript modules | Node.js v21.4.0 Documentation
Modules: ECMAScript modules | Node.js v18.19.0 Documentation

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

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