AWS serverless basics

Serverless là gì?

Serverless là một mô hình điện toán đám mây hiện đại, trong đó nhà cung cấp dịch vụ quản lý toàn bộ cơ sở hạ tầng, cho phép các nhà phát triển tập trung vào việc viết code mà không cần lo lắng về vấn đề quản lý máy chủ.

Các đặc tính của serverless

Điểm nổi bật của serverless là:

  • Không cần cung cấp hoặc quản lý máy chủ, giúp giảm đáng kể công việc vận hành.

  • Hệ thống serverless tự động mở rộng theo mức độ sử dụng, đảm bảo hiệu suất ổn định khi lưu lượng tăng đột biến.

  • Một ưu điểm quan trọng khác là bạn chỉ trả tiền cho tài nguyên thực sự sử dụng, không phải trả cho thời gian máy chủ không hoạt động. N

  • Ngoài ra, các nền tảng serverless thường có sẵn tính sẵn sàng cao và khả năng chịu lỗi, giúp ứng dụng của bạn luôn hoạt động ổn định mà không cần can thiệp thủ công.

Các thành phần quan trọng của nền tảng serverless trên AWS:

Diagram showing AWS serverless platform components

Serverless vs. Monolithic

Trước đây, mô hình ứng dụng phổ biến là Monolithic. Trong kiến trúc monolithic, toàn bộ ứng dụng được xây dựng như một khối thống nhất, với tất cả các thành phần và chức năng được đóng gói cùng nhau. Điều này giúp dễ phát triển và triển khai ban đầu, nhưng có thể gây khó khăn khi cần mở rộng hoặc cập nhật từng phần riêng lẻ.

Decorative image showing a the internal and external complexity of a traditional web application framework and related services such as Data, 3rd Party, and Storage.

Ngược lại, serverless là một mô hình điện toán đám mây hiện đại, trong đó nhà cung cấp quản lý toàn bộ cơ sở hạ tầng, cho phép nhà phát triển tập trung vào viết code. Điểm then chốt của ứng dụng serverless là kiến trúc hướng sự kiện. Trong mô hình này, các chức năng độc lập được kích hoạt bởi các sự kiện cụ thể, như yêu cầu HTTP hoặc thay đổi dữ liệu. Cách tiếp cận này giải quyết các vấn đề liên quan đến các tác vụ bất đồng bộ và gỡ lỗi của ứng dụng monolithic. Thay vì xử lý tuần tự như trong monolithic, serverless cho phép xử lý đồng thời nhiều tác vụ độc lập, cải thiện hiệu suất và khả năng mở rộng. Việc chia nhỏ ứng dụng thành các chức năng riêng biệt cũng giúp dễ dàng xác định và sửa lỗi hơn, khắc phục những khó khăn trong việc gỡ lỗi các ứng dụng monolithic phức tạp. Tuy nhiên, thiết kế ứng dụng serverless đòi hỏi cách tư duy khác về kiến trúc phần mềm và quản lý trạng thái.

Diagram of flow for a microservice. A client box with Web & Mobile labels, connects by an arrow to an API Gateway (HTTP) block. API Gateway block connects by an arrow with red diamond with text "Event" inside to a Lambda (compute) box. Lambda box is connected by double ended arrow with an API label to a DynamoDB (Data) icon. Lambda box is also connected by an arrow with a different colored "event" diamond back to API Gateway. API Gateway connects through a lighter arrow back to the Client.

Serverless Anti-patterns

Mặc dù serverless có nhiều ưu điểm, nhưng nó không phải là giải pháp hoàn hảo cho mọi tình huống. Có một số trường hợp serverless có thể không phải là lựa chọn tối ưu:

  • Nếu mục tiêu của bạn là tránh thay đổi kiến trúc ứng dụng hiện có, serverless có thể không phù hợp vì nó thường đòi hỏi tái cấu trúc đáng kể.

  • Đối với các ứng dụng yêu cầu độ trễ cực thấp cho mọi requests, serverless có thể gặp khó khăn, ví dụ như khi bạn sử dụng Lambda thì sẽ bị mất một khoảng thời gian để Lambda có thể chuẩn bị môi trường compute - khoảng thời gian này được gọi là cold start time.

  • Nếu một số khía cạnh của ứng dụng vượt quá giới hạn của dịch vụ serverless - ví dụ như một hàm cần thời gian thực thi lâu hơn giới hạn thời gian chạy của AWS Lambda (15 phút) - thì serverless có thể không phải là lựa chọn phù hợp.

Trong những trường hợp này, các kiến trúc truyền thống hoặc container có thể là giải pháp tốt hơn.

Các trường hợp sử dụng serverless

Dưới đây là một số trường hợp sử dụng phổ biến của serverless:

  • Xử lý dữ liệu theo thời gian thực: Như phân tích luồng dữ liệu, xử lý logs

  • Ứng dụng web và API: Đặc biệt là các API có lưu lượng biến động

  • Xử lý hàng loạt và tác vụ định kỳ: Như báo cáo hàng ngày, sao lưu dữ liệu

  • Tích hợp IoT: Xử lý dữ liệu từ các thiết bị IoT

  • Xử lý đa phương tiện: Như chuyển đổi video, xử lý hình ảnh

  • Microservices: Triển khai và quản lý các dịch vụ nhỏ, độc lập

Các trường hợp này tận dụng được ưu điểm của serverless như khả năng mở rộng tự động, chi phí dựa trên sử dụng thực tế, và giảm thiểu công tác quản lý hạ tầng.

Năng lực serverless của AWS

AWS cung cấp một bộ công cụ serverless toàn diện, cho phép phát triển và triển khai ứng dụng mà không cần quản lý cơ sở hạ tầng. Các khả năng chính bao gồm:

  • Lớp tính toán serverless hiệu suất cao, có khả năng mở rộng và đáng tin cậy

  • Lớp lưu trữ có tính sẵn sàng cao, bền vững và có thể mở rộng

  • Hỗ trợ các workload serverless phi tập trung và có khả năng mở rộng

  • Giải pháp điều phối để quản lý trạng thái và luồng công việc

  • Tích hợp giữa các dịch vụ serverless

  • Bộ sưu tập các framework mô hình hóa ứng dụng phù hợp với mục đích sử dụng

Những khả năng này cho phép các nhà phát triển tập trung vào việc xây dựng ứng dụng mà không phải lo lắng về việc quản lý server, đồng thời đảm bảo hiệu suất và khả năng mở rộng.

Giới thiệu 1 số dịch vụ Serverless của AWS

Event driven architecture

Trước tiên, chúng ta hãy tìm hiểu về khái niệm Kiến trúc hướng sự kiện (Event-driven Architecture)

Kiến trúc hướng sự kiện (Event-driven Architecture) là một mô hình thiết kế phần mềm trong đó các thành phần của hệ thống giao tiếp với nhau thông qua việc tạo ra và phản ứng với các sự kiện. Các đặc điểm chính của kiến trúc này bao gồm:

  • Phi kết nối (Decoupling): Các thành phần hoạt động độc lập, không cần biết về nhau trực tiếp.

  • Khả năng mở rộng (Scalability): Dễ dàng thêm hoặc loại bỏ các thành phần mà không ảnh hưởng đến toàn bộ hệ thống.

  • Linh hoạt (Flexibility): Có thể thích ứng nhanh chóng với các yêu cầu thay đổi.

  • Phản ứng thời gian thực (Real-time responsiveness): Xử lý sự kiện ngay khi chúng xảy ra.

  • Khả năng chịu lỗi (Fault tolerance): Hệ thống có thể tiếp tục hoạt động ngay cả khi một số thành phần gặp sự cố.

AWS cung cấp nhiều dịch vụ serverless hỗ trợ kiến trúc hướng sự kiện, ví dụ:

  • AWS Lambda: Thực thi mã để xử lý sự kiện mà không cần quản lý server.

  • Amazon EventBridge: Điều phối sự kiện giữa các ứng dụng AWS và các dịch vụ bên ngoài.

  • Amazon SNS (Simple Notification Service): Truyền thông điệp và thông báo giữa các thành phần.

  • Amazon SQS (Simple Queue Service): Quản lý hàng đợi tin nhắn để đảm bảo xử lý đáng tin cậy.

  • Amazon DynamoDB Streams: Theo dõi và phản ứng với các thay đổi trong cơ sở dữ liệu.

Ví dụ: Một ứng dụng thương mại điện tử có thể sử dụng Lambda để xử lý đơn hàng, EventBridge để điều phối sự kiện giữa các microservices, SNS để gửi thông báo cho khách hàng, và DynamoDB Streams để cập nhật trạng thái đơn hàng trong thời gian thực. Kiến trúc này cho phép ứng dụng xử lý khối lượng lớn giao dịch một cách hiệu quả và linh hoạt.

AWS Lambda

AWS Lambda là một dịch vụ điện toán serverless của Amazon Web Services. Nó cho phép bạn chạy code mà không cần quản lý hoặc cung cấp máy chủ. Với Lambda, bạn chỉ cần tải lên code của mình, và dịch vụ sẽ tự động xử lý mọi thứ cần thiết để chạy.

Các ưu điểm chính của AWS Lambda bao gồm:

  • Tự động mở rộng: Lambda tự động điều chỉnh theo lượng yêu cầu

  • Chỉ trả tiền cho thời gian thực thi: Bạn chỉ bị tính phí cho thời gian mã của bạn thực sự chạy

  • Hỗ trợ nhiều ngôn ngữ lập trình: Bao gồm Node.js, Python, Java, C#, và nhiều ngôn ngữ khác

  • Tích hợp dễ dàng: Có thể kết nối với nhiều dịch vụ AWS khác

Lambda là một dịch vụ lý tưởng cho các tác vụ ngắn hạn và xử lý sự kiện.

AWS Lambda hỗ trợ ba mô hình thực thi chính:

  1. Đồng bộ (Synchronous): Lambda được kích hoạt trực tiếp thông qua API Gateway, thích hợp cho các yêu cầu cần phản hồi ngay lập tức.

  2. Bất đồng bộ (Asynchronous): Lambda được kích hoạt bởi các sự kiện từ các dịch vụ như SNS hoặc S3, cho phép xử lý không đồng bộ và linh hoạt hơn. Lưu ý rằng, chỉ khi các dịch vụ của AWS trigger Lambda, thì Lambda mới sử dụng Asynchronous execution model, nếu do client hoặc người dùng cuối trigger, thì AWS Lambda sẽ sử dụng Synchronous execution model.

  3. Dựa trên luồng (Stream-based): Lambda xử lý dữ liệu từ các nguồn luồng như DynamoDB hoặc Kinesis, phù hợp cho việc xử lý dữ liệu theo thời gian thực.

Mỗi mô hình này phục vụ cho các trường hợp sử dụng khác nhau, cho phép Lambda thích ứng với nhiều loại ứng dụng và yêu cầu xử lý khác nhau.

Các thành tố của AWS Lambda function

Chapter 2: What is the event & context? - AWS Lambda for Python Developers

Một Lambda function trong AWS có ba thành phần chính:

  1. Handler() function: Đây là hàm chính được thực thi khi Lambda function được gọi. Trong ảnh ví dụ trên, nó được đặt tên là lambda_handler.

  2. Event object: Là đối tượng chứa dữ liệu được gửi đến Lambda function khi nó được kích hoạt. Nó cung cấp thông tin đầu vào cho function.

  3. Context object: Cung cấp các phương thức và thuộc tính để tương tác với môi trường runtime của Lambda, như lấy ID của request, nhóm log, v.v.

AWS Serverless Application Model (SAM)

AWS SAM (Serverless Application Model) là một framework mã nguồn mở được phát triển bởi Amazon Web Services để xây dựng và triển khai ứng dụng serverless. Đây là một cách tiếp cận đơn giản hóa cho việc định nghĩa các tài nguyên serverless trong AWS.

Các điểm chính về AWS SAM:

  • Sử dụng cú pháp YAML đơn giản để mô tả ứng dụng serverless

  • Tự động tạo và quản lý tài nguyên AWS như Lambda functions, API Gateway, và DynamoDB

  • Hỗ trợ kiểm thử cục bộ và gỡ lỗi ứng dụng serverless

  • Tích hợp chặt chẽ với các công cụ phát triển AWS khác

  • Cho phép triển khai nhanh chóng và nhất quán thông qua CloudFormation

ICYMI: Season one of Sessions with SAM | AWS Compute Blog

Một số câu lệnh AWS SAM CLI thường dùng

AWS SAM CLI (Command Line Interface) là một công cụ dòng lệnh hỗ trợ việc phát triển, kiểm thử và triển khai ứng dụng serverless sử dụng AWS SAM. Nó cung cấp các lệnh (SAM commands) giúp nhà phát triển làm việc hiệu quả với ứng dụng serverless:

  • sam init: Tạo một dự án SAM mới với cấu trúc chuẩn

  • sam build: Biên dịch ứng dụng và chuẩn bị nó cho việc triển khai

  • sam local: Cho phép chạy và kiểm thử ứng dụng cục bộ, mô phỏng môi trường AWS

  • sam deploy: Triển khai ứng dụng lên AWS CloudFormation

  • sam validate: Kiểm tra tính hợp lệ của template SAM

  • sam package: Đóng gói ứng dụng để chuẩn bị cho việc triển khai

AWS X-ray

AWS X-Ray | AWS Blog

AWS X-Ray là một dịch vụ của Amazon Web Services giúp các nhà phát triển phân tích và gỡ lỗi ứng dụng phân tán, đặc biệt là trong môi trường microservices và serverless. Cách hoạt động của X-Ray như sau:

  • Thu thập dữ liệu: X-Ray sử dụng các tracers để thu thập thông tin về các yêu cầu và phản hồi trong ứng dụng.

  • Tạo bản đồ dịch vụ: Nó tự động tạo ra một bản đồ trực quan của các thành phần ứng dụng và luồng dữ liệu giữa chúng.

  • Phân tích hiệu suất: X-Ray đo lường thời gian xử lý của mỗi thành phần, giúp xác định các điểm nghẽn.

  • Theo dõi lỗi: Nó ghi lại và hiển thị các lỗi xảy ra trong quá trình xử lý yêu cầu.

  • Tích hợp với các dịch vụ AWS: X-Ray tích hợp sẵn với nhiều dịch vụ AWS như Lambda, API Gateway, EC2, giúp dễ dàng theo dõi yêu cầu xuyên suốt hệ thống.

X-Ray giúp các đội phát triển nhanh chóng xác định và giải quyết vấn đề hiệu suất, cải thiện trải nghiệm người dùng và tối ưu hóa chi phí vận hành ứng dụng.

AWS Step Functions

New – Compute, Database, Messaging, Analytics, and Machine Learning  Integration for AWS Step Functions | AWS News Blog

AWS Step Functions là một dịch vụ điều phối serverless cho phép bạn tạo và quản lý các quy trình công việc phức tạp bằng cách kết hợp nhiều dịch vụ AWS và các bước logic. Nó sử dụng một State Machine trực quan để định nghĩa và thực thi các luồng công việc, giúp bạn dễ dàng xây dựng, theo dõi và gỡ lỗi các ứng dụng phân tán.

Ví dụ: Trong một quy trình xử lý đơn hàng trực tuyến, Step Functions có thể điều phối các bước sau:

  1. Xác thực đơn hàng (sử dụng Lambda)

  2. Kiểm tra kho hàng (truy vấn DynamoDB)

  3. Xử lý thanh toán (tích hợp với cổng thanh toán)

  4. Gửi email xác nhận (sử dụng Amazon SES)

  5. Cập nhật trạng thái đơn hàng (cập nhật DynamoDB)

Nếu bạn từng nghe đến kiến trúc "Serverless without Lambda" (Serverless không sử dụng Lambda function), thì Step Functions là một dịch vụ rất hữu ích để bạn có thể điều phối các service trong kiến trúc này.

AWS Kinesis

Streaming Data on AWS: Amazon Kinesis Data Streams or Amazon MSK? |  Programmatic Ponderings

Amazon Kinesis là một bộ dịch vụ của AWS được thiết kế để xử lý và phân tích dữ liệu theo thời gian thực. Nó bao gồm ba dịch vụ chính:

  1. Kinesis Data Streams: Cho phép thu thập và xử lý lượng lớn dữ liệu liên tục từ nhiều nguồn khác nhau. Dữ liệu được chia thành các shards để xử lý song song, giúp tăng khả năng mở rộng.

  2. Kinesis Data Firehose: Dịch vụ này tự động hóa việc thu thập, chuyển đổi và tải dữ liệu vào các kho lưu trữ như Amazon S3, Amazon Redshift, hoặc Elasticsearch. Nó giúp đơn giản hóa quá trình ETL (Extract, Transform, Load) theo thời gian thực.

  3. Kinesis Data Analytics: Cho phép xử lý và phân tích dữ liệu trực tuyến bằng SQL hoặc Java. Nó có thể thực hiện các phép tính phức tạp, tạo cảnh báo, và sinh ra insights từ luồng dữ liệu đang chảy.

Kinesis thích hợp cho các ứng dụng cần xử lý dữ liệu lớn theo thời gian thực như theo dõi hoạt động người dùng, xử lý log ứng dụng, phân tích dữ liệu IoT, hoặc phát hiện gian lận trong thời gian thực.

Một số ví dụ sử dụng các dịch vụ serverless của AWS

Streaming dữ liệu với Kinesis

AWS CloudFormation template using Kinesis Data Streams, Kinesis Data Firehose, and S3 reference architecture

Quy trình xử lý bao gồm các bước sau:

  1. Thu thập dữ liệu: Amazon Kinesis Data Streams nhận và lưu trữ dữ liệu đầu vào từ nhiều nguồn khác nhau theo thời gian thực.

  2. Chuyển đổi và lưu trữ: Kinesis Data Firehose lấy dữ liệu từ Data Streams, và sau đó tự động chuyển dữ liệu vào Amazon S3 để lưu trữ lâu dài. Quá trình này được quản lý hoàn toàn bởi AWS, bạn không cần lo lắng về việc mở rộng hay quản trị.

  3. Giám sát: Amazon CloudWatch được sử dụng để theo dõi toàn bộ quá trình. Nó hiển thị các chỉ số quan trọng trên bảng điều khiển và có thể thiết lập cảnh báo khi có bất thường xảy ra trong quá trình xử lý dữ liệu của Kinesis Data Firehose.

Kiến trúc này cho phép xử lý, lưu trữ và giám sát dữ liệu luồng một cách liền mạch và tự động, phù hợp cho các ứng dụng cần xử lý lượng lớn dữ liệu theo thời gian thực.

Tối ưu chi phí bằng cách tự động tắt/bật các tài nguyên AWS

Figure 1 – Architecture showing the AWS Step Functions Workflow to stop services

Kiến trúc trong hình trên mô tả một quy trình tự động tắt các dịch vụ AWS theo lịch trình, sử dụng AWS Step Functions. Các thành phần chính bao gồm:

  1. Amazon EventBridge: Kích hoạt quy trình theo lịch đã định.

  2. AWS Step Functions: Điều phối toàn bộ quy trình tắt các dịch vụ.

  3. Các bước trong quy trình:

    • StopAuroraCluster: Tắt cụm cơ sở dữ liệu Aurora

    • StopRDSInstances: Tắt các RDS instance

    • ScaleDownASG: Thu nhỏ Auto Scaling Group

    • ScaleDownEKSNodeGroups: Thu nhỏ EKS node group

    • Wait: Chờ một khoảng thời gian

    • StopEC2Instances: Tắt các EC2 instance

Quy trình hoạt động như sau:

  1. EventBridge kích hoạt Step Functions theo lịch.

  2. Step Functions thực hiện song song các bước dừng Aurora, RDS, thu nhỏ ASG và EKS.

  3. Sau khi thu nhỏ ASG, quy trình chờ một lúc rồi dừng các phiên bản EC2.

  4. Quy trình kết thúc sau khi tất cả các bước hoàn tất.

Kiến trúc này giúp tự động hóa việc dừng các dịch vụ AWS không cần thiết vào thời điểm định sẵn, tiết kiệm chi phí vận hành.

Phát triển ứng dụng serverless

Phát triển ứng dụng Serverless là quá trình xây dựng kiến trúc ứng dụng, tập trung vào việc tận dụng tối đa lợi thế của điện toán đám mây không máy chủ. Quá trình này bao gồm sáu bước quan trọng:

  1. Xác định vấn đề cần giải quyết để định hướng rõ mục tiêu của dự án.

  2. Đào tạo đội ngũ hiện có về công nghệ serverless, đảm bảo họ có kỹ năng cần thiết.

  3. Tạo bằng chứng khái niệm (Proof of Concept) để xác minh rằng giải pháp serverless có thể giải quyết vấn đề đặt ra.

  4. Tối ưu hóa giải pháp để tận dụng tối đa ưu điểm của điện toán đám mây.

  5. Tự động hóa quy trình tích hợp liên tục và triển khai liên tục (CI/CD), giúp quá trình phát triển và cập nhật ứng dụng diễn ra nhanh chóng và hiệu quả.

  6. Cuối cùng, tự động hóa quá trình kiểm thử để đảm bảo chất lượng và độ tin cậy của ứng dụng.

Một số best practices

Tạo infrastructure bằng code:

  • Sử dụng Infrastructure as Code (IaC) tools như AWS CloudFormation hoặc Terraform

  • Ví dụ: Định nghĩa AWS Lambda functions, API Gateway, và DynamoDB tables trong một template CloudFormation

  • Sử dụng frameworks như AWS Serverless Application Model (SAM) hoặc Serverless Framework để nhóm các chức năng chung thành các dịch vụ nhỏ hơn

  • Mỗi dịch vụ nhỏ có thể có repository code riêng biệt

Invoke và test solution:

  • Sử dụng AWS SAM Local để mô phỏng môi trường serverless trên máy local

  • Áp dụng unit testing cho từng function

  • Thực hiện integration testing với các services được mock

  • Ví dụ: Sử dụng Jest để viết unit tests cho Lambda functions

Update và package solution:

  • Triển khai CI/CD pipeline sử dụng tools như Jenkins, GitLab CI, hoặc AWS CodePipeline

  • Sử dụng semantic versioning cho các functions

  • Áp dụng blue-green deployment để giảm thiểu downtime

  • Ví dụ: Sử dụng AWS SAM để package và deploy Lambda functions

Bảo mật solution:

  • Áp dụng nguyên tắc least privilege khi cấp quyền

  • Sử dụng AWS IAM roles để quản lý quyền truy cập

  • Mã hóa dữ liệu nhạy cảm khi lưu trữ và truyền tải

  • Sử dụng AWS Secrets Manager để quản lý các secrets

  • Ví dụ: Tạo một IAM role cụ thể cho mỗi Lambda function với các permissions tối thiểu cần thiết

  • Sử dụng API Gateway để xác thực tham số và bảo vệ chống truy cập trái phép, giảm nhu cầu kiểm tra tham số bằng mã tùy chỉnh

Monitor solution:

  • Sử dụng AWS CloudWatch để theo dõi metrics và logs

  • Thiết lập cảnh báo cho các sự kiện bất thường

  • Implement distributed tracing với AWS X-Ray

  • Sử dụng custom metrics để theo dõi business-specific KPIs

  • Ví dụ: Tạo CloudWatch Dashboard để visualize các metrics quan trọng như function invocations, errors, và latency

Tối ưu hóa kiến trúc:

  • Sử dụng các dịch vụ AWS thay vì thư viện mã: Ví dụ, sử dụng API Gateway để xác thực và xử lý các tính năng ở cấp độ dịch vụ

  • Tránh thực hiện điều phối workflow trong Lambda functions, thay vào đó sử dụng AWS Step Functions

  • Sử dụng nhiều tài khoản AWS cho các team phát triển khác nhau để tăng cường bảo mật.

Tài liệu thêm để tìm hiểu về AWS serverless

Serverless developer guide: https://docs.aws.amazon.com/serverless/latest/devguide/serverless-starters-overview.html

Serverless land:

https://serverlessland.com/