Xử lý lỗi trong các ứng dụng serverless

với AWS Step Functions và AWS Lambda

Trong hướng dẫn này, bạn sẽ tìm hiểu cách sử dụng AWS Step Functions để xử lý các lỗi thời gian hoạt động của quy trình làm việc. AWS Step Functions là dịch vụ điều phối serverless cho phép bạn dễ dàng phối hợp nhiều hàm Lambda vào quy trình làm việc linh hoạt dễ dàng gỡ lỗi và thay đổi. AWS Lambda là dịch vụ điện toán cho phép bạn chạy mã mà không cần cung cấp hay quản lý máy chủ. 

Các hàm Lambda có thể thỉnh thoảng gặp lỗi, chẳng hạn như khi trường hợp ngoại lệ không thể xử lý được báo cáo, khi chúng chạy lâu hơn thời gian chờ đã đặt cấu hình hoặc khi chúng hết bộ nhớ. Viết hoặc duy trì logic xử lý lỗi trong mọi hàm Lambda của bạn để giải quyết các tình huống chẳng hạn như điều tiết API hoặc thời gian chờ của socket có thể rất lâu và phức tạp nhất là đối với các ứng dụng được phân phối. Nhúng mã này vào mỗi hàm Lambda tạo ra thành phần phụ thuộc giữa các hàm và điều này có thể khó duy trì tất cả các kết nối khi có thay đổi xảy ra.

Để tránh điều này và để giảm số mã xử lý lỗi bạn viết, bạn có thể sử dụng AWS Step Functions để tạo quy trình làm việc serverless hỗ trợ xử lý lỗi hàm. Bất kể lỗi là ngoại lệ hàm do nhà phát triển tạo ra ( ví dụ như không tìn thấy tệp) hoặc là không lường được (ví dụ như hết bộ nhớ), bạn có thể định cấu hình Step Functions để đối phó bằng logic có điều kiện dựa trên loại lỗi xảy ra. Bằng cách tách logic quy trình làm việc từ logic làm việc theo cách này, bạn có thể thay đổi cách đối phó với lỗi của quy trình làm việc mà không thay đổi logic làm việc của hàm Lambda.

Trong hướng dẫn này, bạn sẽ thiết kế và chạy quy trình làm việc serveless bằng AWS Step Functions để xử lý mượt mà các lỗi này. Bạn sẽ tạo hàm AWS Lambda bắt chước cuộc gọi đến API RESTful và gửi lại nhiều mã cùng ngoại lệ phản hồi. Sau đó, bạn sẽ dùng AWS Step Functions để tạo máy trạng thái với tính năng Thử lại và phát hiện, phản hồi với logic khác tùy theo trường hợp ngoại lệ được báo cáo.

Hướng dẫn này yêu cầu tài khoản AWS

AWS Step Functions hoặc AWS Lambda sẽ không mất thêm khoản phí nào. Các tài nguyên mà bạn tạo trong hướng dẫn này đủ điều kiện hưởng Bậc miễn phí. 

Thông tin thêm về Bậc miễn phí >>


Bước 1. Tạo hàm Lambda để bắt chước API

Trong bước này, bạn sẽ tạo hàm Lambda có thể bắt chước một số tương tác API cơ bản. Hàm Lambda báo cáo trường hợp ngoại lệ để mô phỏng phản hồi từ API giả, tùy theo mã lỗi mà bạn cung cấp dưới dạng đầu vào trong tham số sự kiện.


a.  Mở Bảng điều khiển quản lý AWS, nhờ đó bạn có thể giữ cho hướng dẫn từng bước này luôn mở. Khi màn hình tải xong, nhập tên người dùng và mật khẩu để bắt đầu. Tiếp theo, nhập Lambda trong thanh tìm kiếm và chọn Lambda để mở bảng điều khiển dịch vụ.

( nhấp vào để phóng to )


b. Chọn Tạo hàm.

( nhấp vào để phóng to )


c. Chọn Tạo từ đầu. Tiếp theo, định cấu hình hàm Lambda như sau:

Đối với Tên, nhập MockAPIFunction.
Với Runtime, chọn Python 3.6.
Với Vai trò, chọn Tạo vai trò tùy chỉnh.

Cửa sổ IAM mới sẽ mở ra. Chọn Tên vai tròlambda_basic_execution rồi nhấp vào Cho phép. Bạn sẽ tự động quay trở lại bảng điều khiển Lambda.

Nhấp vào Tạo hàm.

( nhấp vào để phóng to )


d. Trên màn hình MockAPIFunction , cuộn xuống phần Mã hàm. Trong hướng dẫn này, bạn sẽ tạo hàm sử dụng mô hình lập trình để tạo hàm Lambda trong Python. Trong cửa sổ mã, thay tất cả mã bằng mã sau, rồi chọn Lưu.

class TooManyRequestsException(Exception): pass
class ServerUnavailableException(Exception): pass
class UnknownException(Exception): pass

def lambda_handler(event, context):
    statuscode = event["statuscode"]    
    if statuscode == "429":
        raise TooManyRequestsException('429 Too Many Requests')
    elif statuscode == "503":
        raise ServerUnavailableException('503 Server Unavailable')
    elif statuscode == "200":
        return '200 OK'
    else:
        raise UnknownException('Unknown error')

( nhấp vào để phóng to )


e. Sau khi đã tạo hàm Lambda, cuộn lên đầu cửa sổ, rồi ghi lại Tên Tài nguyên Amazon (ARN) của hàm ở góc trên cùng bên phải của trang. Tên Tài nguyên Amazon (ARN) xác định các tài nguyên AWS, đồng thời giúp bạn theo dõi và xem các mục cùng chính sách AWS trên toàn bộ dịch vụ AWS và cuộc gọi API. Chúng tôi yêu cầu ARN khi bạn cần tham chiếu tài nguyên cụ thể từ Step Functions.

( nhấp vào để phóng to )


Bước 2. Tạo Vai trò AWS Identity and Access Management (IAM)

AWS Step Functions có thể thực thi mã và truy cập vào các tài nguyên AWS khác (chẳng hạn như, dữ liệu lưu trữ trong các bộ chứa Amazon S3). Để duy trì bảo mật, bạn phải cấp cho Step Functions quyền truy cập vào các tài nguyên này bằng AWS Identity and Access Management (IAM).


a. Trong một cửa sổ trình duyệt khác, điều hướng đến Bảng điều khiển quản lý AWS và nhập IAM vào thanh tìm kiếm. Nhấp vào IAM để mở bảng điều khiển dịch vụ.

( nhấp vào để phóng to )


b. Nhấp vào Vai trò, rồi chọn Tạo vai trò.

( nhấp vào để phóng to )


c. Trên trang Chọn loại thực thể đáng tin cậy, trong dịch vụ AWS, chọn Step Functions từ danh sách, rồi chọn Tiếp theo: Quyền.

( nhấp vào để phóng to )


d. Trên trang Đính kèm chính sách về quyền, chọn Tiếp theo: Xem lại.

 

( nhấp vào để phóng to )


e. Trên trang Xem lại , nhập step_functions_basic_execution cho Tên vai trò, rồi nhấp vào Tạo vai trò.

( nhấp vào để phóng to )


f. Vai trò IAM mới của bạn đã được tạo và hiển thị trong danh sách bên dưới vai trò IAM cho hàm Lambda của bạn.

( nhấp vào để phóng to )


Bước 3. Tạo Máy trạng thái Step Functions

Giờ đây, bạn đã tạo hàm Lambda đơn giản có thể bắt chước phản hồi API, bạn có thể tạo máy trạng thái Step Functions để gọi API và xử lý trường hợp ngoại lệ.

Trong bước này, bạn sẽ sử dụng bảng điều khiển Step Functions để tạo máy trạng thái sử dụng trạng thái Tác vụ bằng trường Thử lại và phát hiện để xử lý nhiều mã phản hồi API khác nhau. Bạn sẽ sử dụng trạng thái Tác vụ để yêu cầu bắt chước hàm API Lambda, việc này sẽ gửi lại mã trạng thái API bạn cung cấp dưới dạng đầu vào cho máy trạng thái.


a. Mở Bảng điều khiển AWS Step Functions. Trên trang Tạo máy trạng thái, hãy chọn Tạo từ đầu. Trong phần Chi tiết, đặt tên máy trạng thái là MyAPIStateMachine, rồi chọn Tôi sẽ sử dụng vai trò hiện có.

( nhấp vào để phóng to )


b. Tiếp theo, bạn sẽ thiết kế máy trạng thái sẽ thực hiện nhiều tác vụ khác nhau tùy theo phản hồi từ API giả. Nếu không thể tiếp cận API, quy trình làm việc sẽ thử lại. Thử lại là cách hữu ích để xử lý các lỗi tạm thời. Quy trình công việc cũng sẽ phát hiện những trường hợp ngoại lệ khác nhau mà API giả đưa ra.

Thay thế nội dung của phần Định nghĩa máy trạng thái bằng mã sau:

{
  "Comment": "An example of using retry and catch to handle API responses",
  "StartAt": "Call API",
  "States": {
    "Call API": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next" : "OK",
      "Comment": "Catch a 429 (Too many requests) API exception, and resubmit the failed request in a rate-limiting fashion.",
      "Retry" : [ {
        "ErrorEquals": [ "TooManyRequestsException" ],
        "IntervalSeconds": 1,
        "MaxAttempts": 2
      } ],
      "Catch": [ 
        {
          "ErrorEquals": ["TooManyRequestsException"],
          "Next": "Wait and Try Later"
        }, {
          "ErrorEquals": ["ServerUnavailableException"],
          "Next": "Server Unavailable"
        }, {
          "ErrorEquals": ["States.ALL"],
          "Next": "Catch All"
        }
      ]
    },
    "Wait and Try Later": {
      "Type": "Wait",
      "Seconds" : 1,
      "Next" : "Change to 200"
    },
    "Server Unavailable": {
      "Type": "Fail",
      "Error":"ServerUnavailable",
      "Cause": "The server is currently unable to handle the request."
    },
    "Catch All": {
      "Type": "Fail",
      "Cause": "Unknown error!",
      "Error": "An error of unknown type occurred"
    },
    "Change to 200": {
      "Type": "Pass",
      "Result": {"statuscode" :"200"} ,
      "Next": "Call API"
    },
    "OK": {
      "Type": "Pass",
      "Result": "The request has succeeded.",
      "End": true
    }
  }
}

( nhấp vào để phóng to )


c. Tìm dòng “Tài nguyên” trong trạng thái Tác vụ “Gọi API” (dòng 7). Để cập nhật ARN này sang ARN của hàm API Lambda giả mà bạn vừa tạo, nhấp vào văn bản ARN, rồi chọn ARN từ danh sách.

( nhấp vào để phóng to )


d. Nhấp vào nút làm mới bên cạnh ngăn quy trình làm việc trực quan để Step Functions tạo sơ đồ máy trạng thái tương ứng với quy trình làm việc bạn vừa thiết kế. Sau khi xem lại quy trình làm việc trực quan, nhấp vào Tạo máy trạng thái.

( nhấp vào để phóng to )


Bước 4. Kiểm tra quy trình làm việc xử lý lỗi của bạn

Để kiểm tra quy trình làm việc xử lý lỗi, bạn sẽ yêu cầu máy trạng thái gọi API giả bằng cách cung cấp mã lỗi dưới dạng đầu vào.


a. Nhấp vào Bắt đầu thực hiện.

( nhấp vào để phóng to )


b. Hộp thoại thực thi mới sẽ xuất hiện, nơi bạn có thể nhập đầu vào cho máy trạng thái. Bạn sẽ nắm vai trò API và cung cấp mã lỗi mà chúng ta muốn cho API giả gửi lại. Thay văn bản hiện có bằng mã bên dưới, rồi chọn Bắt đầu thực hiện:

{
    "statuscode": "200"
}

( nhấp vào để phóng to )


c. Trên màn hình Chi tiết thực hiện, nhấp vào Đầu vào để xem đầu vào bạn cung cấp cho máy trạng thái. Tiếp theo, nhấp vào Đầu ra để xem kết quả thực hiện của máy trạng thái. Bạn có thể thấy rằng quy trình làm việc diễn giải mã trạng thái 200 là lệnh gọi API thành công.

( nhấp vào để phóng to )


d. Trong Quy trình làm việc trực quan, bạn có thể thấy lộ trình thực hiện của mỗi lần thực hiện, hiển thị bằng màu xanh lục trong quy trình làm việc. Nhấp vào trạng thái Tác vụ "Gọi API" rồi mở rộng trường Đầu vàoĐầu ra trong màn hình Chi tiết bước.

Bạn có thể thấy trạng thái Tác vụ hày đã yêu cầu thành công hàm API Lambda giả của bạn bằng đầu vào do bạn cung cấp và ghi lại đầu ra của hàm Lambda đó, “200 OK”.

( nhấp vào để phóng to )


e. Tiếp theo, nhấp vào trạng thái Tác vụ “OK” trong quy trình làm việc trực quan. Trong Chi tiết bước bạn có thể thấy rằng đầu ra của bước trước đó (Trạng thái tác vụ gọi API) đã được chuyển sang làm đầu vào của bước này. Trạng thái OK là trạng thái Chuyển, đơn giản là chuyển đầu vào thành đầu ra, không phải thực hiện tác vụ gì. Trạng thái chuyển rất hữu ích khi xây dựng và gỡ lỗi máy trạng thái.

( nhấp vào để phóng to )


Bước 5. Kiểm tra việc thực hiện của máy trạng thái


a. Cuộn lên đầu màn hình Chi tiết thực hiện và nhấp vào MyAPIStateMachine.

( nhấp vào để phóng to )


b. Nhấp vào Bắt đầu thực hiện một lần nữa, lần này cung cấp đầu vào sau rồi nhấp vào Bắt đầu thực hiện.

{
    "statuscode": "503"
}

( nhấp vào để phóng to )


c. Trong phần Lịch sử sự kiện thực hiện, mở rộng mỗi bước thực hiện để xác nhận rằng quy trình làm việc hoạt động đúng như mong muốn. Chúng tôi dự kiến lần thực hiện này sẽ thất bại nên bạn đừng hoảng hốt! Bạn sẽ để ý thấy rằng:

  1. Step Functions ghi lại Đầu vào
  2. Đầu vào đó được chuyển sang Trạng thái tác vụ Gọi API
  3. Trạng thái tác vụ Gọi API yêu cầu MockAPIFunction sử dụng đầu vào đó
  4. MockAPIFunction thực hiện
  5. MockAPIFunction thất bại với ServerUnavailableException
  6. Câu lệnh ghi lại trong Trạng thái tác vụ Gọi API ghi lại được trường hợp ngoại lệ đó
  7. Câu lệnh ghi lại không hoàn thành quy trình làm việc
  8. Máy trạng thái của bạn đã hoàn thành việc thực hiện

( nhấp vào để phóng to )


d. Tiếp theo, bạn sẽ mô phỏng trường hợp ngoại lệ 429. Cuộn lên đầu màn hình Chi tiết thực hiện và nhấp vào MyAPIStateMachine. Nhấp vào Bắt đầu thực hiện, cung cấp đầu vào, rồi nhấp vào Bắt đầu thực hiện:

{
    "statuscode": "429"
}

( nhấp vào để phóng to )


e. Giờ đây bạn sẽ kiểm tra hoạt động thử lại của quy trình làm việc. Trong phần Lịch sử sự kiện thực hiện, mở rộng mỗi bước thực hiện một lần nữa để xác nhận rằng Step Functions tìm cách gọi hàm MockAPILambda hai lần nữa, cả hai lần đều thất bại. Tại thời điểm này, quy trình làm việc chuyển đổi sang trang thái Đợi và thử lại sau (hiển thị trong hình ảnh bên phải), với hy vọng rằng API chỉ tạm thời không phản hồi.

Tiếp theo, trạng thái Đợi ép buộc thay đổi mã phản hồi sang 200 và quy trình công việc của bạn hoàn thành thành công việc thực hiện. Đây có thể không phải là cách bạn xử lý trường hợp ngoại lệ 429 trong ứng dụng thực nhưng chúng tôi vẫn duy trì mọi thứ đơn giản vì đây là hướng dẫn.

( nhấp vào để phóng to )


f. Chạy một phiên bản nữa của quy trình làm việc và lần này cung cấp một phản hồi API ngẫu nhiên không do máy trạng thái xử lý:

{
    "statuscode": "999"
}

Kiểm tra lại việc thực hiện bằng Lịch sử sự kiện thực hiện. Khi hoàn thành, nhấp vào MyAPIStateMachine một lần nữa. Trong ngăn Lần thực hiện, bạn có thể thấy lịch sử tất cả những lần thực hiện của quy trình làm việc và can thiệp vào từng lần một nếu bạn muốn.

( nhấp vào để phóng to )


Bước 6. Chấm dứt tài nguyên

Trong bước này, bạn sẽ chấm dứt tài nguyên liên quan đến AWS Step Functions và AWS Lambda.

Quan trọng: Việc chấm dứt các tài nguyên không được sử dụng chủ động sẽ làm giảm chi phí và là biện pháp tốt nhất. Nếu bạn không chấm dứt tài nguyên thì có thể sẽ phát sinh thêm chi phí.


a. Ở trên đầu cửa sổ bảng điều khiển AWS Step Functions, hãy nhấp vào Máy trạng thái.

( nhấp vào để phóng to )


b. Trong cửa sổ Máy trạng thái, nhấp vào MyAPIStateMachine và chọn Xóa. Xác nhận hoạt động bằng cách chọn Xóa máy trạng thái trong hộp hội thoại. Máy trạng thái sẽ bị xóa trong một hoặc hai phút sau khi Step Functions đã xác nhận rằng mọi lượt thực hiện đang diễn ra đều đã hoàn tất.

( nhấp vào để phóng to )


c. Tiếp theo, bạn sẽ xóa hàm Lambda. Nhấp vào Dịch vụ trong menu Bảng điều khiển quản lý AWS, rồi chọn Lambda.

( nhấp vào để phóng to )


d. Trên màn hình Hàm, nhấp vào MockAPIFunction, chọn Hoạt động, rồi chọn Xóa. Xác nhận xóa bằng cách nhấp vào Xóa một lần nữa.

( nhấp vào để phóng to )


e. Cuối cùng, bạn sẽ xóa vai trò IAM. Nhấp vào Dịch vụ trong menu Bảng điều khiển quản lý AWS, rồi chọn IAM.

( nhấp vào để phóng to )


f. Chọn cả hai vai trò IAM mà bạn đã tạo cho hướng dẫn này, rồi nhấp vào Xóa vai trò. Xác nhận xóa bằng cách nhấp vào Có, xóa trong hộp hội thoại.


Giờ bạn có thể đăng xuất khỏi Bảng điều khiển quản lý AWS.

( nhấp vào để phóng to )


Xin chúc mừng!

Bạn đã sử dụng AWS Step Functions và AWS Lambda để tạo quy trình làm việc xử lý lỗi cho API mạng. Nhờ AWS Lambda, bạn có thể chạy mã cho gần như toàn bộ các loại ứng dụng hay dịch vụ backend – tất cả đều không cần quản trị. Chỉ cần tải đoạn mã của bạn lên và Lambda sẽ lo hết những gì cần làm để chạy và mở rộng mã của bạn với mức độ sẵn sàng cao.

Kết hợp AWS Step Functions và AWS Lambda giúp đơn giản hóa việc điều phối các hàm AWS Lambda cho các ứng dụng serverless. Step Functions cho phép bạn kiểm soát các quy trình làm việc phức tạp sử dụng hàm Lambda mà không quản lý ứng dụng ngầm và điều phối trạng thái. Bạn cũng có thể sử dụng Step Functions để điều phối vi dịch vụ bộ phận chức năng bằng các tài nguyên điện toán như Amazon EC2 và Amazon ECS.