Getting Started with AWS Lambda & Node.js

Trong bài viết này chúng ta sẽ thảo luận về serverless programming và làm thế nào để bắt đầu với AWS Lambda như 1 Node.js Developer.

Kể từ khi AWS Lambda ra đời nằm 2014, serverless (hay FaaS - Function as a Service) computing đã dần trở nên phổ biến hơn. Nó cho phép bạn tập trung vào chức năng của ứng dụng mà không phải cần phải lo lắng về cơ sở hạ tầng máy chủ của bạn.

Trong những năm qua, hầu hết các nhà cung cấp điện toán đám mây bắt đầu cung cấp phiên bản serverless riêng của họ: Microsoft ra mắt Azure Functions trong khi Google ra mắt Cloud Functions. IBM cũng cho phát hành một phiên bản mã nguồn mở của serverless, được gọi là OpenWhisk.

Serverless Computing

Serverless là loại kiến trúc hướng sự kiện (event-driven architecture) - functions sẽ được gọi khi có sự kiện cụ thể được kích hoạt. Theo phát biểu của AWS, nó có thể là một sự kiện được gọi S3, SNS hoặc API Gateway.

Lifecycle events của AWS Lambda functions

AWS Lambda functions được thực thi trong 1 môi trường độc lập, giống như containers.

Môi trường này được cung cấp với các tài nguyên được chỉ định trong cấu hình các functions (như memory size).

AWS Lambda quản lý một cách khác biệt khi bạn gọi chức năng lambra trong lần đầu tiên và cuộc gọi sau đó đến cùng một Lambda function

Calling Lambda function mới lần đầu tiên

Khi bạn triển khai Lambda function mới (hoặc cập nhật Lambda function đã có sẵn), một container mới sẽ được tạo ra.

Code của bạn sẽ được di chuyển vào container, và initialization code sẽ chạy trước khi yêu cầu đầu tiên được xử lý.

Lambda function có thể được hoàn thành trong các trường hợp sau:
  • timeout - hết thời gian timeout của ứng dụng (mặc định 5s),
  • controlled termination - hàm callback của function được gọi,
  • default termination - nếu tất cả các hàm callbacks kết thúc xử lý (thậm chí cả khi hàm callback của function chưa được gọi),
  • crashing the process.

Các lần calling tiếp theo đến Lambda function hiện có

Đối với các lần calls tiếp theo, Lambda có thể quyết định tạo các container mới để phục vụ các yêu cầu của bạn. Trong trường hợp này, quá trình tương tự sẽ xảy ra như mô tả ở trên, như lần gọi đầu tiên.

Tuy nhiên, nếu bạn không thay đổi chức năng Lambda và thời gian giữa các lần gọi là nhỏ, Lambda có thể sử dụng lại container. Bằng cách này, nó tiết kiệm được thời gian khởi tạo, và chỉ việc quay lại container với code đã có sẵn trong đó.

Building your first function

Sau khi hiểu rõ được vòng sự kiện của Lambda function, ngay bây giờ chúng ta sẽ tiến hành triển khai Lambda function thực tế nhé!

Cùng xem xét 1 ví dụ của AWS Lambda function (in Node.js)

/* Initialization part starts here */
const mysql      = require('mysql')
const connection = mysql.createConnection({
  host     : process.env.MYSQL_HOST,
  user     : process.env.MYSQL_USER,
  password : process.env.MYSQL_PASSWORD,
  database : process.env.MYSQL_DB
})
/* Initialization part ends here */

/* Handler function starts here */
exports.handler = (event, context, callback) => {
  const sql = 'SELECT * FROM users WHERE id = ' + connection.escape(event.userId)
  connection.query(sql, function (error, results, fields) {
    if (error) {
      return callback(error)
    }
    callback(null, results)
  })
}
/* Handler function ends here */

Xem xét đoạn code trên nhé:

  • initialization - đoạn code sẽ chỉ chạy 1 lần cho mỗi lần tạo container. Chúng ta có thể đặt các kết nối tới CSDL ở đây.
  • handler function - function này sẽ được gọi mỗi khi Lambda function được thực hiện.
    • event - biến này được Lambda sử dụng để truyền dữ liệu sự kiện cho trình xử lý (như HTTP request).
    • context - biến context được sử dụng để truyền thông tin thời gian chạy cho hàm Lambda, như khoảng thời gian còn lại trước khi function ngừng hoạt động.
    • callback - Bằng cách sử dụng nó, bạn có thể trả lại dữ liệu một cách rõ ràng cho người gọi (như 1 HTTP response)

