Monday, June 17, 2024

[AWS] Lambda

-

Why AWS Lambda?

Amazon EC2 (Elastic Compute Cloud) là dịch vụ cung cấp máy ảo (virtual server) trong đám mây của AWS. Với EC2, bạn có thể tạo, chạy và quản lý máy ảo của mình. Các máy ảo này giới hạn bởi khả năng xử lý CPU và RAM của chúng. EC2 được sử dụng để cung cấp các ứng dụng web, cơ sở dữ liệu, ứng dụng doanh nghiệp và nhiều ứng dụng khác.

Trong khi đó, Amazon Lambda là dịch vụ tính toán “serverless” của AWS. Lambda cho phép bạn chạy mã (code) trực tiếp trong môi trường đám mây của AWS mà không cần quản lý, cấu hình hoặc duy trì bất kỳ máy chủ nào. Nó cho phép bạn chạy các hàm (function) ngắn, chạy on-demand và được kích hoạt thông qua các sự kiện như các truy vấn API, sự kiện S3 hoặc các tương tác khác.

Tương tự như EC2, Lambda cũng có khả năng scale out để xử lý tải lớn một cách tự động mà không yêu cầu sự can thiệp của người quản trị, điều này giúp bạn tiết kiệm chi phí và tối ưu hoá tài nguyên. Tuy nhiên, điểm khác biệt của Lambda là nó giới hạn thời gian cho việc thực thi hàm và thường được sử dụng cho các nhiệm vụ tính toán ngắn hạn, như xử lý dữ liệu, gửi email, hoặc tương tác với các dịch vụ khác của AWS.

Benefits of AWS Lambda?

Amazon Lambda là một dịch vụ tính toán đám mây, cho phép người dùng chạy mã hoàn toàn trong môi trường ảo hóa và không cần phải quản lý máy chủ. Mã được chạy bằng cách kích hoạt các hàm Lambda bằng cách truyền các sự kiện tới các hàm Lambda này.

Một số ưu điểm của Amazon Lambda bao gồm:

  • Giá cả phù hợp: Amazon Lambda cho phép người dùng thanh toán theo yêu cầu và thời gian tính toán. Ngoài ra, dịch vụ này còn có gói miễn phí bao gồm 1 triệu lượt yêu cầu và 400,000 GBs thời gian tính toán.
  • Tích hợp với các dịch vụ khác trong AWS: Amazon Lambda tích hợp tốt với các dịch vụ khác trong AWS như Amazon S3, Amazon API Gateway, Amazon DynamoDB, v.v. Tích hợp này giúp cho việc triển khai ứng dụng trở nên đơn giản và hiệu quả hơn.
  • Hỗ trợ nhiều ngôn ngữ lập trình: Amazon Lambda hỗ trợ nhiều ngôn ngữ lập trình, bao gồm Node.js, Python, Java, Go, Ruby, PowerShell, v.v.
  • Dễ dàng quan sát: Amazon Lambda hỗ trợ việc giám sát thông qua AWS CloudWatch, cho phép người dùng quản lý, theo dõi và phân tích log.
  • Dễ dàng tăng tài nguyên cho các hàm Lambda: Amazon Lambda cho phép người dùng tăng tài nguyên cho các hàm Lambda một cách dễ dàng, bao gồm tối đa 10GB bộ nhớ RAM. Tăng RAM cũng sẽ cải thiện CPU và mạng.

AWS Lambda language support.

AWS Lambda hỗ trợ nhiều ngôn ngữ lập trình khác nhau để người dùng có thể dễ dàng viết các hàm Lambda của mình bằng ngôn ngữ yêu thích của họ. Các ngôn ngữ hỗ trợ bao gồm:

  • Node.js (JavaScript): là ngôn ngữ phổ biến trong lập trình web, đặc biệt là khi làm việc với các framework như Express hoặc React.
  • Python: là một ngôn ngữ lập trình đa năng, có thể được sử dụng trong các ứng dụng web, khoa học dữ liệu, máy học và các lĩnh vực khác.
  • Java (Java 8 compatible): là một ngôn ngữ lập trình phổ biến và được sử dụng rộng rãi trong các ứng dụng doanh nghiệp.
  • C# (.NET Core): là một ngôn ngữ lập trình phổ biến trong việc phát triển các ứng dụng Windows và các ứng dụng doanh nghiệp.
  • Golang: là một ngôn ngữ lập trình đơn giản, hiệu quả và được sử dụng rộng rãi trong việc xây dựng các ứng dụng đám mây.
  • C# / Powershell: là các ngôn ngữ lập trình phổ biến trong việc quản lý hệ thống và tự động hóa.
  • Ruby: là một ngôn ngữ lập trình được sử dụng rộng rãi trong việc phát triển các ứng dụng web.
  • Custom Runtime API: là một API được cung cấp bởi cộng đồng để hỗ trợ các ngôn ngữ lập trình khác, ví dụ như Rust.
  • Lambda Container Image: cho phép người dùng chạy các ứng dụng Docker bên trong các hàm Lambda của mình. Các hình ảnh container phải triển khai Lambda Runtime API.

Ngoài các ngôn ngữ lập trình trên, AWS Lambda còn tích hợp với toàn bộ các dịch vụ của AWS và cung cấp cho người dùng các lợi ích như giá cả linh hoạt (trả tiền theo số lần gọi và thời gian tính toán), miễn phí 1 triệu lần gọi và 400,000 giây tính toán trong tầm 12 tháng đầu tiên, quản lý dễ dàng thông qua AWS CloudWatch, hỗ trợ mở rộng tự động và nhiều tài nguyên có thể được cấp cho các hàm Lambda của bạn (lên đến 10GB RAM). Nâng cấp RAM cũng sẽ cải thiện CPU và mạng.

AWS Lambda Integrations Main ones.

Các tích hợp chính của AWS Lambda bao gồm:

  • Amazon API Gateway: Tạo và quản lý các API RESTful để truy cập Lambda function thông qua HTTP hoặc HTTPS.
  • AWS Step Functions: Tạo và quản lý các ứng dụng dựa trên luồng công việc (workflow-based applications) bằng cách sử dụng Lambda function làm các bước trong quá trình.
  • Amazon S3: Thực thi các hàm Lambda trên các sự kiện S3, chẳng hạn như tải lên file.
  • Amazon Kinesis: Thực thi các hàm Lambda trên dữ liệu trong luồng Kinesis Data Streams.
  • Amazon DynamoDB: Thực thi các hàm Lambda trên các sự kiện DynamoDB, chẳng hạn như thêm, sửa đổi hoặc xóa dữ liệu.
  • Amazon SNS và SQS: Thực thi các hàm Lambda trên các thông báo đến từ Amazon SNS hoặc các tin nhắn trong hàng đợi SQS.
  • AWS CloudFormation: Sử dụng các hàm Lambda để mở rộng chức năng của CloudFormation thông qua các tùy chỉnh được xác định bởi người dùng.
  • AWS CloudTrail: Thực thi các hàm Lambda trên các sự kiện tạo, sửa đổi hoặc xóa các tài nguyên trong tài khoản AWS của bạn.
  • AWS CodePipeline: Sử dụng các hàm Lambda để tùy chỉnh các bước trong đường ống triển khai (deployment pipeline) của CodePipeline.

Các tích hợp này cho phép Lambda function tương tác với các dịch vụ khác của AWS để tạo ra các ứng dụng phức tạp hơn và hiệu quả hơn.

Example: Serverless Thumbnail creation.

Đây là một ví dụ về việc sử dụng Serverless trong AWS Lambda để tạo các thumbnail cho các hình ảnh mới được tải lên S3.

Khi một hình ảnh mới được tải lên S3, nó sẽ kích hoạt một hàm AWS Lambda được đăng ký trước đó. Hàm này sẽ lấy hình ảnh gốc và tạo ra các thumbnail với các kích thước khác nhau. Sau khi các thumbnail đã được tạo, chúng sẽ được đẩy trở lại S3 với tên mới và được lưu trữ cùng với các thông tin về file hình ảnh, chẳng hạn như tên file, kích thước và ngày tạo.

Thông tin này sẽ được lưu trữ trong cơ sở dữ liệu NoSQL DynamoDB để tiện theo dõi và tìm kiếm. Vì DynamoDB là một dịch vụ quản lý cơ sở dữ liệu được quản lý đầy đủ bởi AWS, việc tích hợp nó với Lambda rất đơn giản.

Quá trình này hoàn toàn được tự động hóa và không cần phải quản lý máy chủ hay cơ sở hạ tầng. Do đó, việc triển khai các ứng dụng như vậy rất nhanh chóng và dễ dàng.

Example: Serverless CRON Job.

Serverless CRON Job là một trong những ứng dụng phổ biến của AWS Lambda. Đây là một kịch bản mà một hàm AWS Lambda được kích hoạt định kỳ với một khoảng thời gian nhất định.

Một ví dụ về Serverless CRON Job là sử dụng CloudWatch Events EventBridge để kích hoạt một hàm AWS Lambda để thực hiện một tác vụ sau mỗi giờ. Khi một sự kiện được kích hoạt, nó sẽ gọi hàm AWS Lambda được liên kết và thực thi nó. Hàm này có thể được thiết kế để thực hiện một loạt các tác vụ, chẳng hạn như xử lý dữ liệu, gửi email, cập nhật cơ sở dữ liệu, tải xuống và xử lý file, v.v.

