by James Beswick | on 18 NOV 2022 | in AWS Lambda, Serverless | Permalink | Share
Bài viết này được viết bởi Suraj Tripathi, Cloud Consultant, AppDevS.
Giờ đây bạn có thể phát triển các hàm AWS Lambda bằng cách sử dụng Node.js 18 runtime. Phiên bản đang trong active LTS status và được coi như chuẩn bị cho việc dùng phổ thông. Khi khởi tạo hoặc cập nhật các hàm, chỉ ra giá trị tham số của nodejs18.x hoặc sử dụng contaier phù hợp để sử dụng runtime mới này.
Phiên bản runtime được hỗ trợ bởi những hàm chạy trên Arm-based AWS Graviton2 processors hoặc các vi xử lý x86. Việc sử dụng kiến trúc của vi xử lý Graviton2 giúp bạn đạt thêm hơn 34% về tỷ lệ giá hiệu suất.
Blog này giải thích các thay đổi lớn hiện có trên Node.js 18 runtime trong Lambda.
AWS SDK cho nâng cấp phiên bản JavaScript sang v3
Các Node.js của Lambda bao gồm AWS SDK for JavaScript. Nó giúp các khách hàng sử dụng AWS SDK để kết nối các dịch vụ khác của AWS thông qua hàm mà không phải thêm AWS SDK trong hàm triển khai của chúng. Điều này đặc biệt hữu ích khi khởi tạo các hàm trong AWS Management Console. Nó cũng rất hữu dụng đối với các hàm Lambda khi được triển khai theo inline code in CloudFormation templates.
Tại Node.js 16, các Node.js runtimes của Lambda đã bao gồm AWS SDK for JavaScript version 2. Nó đã được thay thế bởi AWS SDK for JavaScript version 3, đã được phát hành lúc tháng 12 năm 2020. Với bản phát hành này, Lambda đã nâng cấp phiên bản của AWS SDK cho JavaScript bao gồm runtime từ v2 sang v3.
Nếu các hàm Lambda đang sử dụng bao gồm SDK v2, thì bạn phải cập nhật mã hàm để sử dụng SDK v3 khi nâng cấp lên Node.js runtime. Đây là hướng tiếp cận nên được thực hiện khi nâng cấp các hàm đang có sang Node.js 18. Tương tự bạn có thể sử dụng Node.js 18 runtime mà không cần cập nhật các mã nguồn cũ nếu bạn triển khai SDK v2 cùng với mã hàm.
Phiên bản 3 của SDK dành cho JavaScript cung cấp rất nhiều lợi ích so với phiên bản 2. Quan trọng hơn nhất, đối với phiên bản 3 là mô-đun, nên mã nguồn của bạn chỉ tải lên các mô-đun cần thiết. Mô-đun cũng giúp giảm kích cỡ hàm nếu bạn chọn việc triển khai SDK với mã hàm thay vì sử dụng phiên bản được xây dựng trong Lambda runtime. Tìm hiểu thêm về tối ưu hóa các Node.js dependencies trong Lambda tại đây.
Ví dụ, một hàm tương tác với Amazon S3 sử dụng v2 SDK, bạn sẽ nhập toàn bộ SDK, mặc dù bạn không sử dụng hết tất cả.
const AWS = require(“aws-sdk”);
JavaScript
Với v3 SDK, bạn chỉ cần thêm những module cần thiết chẳng hạn như ListBucketsCommand, và dịch vụ client như S3Client.
import { S3Client, ListBucketsCommand } from “@aws-sdk/client-s3”;
JavaScript
Một sự khác biệt giữa SDK v2 và SDK v3 là về thiết lập mặc định cho kết nối tái sử dụng TCP. Trong SDK v2, tái sử dụng kết nối mặc định không được bật. Trong SDK v3, nó mặc định được bật. Hầu hết các trường hợp, việc bật tái sử dụng kết nối cải thiện khả năng của hàm. Để dừng kết nối tái sử dụng TCP, thiết lập biến môi trường AWS_NODEJS_CONNECTION_REUSE_ENABLED thành false. Bạn cũng có thể giữ những kết nối trên cơ sở khách hàng cho mỗi ví dụ.
Để tìm hiểu thêm, xem tại Why and how you should use AWS SDK for JavaScript (v3) on Node.js 18.
Hỗ trợ phân giải ES module bằng cách sử dụng NODE_PATH
Một thay đổi mới trong Node.js 18 runtime được thêm vào để hỗ trợ mô-đun phân giải ES thông qua biến môi trường NODE_PATH.
Các mô-đun ES được hỗ trợ bởi Node.js 14 và Node.js 16 runtime của Lambda. Chúng cho phép tính năng chờ với bật cao nhất, có thể giảm độ trễ khởi động nguội khi được sử dụng với Provisioned Concurrency. Tuy nhiên, theo mặc định, Node.js không tìm kiếm các thư mục trong biến môi trường NODE_PATH khi nhập mô-đun ES. Điều này gây khó khăn cho việc nhập mô-đun ES từ các thư mục bên ngoài /var/task/ trong đó mã hàm được triển khai. Ví dụ: để tải AWS SDK có trong runtime dưới dạng mô-đun ES hoặc tải mô-đun ES từ Lambda layers.
Thời gian chạy Node.js 18.x run cho Lambda tìm kiếm các thư mục được liệt kê trong NODE_PATH khi tải lên mô-đun ES. Điều này giúp dễ dàng hơn khi thêm vào AWS SDK như là một ES mô-đun hoặc tải các mô-đun ES lên từ các lớp Lambda.
Các cập nhật ngôn ngữ Node.js 18
Lambda Node.js 18 runtime cũng giúp bạn tận dụng also enables you to take advantage of các tính năng mới của Node.js 18. Nó bao gồm hiệu suất được cải thiện cho các khu vực lớp và các phương pháp lớp bí mật,, JSON import assertions, và các tính năng thử nghiệm chẳng hạn như Fetch API, Test Runner module, và Web Streams API.
JSON import assertion
Tính năng import assertions cho phép các mệnh lệnh được đem của mô-đun được thêm vào các thông tin thêm cùng với bộ xác định module. Ngay bây giờ, đoạn mã bên dưới đã hợp lệ:
// index.mjs
// static import
import fooData from ‘./foo.json’ assert { type: ‘json’ };
// dynamic import
const { default: barData } = await import(‘./bar.json’, { assert: { type: ‘json’ } });
export const handler = async(event) => {
console.log(fooData)
// logs data in foo.json file
console.log(barData)
// logs data in bar.json file
const response = {
statusCode: 200,
body: JSON.stringify(‘Hello from Lambda!’),
};
return response;
};
JavaScript
foo.json
{
“foo1” : “1234”,
“foo2” : “4678”
}
JavaScript
bar.json
{
“bar1” : “0001”,
“bar2” : “0002”
}
JavaScript
Các tính năng thử nghiệm
Trong khi vẫn đang ở thử nghiệm, tính năng global fetch API hiện đang có sẵn mặc định trong Node.js 18. API bao gồm fetch function, giúp cho việc lấy các polyfills và các gói HTTP thừa từ bên thứ 3.
// index.mjs
export const handler = async(event) => {
const res = await fetch(‘https://nodejs.org/api/documentation.json’);
if (res.ok) {
const data = await res.json();
console.log(data);
}
const response = {
statusCode: 200,
body: JSON.stringify(‘Hello from Lambda!’),
};
return response;
};
JavaScript
Các tính tính năng thử nghiệm trong Node.js có thể được bật/tắt thông qua biến môi trường NODE_OPTION. Ví dụ, để dừng tính năng experimental fetch API, bạn có thể tạo ra biến môi trường Lambda NODE_OPTIONS và thiết lập giá trị thành –no-experimental-fetch.
Với thay đổi này, nếu bạn chạy các mã trước đó với fetch API trong hàm Lambda, nó sẽ báo lỗi tham chiếu vì tính năng thử nghiệm fetch API hiện đang không được cho phép.
Kết luận
Node.js 18 hiện được hỗ trợ bởi Lambda. Khi xây dựng các hàm Lambda bằng cách sử dụng kiểu đóng gói lưu trữ zip, sử dụng các giá trị tham số runtime của nodejs18.x để bắt đầu xây dựng Node.js 18.
Bạn cũng có thể xây dựng các hàm trong Node.js 18 bằng cách triển khai hàm mã như một container image bằng cách sử dụng Node.js 18 AWS base image for Lambda. Bạn có thể tìm hiểu thêm về việc viết các hàm trong Node.js 18 bằng cách đọc về mô hình lập trình Node.js trong tài liệu Lambda.
Đối với các hàm Node.js, xem mã của bạn tại compatibility with Node.js 18, including deprecations, sau đó dịch chuyển đến runtime mới bằng cách thay đổi cấu hình runtime của hàm cho nodejs18.x
Xem thêm về các tài liệu liên quan đến serverless, xem tại Serverless Land.
TAGS: contributed, serverless