Deploying AWS functions

Sau khi có được 1 Lambda function, chúng ta sẽ nghĩ đến việc triển khai nó lên server.

Đến đây thì rắc rối bắt đầu xuất hiện? Vì sao ư? Hãy cùng phân tích nhé.

Mặc định, để AWS Lambda làm việc với HTTP như ví dụ trên, bạn phải quản lý không chỉ là AWS Lambda function, mà còn cả API Gateway.

Cách thông thường nhất để deploy là tài lên tệp ZIP, để thay thế phiên bản cũ của AWS Lambda function. Nhưng để cho đơn giản, tôi khuyến nghị bạn dùng Serverless framework.

Serverless framework

Serverless framework là 1 open-source, giải pháp được MIT cấp phép. Serverless giúp bạn tạo và cấu hình tất cả các tài nguyên cần thiết để chạy các Lambda function.

Để khởi tạo Serverless project, các bạn chỉ cần chạy các lệnh sau:

# 1. Create a new Serverless project:
~$ serverless create --template aws-nodejs --path my-service
# 2. Change into the newly created directory
~$ cd my-service
# 3. Install npm dependencies
~$ npm install
# 4. Deploy
~$ serverless deploy

Kết quả của các lệnh trên sẽ tạo ra file serverless.yml trong thư mục root của application để lưu trữ các mô tả của service (trông như route mapping với functions) cũng như thư mục .serverless, chứa các file CloudFormation, ZIP được triển khai.

Nhược điểm của AWS Lambda

Vendor control / lock-in

Khi bạn bắt đầu sử dụng serverless, bạn sẽ phải từ bỏ kiểm soát hệ thống của mình với cloud provider. Trong trường hợp cúp điện, bạn sẽ bị ảnh hưởng nhiều nhất.

Ngoài ra, khi lựa chọn một trong hai giải pháp, sẽ có sự khác biệt về giao diện FaaS. Vì vậy, khi bạn thay đổi nhà cung cấp dịch vụ thì codebase của bạn sẽ phải thay đổi phần nào đó.

Multitenancy

Ưu điểm của AWS Lambda

Giảm chi phí hoạt động

Bạn có thể nghĩ về Serverless Computing như là một cơ sở hạ tầng bên ngoài mà về cơ bản bạn đang trả tiền cho ai đó để quản lý máy chủ của mình.

Vì bạn đang sử dụng một dịch vụ mà nhiều công ty khác cũng đang sử dụng, nên chi phí giảm xuống. Giảm chi phí biểu hiện ở hai khía cạnh, cơ sở hạ tầng và chi phí nhân lực vì bạn sẽ dành ít thời gian hơn để bảo trì server của mình.

Giảm chi phí mở rộng

Horizontal scaling diễn ra tự động, và bạn sẽ chỉ phải trả cho các nguồn lực mà bạn thực sự sử dụng, serverless có thể giảm chi phí rất lớn cho bạn.

Hãy tưởng tượng đến kịch bản khi bạn gửi email marketing/sales hàng tuần và kết quả về lượng traffic cao nhất xuất hiện chỉ sau vài giờ mà bạn gửi email

Quản lý hoạt động dễ dàng

Khi logic việc auto-scaling được thực hiện bởi nhà cung cấp, bạn thậm chí không cần phải nghĩ tới việc horizontal scaling - bạn chỉ cần viết nó theo cách mà nó có thể horizontal scaling, việc còn lại sẽ có người khác lo (ở đây là các nhà cung cấp dịch vụ như AWS Lambda)

Kết luận

Tôi hy vọng sau khi đọc bài viết này, bạn đã trở nên tò mò về những gì Serverless và AWS Lambda có thể làm cho bạn. Nếu đúng như vậy, tôi khuyên bạn nên tìm hiểu thêm các tài liệu liên quan sau đây:

Xin cảm ơn! Và hẹn gặp lại!