Ví dụ, một hàm AWS Lambda có thể được sử dụng để quét và xóa các file cũ hơn một tuần trên Amazon S3. Hàm này được đặt lịch để chạy định kỳ vào mỗi giờ bằng cách sử dụng CloudWatch Events EventBridge. Khi hàm được kích hoạt, nó sẽ thực hiện việc quét và xóa các file cũ hơn một tuần trên Amazon S3 và báo cáo kết quả vào một cơ sở dữ liệu, chẳng hạn như Amazon DynamoDB.

Việc sử dụng Serverless CRON Job giúp giảm thiểu thời gian và chi phí cho việc quản lý máy chủ và giúp các nhà phát triển tập trung vào việc phát triển mã nguồn của mình mà không cần lo lắng về hạ tầng.

AWS Lambda Pricing: example.

AWS Lambda có mô hình giá tính theo số lượng lượt gọi (requests) và thời gian tính theo giây (duration). Với mô hình tính giá như sau:

  • Lượt gọi (requests): 1 triệu lượt gọi đầu tiên được miễn phí, sau đó là 0,20 đô la cho mỗi triệu lượt gọi tiếp theo, tương đương với 0,0000002 đô la cho mỗi lượt gọi.
  • Thời gian tính theo giây (duration): Miễn phí 400.000 giây tính theo bộ nhớ (GB-seconds) mỗi tháng. Ví dụ, nếu một hàm Lambda chạy với bộ nhớ 1GB, thời gian miễn phí là 400.000 giây. Tương đương với 3.200.000 giây nếu bộ nhớ là 128MB. Sau đó, giá là 1 đô la cho 600.000 GB-seconds.

Thường thì chi phí để chạy AWS Lambda rất rẻ, đặc biệt là trong các trường hợp với lưu lượng truy cập thấp. Điều này làm cho AWS Lambda trở thành một giải pháp phổ biến cho các ứng dụng serverless.

AWS Lambda Limits to Know – per region.

Đây là các hạn chế về cấu hình cho các hàm Lambda trên AWS.

Về phần thực thi, hạn chế bao gồm:

  • Phân bổ bộ nhớ từ 128 MB đến 10GB với bước nhảy là 1MB.
  • Thời gian thực thi tối đa là 900 giây (tương đương với 15 phút).
  • Các biến môi trường tối đa là 4 KB.
  • Khả năng lưu trữ trên ổ đĩa của “function container” (trong /tmp): từ 512 MB đến 10 GB.
  • Số lượng thực thi đồng thời (concurrency executions) là 1000 và có thể tăng lên.

Về phần triển khai, các hạn chế bao gồm:

  • Dung lượng triển khai hàm Lambda (nén .zip): 50 MB.
  • Kích thước của triển khai không nén (bao gồm cả mã và các phụ thuộc): 250 MB.
  • Có thể sử dụng thư mục /tmp để tải các file khác khi khởi động.
  • Kích thước của các biến môi trường không vượt quá 4 KB.

Thực hành.

Khi bạn vào AWS Lambda, giao diện đầu tiên mà bạn gặp sẽ như thế này. Bạn sẽ nhìn thấy 1 urlt như sau https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/discover, để ý phần cuối bạn sẽ thấy discover.

Vẫn là url đó bạn hãy thay đổi discover thành begin, bạn sẽ có url mới là https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/begin, bấm enter và bạn truy cập được giao diện như dưới. Tại phần How it works bạn sẽ thấy các ngôn ngữ mà AWS Lambda hỗ trợ đó là .NET Core, Java, Go, Node.js, Python, Ruby, Custom runtime.

Ví dụ mình chọn python để demo, ở đây AWS Lambda đã cho bạn 1 đoạn code mẫu, mình sử dụng đoạn code mẫu này và bấm vào Run để chạy thử và bạn có kết quả xuất ra đoạn text “Hello from Lambda!” như dưới.

Khi bạn bấm vào Next: Lambda responds to events bạn sẽ thấy Lambda phản hồi các sự kiện, chúng ta có thể thấy được các sự kiện diễn ra trực quan hơn.

