Hướng dẫn sử dụng npm modules trên AWS Lambda Function

Khi tạo Lambda function bằng Nodejs, sẽ có những trường hợp các package mà ta import, require trong code sẽ không có sẵn ở AWS Lambda compute resource, mà ta sẽ cần import vào. Vậy làm như thế nào để có thể import được các modules để sử dụng với AWS Lambda function?

Bài viết này tôi sẽ hướng dẫn các bạn 2 cách:

Cách 1: Không sử dụng Lambda layer:

Với cách này, bạn sẽ nén zip thư mục nodes_module cùng với file index.js của bạn – cách này đơn giản, nhẹ đầu!

Demo:

Khi sử dụng cách này, bạn sẽ có folder với structure như sau:

index.js
package.json
package-lock.json
node_modules
    your_npm_modules

Bước 1: Tạo file index.js

const {format} = require('date-fns');

exports.handler = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      today: format(new Date(), "️ 'Today is a' eeee"),
    }),
  };
};

Như bạn đã thấy, ở đây chúng ta require module date-fns.

Tiếp đó, bạn tạo file package.json:

{
  "name": "without-layers",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "date-fns": "^2.24.0"
  }
}

Sau đó chạy các câu lệnh sau:

npm init -y

npm install date-fns@2.24.0

Lúc này khi bạn kiểm tra thư mục, thì ngoài hai file index.js và package.json đã tạo, đã có thêm thư mục node_modules và file package-lock.json

Bạn thực hiện nén hết lại thành file zip:

zip -r function.zip .

Sau đó bạn mở AWS Console, tạo mới Lambda function và update code cho Lambda function bằng cách chọn Tab code, chọn Upload from và chọn .zip file. Bạn cũng có thể upload file zip này lên S3 và chỉ định URL khi chọn tùy chọn Amazon S3 location.

Đảm bảo rằng Lambda function set handler file là index.handler:

Lúc này bạn có thể thực hiện testing Lambda function của mình, và thấy rằng Lambda function chạy thành công.

Cách 2: Sử dụng Lambda layer:

Cách 1 có ưu điểm là đơn giản, nhưng có nhược điểm là sau mỗi lần thay đổi code thì chúng ta lại phải zip lại, deploy file zip mới. Ngoài ra, vì đưa cả node_modules nên file zip rất nặng, dẫn tới sẽ không thể modify trực tiếp code tạo Lambda console. Ngoài ra Lambda function body chỉ có max size là 50MB. Do đó, chúng ta nên sử dụng Lambda layer để đưa node modules leen import vào Lambda function.

Với cách này, bạn sẽ có folder dạng như sau:

index.js
layers
  date-fns
    nodejs
      package.json
      node_modules

Mở terminal và thực thi các câu lệnh sau:

cd layers/date-fns/nodejs
npm init -y
npm install date-fns@2.24.0
cd ..
zip -r9 date-fns-layer.zip .

Để tạo lambda layer, bạn sẽ sử dụng câu lệnh AWS CLI command publish-layer-version như sau:

aws lambda publish-layer-version --layer-name date-fns-layer --description "add date-fns library" --zip-file fileb://date-fns-layer.zip --compatible-runtimes nodejs10.x nodejs12.x nodejs14.x nodejs16.x

Kết quả trả về:

{
    "Content": {
        "Location": "https://prod-04-2014-layers.s3.us-east-1.amazonaws.com/snapshots/830427153490/date-fns-layer-2e097b65-86d2-4aea-80fe-4176d3bc8640?versionId=ZE5gSzJZgYr6Nu9W0sS8zlhYn6FAhb2R&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECUaCXVzLWVhc3QtMSJGMEQCIBoFrW%2FHsbiETypYA1l5SL3uwb3M8wn2AaME6drY%2F%2Bs5AiB4MSMPyKzjoj9YJs5mxceTRfdHC9K9hp1L8x3acbgqSirWBAi%2B%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDc0OTY3ODkwMjgzOSIM%2BgD4efl070P6nOKgKqoEC%2Fbdsb9zUrWHfQNyBa%2BRiR2kMF4tQkqQ4IbvxCBsJOlo0hQeJ85n07DCbYd2utvqfHBw8Myd3KGUOTiYqjTjtUz4oLtClCclLe4zW3O3XO12O0tk7k2yKR9UtzptSnMoGLIzNGt1RlQm81rw5DCiUys91jerha1CXkjA%2FEe2m1sRjiV%2BuXxGJQYrWi0Hc8tk5cIkTEO5Ov1OlDhqmGCfBTgIoJ3zmWHT6VQCLzkc%2B62G82HGMEr7cup%2F0w20X%2BTwsGv0Ik%2Bz6qoBBV8BhA1jIuPokid2ERA9zd2sMKG7fcxj2XRcIWAnnGQsQ2kRtvL9KKLa2sslC9%2BhPbB%2BloNVoPC5SnkWvOR5lrHTh2uMU1EQNM5NCv7%2BOFCpXb6vVlZBXopQmlBmZfLixa6v6eQG3u6Hn8quOSP2%2FQRHErCgqR7AONz2FqdGzxU7T0NLxS71eqapEZIfFoSMSrjbIsszCznIHaGVoekU2Hmp5xihplqrFBKZdtbPpVYTu8ge0dlVY%2Bm5W2gugSXgInA%2BzJYE%2FKdgLo37xBwzLGwHBfInQYa%2B1tjtGSSkzuXDC4UD8WW8rRXWfbuI3U8rdMurj50DLewfZelzyh0dqDr2nluIkWnSgx112M8wNtj%2F3%2BT5g18msJi3aGhn0TnLaD3kFGzuzjZwvbs6z5hJfZlq%2BkwJqudPZH8CNmJbTFu4io2WbQFsEsywhQ%2FXB5HfVA6cXTjxJqpq5eSYGI8RFccwwJ6HmQY6qgEW4pJ%2FlNgvA8Z6Aeq%2BuJNQgFEFK5%2Bf8eFD5dAkEeF9QOvK1cGam%2FYTvs4tX16X%2FGmE0F9CDvtfZ3OQhGHDnVxxxxxxxxxxN3800d2deR%2FCQDL15MuAVx%2F8xVLW5u%2F4q2aDp03Wcbx9ieezgMn7OVV9diba%2BHE4kpgmE%2FDfI5WLWbUqdeJWsLDj9SMHGoLmrjLfkjW8XO3Yu7kUPrFA9R1czmo0SPBnJ8lzaPA%3D%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20220914T133133Z&X-Amz-SignedHeaders=host&X-Amz-Expires=600&X-Amz-Credential=ASIA25DCYHY3TOK3YMF4%2F20220914%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=4332d7be47217b6d67448930b57c4dc276a2e04a1xxxxxxxx",
        "CodeSha256": "BsAucLoBzH0EYxiegF8mkm283hZ9eIl2Nyq3YKlnc/k=",
        "CodeSize": 3844778
    },
    "LayerArn": "arn:aws:lambda:us-east-1:<account_id>:layer:date-fns-layer",
    "LayerVersionArn": "arn:aws:lambda:us-east-1:<account_id>:layer:date-fns-layer:2",
    "Description": "add date-fns library",
    "CreatedDate": "2022-09-14T13:31:38.528+0000",
    "Version": 2,
    "CompatibleRuntimes": [
        "nodejs10.x",
        "nodejs12.x",
        "nodejs14.x",
        "nodejs16.x"
    ]
}

Lúc này bạn lên console:

Chọn add layer:

Update file index.js trên console thành như sau:

// ️ import npm package
const {format} = require('date-fns');

exports.handler = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      // ️ use npm package
      today: format(new Date(), "️ 'Today is a' eeee"),
    }),
  };
};

Lúc này, bạn testing và sẽ thấy Lambda chạy thành công