Mục lục bài viết

Tổng quan cập nhật này

Vấn đề vòng lặp vô hạn xảy ra khi AWS Lambda function tương tác với các dịch vụ aws.

Nguyên nhân thường là do lỗi code hoặc cấu hình sai, dẫn đến tăng chi phí sử dụng aws không mong muốn.

Cho nên cập nhật lần này giúp người dùng cấu hình phát hiện vòng lặp vô hạn trên từng hàm lambda riêng lẻ.

Nội dung cập nhật

Mặc định tính năng phát hiện vòng lặp vô hạn sẽ được bật cho tất cả các lambda function.

Hiện tại nó hoạt động với các dịch vụ: Lambda, SQS và SNS.

Cơ chế hoạt động như sau:

  • Nó sử dụng AWS X-Ray trace header để theo dõi số lần function được gọi
  • Giới hạn ở 16 lần gọi cho cùng một sự kiện, sau ngưỡng này, Lambda dừng thực thi và đẩy vào metric CloudWatch.

Nó còn xử lý ngoại lệ bằng 2 cách:

  • Gọi đồng bộ: trả về RecursiveInvocationException
  • Gọi bất đồng bộ: gửi sự kiện đến dead-letter queue hoặc on-failure destination

Các APIs giới thiệu lần này là:

  • GetFunctionRecursiveConfig: trả về thông tin chi tiết về cấu hình phát hiện vòng lặp vô hạn của hàm
  • PutFunctionRecursiveConfig: đặt cấu hình phát hiện vòng lặp vô hạn cho một hàm. Theo mặc định, tính năng phát hiện vòng lặp vô hạn được BẬT cho tất cả các function.

Cách sử dụng các APIs này

Có 3 cách sử dụng các api này gồm:

  1. AWS Console
  2. AWS CLI
  3. Thông qua các công cụ Infrastructure as Code như:
  • AWS CloudFormation
  • AWS Serverless Application Model (SAM) phiên bản 1.123.0 trở lên
  • AWS Cloud Development Kit (CDK) phiên bản v2.153.0 trở lên

Thử nghiệm thực tế bằng AWS Console

  1. Vào hàm lambda, chọn tab Configuration bạn sẽ thấy mục Concurrency and recursion detection

Tính năng này mặc định được bật lên.

  1. Để tắt tính năng này nhấn Edit sau đó chọn Allow recursive loops rồi nhấn Save

Sử dụng bằng AWS CLI

 CLI bên dưới để lấy cấu hình tính năng này

aws lambda get-function-recursion-config \

--region $AWS_REGION \

--function-name $FUNCTION_NAME

CLI bên dưới để cập nhật cấu hình tính năng này

aws lambda put-function-recursion-config \

--region $AWS_REGION \

--function-name $FUNCTION_NAME \

--recursive-loop Allow|Terminate

Thay giá trị thích hợp cho AWS_REGION và FUNCTION_NAME

Ở hàm aws lambda put-function-recursion-config dùng tham số recursive-loop với giá trị

  • Allow → Sử dụng khi bạn có chủ đích cho phép vòng lặp vô hạn
  • Terminate → Bật lại tính năng phát hiện vòng lặp vô hạn

Sử dụng bằng AWS CloudFormation

LambdaFunction:

    Type: AWS::Lambda::Function                                                                                                                                                                                    

    Properties:                                                                                                                                                                                       

      Code:                                                                                                                                                                                          

        S3Bucket:S3_BUCKET                                                                                                                                                                            

        S3Key: S3_KEY      

      Handler: com.example.App::handleRequest                                                                                                                                                        

      MemorySize: 1024

      Role:                                                                                                                                                                                          

        Fn::GetAtt:                                                                                                                                                                                  

        - LambdaFunctionRole                                                                                                                                                                         

        - Arn                                                                                                                                                                               

      Runtime: java17

      RecursiveLoop : Allow                                                                                                                                                                                                                                                                           

      Timeout: 20                                                                                                                                                                        

      TracingConfig:                                                                                                                                                                               

        Mode: Active

Về việc mở rộng tính năng này cho các dịch vụ AWS khác

Hiện tại tính năng này hoạt động cho tính năng Lambda, SQS và SNS.Giới hạn 16 lần gọi trước khi dừng vòng lặp.

Tuy nhiên AWS Lambda dự định mở rộng hỗ trợ phát hiện vòng lặp vô hạn cho nhiều dịch vụ AWS khác nữa.

Một cách bạn có thể xác định các hàm sử dụng mẫu vô hạn là dùng metric RecursiveInvocationsDropped trong Cloudwatch

  1. CLI bên dưới sẽ tạo một CloudWatch Alarm cho tất cả các hàm Lambda dựa trên metric CloudWatch RecursiveInvocationsDropped. Cấu hình alarm để kích hoạt khi giá trị của metric này lớn hơn ngưỡng 0.
aws cloudwatch put-metric-alarm --alarm-name lambda-recursive-alarm --metric-name RecursiveInvocationsDropped --namespace AWS/Lambda --statistic Sum --period 60 --threshold 0 --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 --alarm-actions $arn-of-sns-notification-topic
  1. Khi Lambda phát hiện các lệnh gọi vòng lặp vô hạn, nó sẽ phát ra metric RecursiveInvocationsDropped, điều này sẽ kích hoạt alarm. Lưu ý rằng Lambda chỉ phát hiện và dừng các lệnh gọi này nếu tất cả các dịch vụ trong vòng lặp đều hỗ trợ tính năng phát hiện vòng lặp vô hạn

Kết luận

Tính năng phát hiện vòng lặp vô hạn của Lambda tự động phát hiện và dừng các lệnh gọi vô hạn giữa Lambda và các dịch vụ được hỗ trợ, ngăn chặn các workload chạy không kiểm soát. Trong hầu hết các trường hợp, bạn nên thiết kế workload của mình để tránh bất kỳ vòng lặp vô hạn nào. Trong một số tình huống hiếm gặp và đặc biệt, bạn có thể muốn tắt hành vi mặc định này trên từng trường hợp cụ thể. Các API phát hiện vòng lặp vô hạn cho phép bạn thiết lập cấu hình trên từng hàm riêng lẻ.

Tính năng này có sẵn ở tất cả các Region AWS.