Các tùy chọn “Author from scratch”, “Use a blueprint”, “Container image” và “Browse serverless app repository” đều là các cách để tạo các ứng dụng serverless trên AWS Lambda.

  • “Author from scratch” cho phép tạo ứng dụng serverless hoàn toàn từ đầu, bắt đầu từ việc lựa chọn ngôn ngữ lập trình và quản lý tài nguyên.
  • “Use a blueprint” cung cấp các bản mẫu hoàn chỉnh của các ứng dụng serverless, có thể được sử dụng để khởi động và tùy chỉnh nhanh chóng các ứng dụng serverless.
  • “Container image” cho phép sử dụng các hình ảnh Docker để triển khai ứng dụng serverless, giúp đơn giản hóa quá trình triển khai và quản lý ứng dụng.
  • “Browse serverless app repository” là một thư viện các ứng dụng serverless được chia sẻ bởi cộng đồng, giúp giảm thiểu thời gian và công sức cần thiết để phát triển các ứng dụng serverless.

Tất cả các tùy chọn này đều giúp cho việc tạo các ứng dụng serverless trên AWS Lambda trở nên đơn giản và nhanh chóng hơn. Trường hợp của mình, mình sẽ lựa chọn Blueprints và lựa chọn 1 mẫu có sẵn tên hello-world-python sau đó bấm vào Configure.

Tại Function name đặt tên cho function của bạn. Khi tạo một Lambda function, bạn cần phải cấp cho nó một IAM role để có quyền truy cập các tài nguyên khác trong AWS như S3, DynamoDB, hay các dịch vụ khác. Có ba tùy chọn để tạo IAM role cho Lambda function:

  • Create a new role with basic Lambda permissions: Khi sử dụng tùy chọn này, Lambda sẽ tạo ra một IAM role mới cho bạn với các quyền cơ bản để thực hiện các hoạt động Lambda. Điều này giúp đơn giản hóa quá trình tạo Lambda function.
  • Use an existing role: Tùy chọn này cho phép bạn sử dụng một IAM role đã có để gán cho Lambda function. Nếu bạn đã có một IAM role với các quyền phù hợp, bạn có thể sử dụng lại nó thay vì tạo mới.
  • Create a new role from AWS policy templates: Tùy chọn này cho phép bạn tạo một IAM role mới với các quyền được định nghĩa trước từ AWS Policy Templates. Bạn có thể chọn các template cho các dịch vụ cụ thể, hoặc một số template chung như ReadOnlyAccess, AdminAccess, hay PowerUserAccess.

Lambda function code chứa mã (code) để thực thi chức năng cụ thể của Lambda function. Điều này có thể là bất cứ thứ gì từ việc xử lý một sự kiện đến tạo ra một kết quả đầu ra. Mã trong Lambda function có thể được viết bằng nhiều ngôn ngữ lập trình khác nhau như Node.js, Python, Java, C#, Ruby và Golang.

Khi bấm Create function, bạn nhận được thông báo “Successfully created th e function demo-lambda. You can now change its code and configuration. To invoke your function with a test event, choose Test,“. Thông báo này cho biết rằng Lambda function đã được tạo thành công và bạn có thể thay đổi mã và cấu hình của nó. Để kiểm tra xem Lambda function hoạt động như thế nào, bạn có thể sử dụng tính năng “Test” để thực hiện một sự kiện kiểm tra.

Mình sẽ tạo 1 sự kiện với thông tin như dưới, hãy bấm Create để tạo sự kiện này. Sau khi bấm Create một thông báo “The test event DemoEvent was successfully saved.” cho biết 1 sự kiện đã được lưu thành công.

Bây giờ hãy bấm vào Test bạn sẽ có 1 kết quả trả về và đó chính là kết quả của câu lệnh print trong đoạn code của mình.

Bạn có thể bấm vào Configuration › Edit để có thể thay đổi một số thông tin.

  • Memory (MB): bộ nhớ càng cao thì tốc độ xử lý càng nhanh.
  • Timeout: Thời gian chờ và thời gian chờ tối đa là 15 phút.
  • Execution role: Cho phép bạn tạo mới role hoặc sử dụng role có sẵn.

Bạn có thể giám sát Lambda function code của bạn tại thẻ Monitor › Metrics.

Hoặc xem các logs sự kiện tại Monitor › Logs.

Khi nhấp vào 1 logs bất kỳ bạn sẽ được dẫn tới 1 url mô tả chi tiết log.

Nếu bạn muốn sửa code bạn chỉ cần chỉnh sửa code như bình thường.

Sau đó bấm vào Deploy, thông báo Changes deployed cho biết bạn đã thay đổi code và triển khai vào Lambda function thành công.

Khi bạn bấm Test bạn sẽ thấy kết quả lỗi trả về như trong code chúng ta đã khai báo.

Lý do nó biết hàm lambda_handler để thực thi, đó là do ở phần Runtime settings, tại phần Handler bạn nhìn thấy lambda_function.lambda_handler tức là nó sẽ thực thi file có tên là lambda_function.py và gọi hàm lambda_handler có trong file này để thực thi.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories