簡體   English   中英

AWS Lambda:NodeJs 自定義層

[英]AWS Lambda: NodeJs custom layer

我是 nodejs 和 aws lambda 的新手。 我正在嘗試為我的一堆 lambda 函數創建具有常用函數的層。 在 lambda 處理程序中,自定義模塊的導入具有以下定義: let commonService = require('@common/service');

帶有模塊文件的 zip 結構如下:

nodejs
--node_modules
  --@custom
    --service
    --index.js
    --package.json  

但我收到錯誤: "errorMessage": "Error: Cannot find module '@common/service'\nRequire stack:\n- /var/task/index.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",

@custom/service模塊 package.json 包含以下內容:

{
  "name": "@common/service",
  "version": "1.0.0",
  "main": "index.js",
  "license": "ISC",
  "dependencies": {
    /***
  }
}

提前致謝!

嘗試使用AWS Lambda 層

使用圖層有兩個主要好處。

  • 它允許您將基本依賴項部署在一個地方並集中管理它們。
  • 它縮小了 Lambda 應用程序部署的大小。 不再需要每次上傳大量的node_modules文件夾層次結構。

如何使用它們? 這是一個相當深入的話題,但它的要點是您可以:

  1. 在 AWS 中構建和部署一個層。 一個層只不過是一個“裸”的 npm 項目,真的。 您在其中安裝常用的 NodeJS 模塊,僅此而已。
  2. 假設您使用無服務器應用程序 model 來部署您的 AWS Lambda 功能,您將 Lambda ZC1C425268E68385D11ABZ 配置為使用 07 層 7 層 7。 這是 SAM yaml 文件的精簡版本,它說明了這一點:
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: My Serverless App
Parameters:
  # ...

Globals:
  Function:
    Runtime: nodejs10.x
  #   Environment:
  #     Variables:
  #       NODE_ENV: test

Resources:

  CommonDependenciesLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: my-common-deps
      Description: Common dependencies for my NodeJS apps
      ContentUri: ../common-deps/
      RetentionPolicy: Retain
    Metadata:
      BuildMethod: nodejs10.x

  performSomeFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      FunctionName: performSomeFunction
      Handler: lambda.someFunction
      Layers:
        # You can either Ref a layer defined in this SAM file like this.
        # - !Ref CommonDependenciesLayer

        # ... or you can hard-code an external ARN
        # - arn:aws:lambda:us-east-1:nnnnnnnnnnnnn:layer:myapp-common-deps:5
      CodeUri: ./
      # ...
  1. 在您的 Lambda 代碼中,您所做的就是使用普通的 CJS 要求語法。 例如,假設我將mysql庫放在上面的CommonDependenciesLayer中。 只要我的 Lambda function 指向 SAM 文件中的層,我所要做的就是在我的代碼中使用require('mysql') 它會在那里。

當你開始工作時,有一些關於 Layer 部署的微妙之處需要考慮。

  • 我想每次都構建圖層嗎? (可能不會,但我建議您在學習 Layers 和 Lambdas 如何協同工作時這樣做)。
  • 我的圖層組件多久更改一次?
  • 我想公開我的圖層嗎?
  • 我想從另一個帳戶使用公開可用的圖層嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM