Biểu đồ hóa tác động của việc cập nhật mã AWS Lambda

của David Boyne | vào ngày 13 tháng 12 năm 2022 | trong AWS Lambda, Serverless

Link blog

Bài viết này được viết bởi Brigit Brown (Kiến trúc sư giải pháp) và Helen Ashton (Kiến trúc sư giải pháp chuyên về khả năng quan sát).

Khi sử dụng AWS Lambda, những thay đổi trong mã nguồn có thể ảnh hưởng đến hiệu suất, chức năng và chi phí. Việc thu thập thông tin về tác động của những thay đổi mã nguồn lên hiệu suất có thể rất khó khăn.

Bài viết blog này trình bày cách để capture, record và visualize dữ liệu triển khai mã nguồn Lambda với các dữ liệu khác trên bảng điều khiển Amazon CloudWatch. Giải pháp này giúp các nhà phát triển serverless có thể hiểu rõ tác động của việc thay đổi mã nguồn lên các hàm Lambda và đưa ra quyết định dựa trên dữ liệu.

Giải pháp này gồm ba bước:

  1. Capture Ghi lại: Cập nhật mã nguồn hàm Lambda bằng Amazon EventBridge.
  2. Record Lưu trữ: Cập nhật mã nguồn hàm Lambda bằng cách tạo một chỉ số Amazon CloudWatch.
  3. Visualize Hiển thị: Mối quan hệ giữa việc cập nhật mã nguồn hàm Lambda và các chỉ số KPI ứng dụng bằng cách tạo bảng điều khiển CloudWatch.

Overview

EventBridge và CloudWatch được sử dụng để giám sát và visualize mức độ ảnh hưởng của các thay đổi mã nguồn đối với các hàm Lambda lên các chỉ số quan trọng của ứng dụng.

Step 1: Capturing

AWS CloudTrail capture tất cả các sự kiện quản lý cho các dịch vụ AWS. Đây là các thao tác được thực hiện trên tài nguyên trong tài khoản AWS của bạn và bao gồm cả việc cập nhật mã nguồn của các hàm Lambda.

Một quy tắc EventBridge có thể lắng nghe các sự kiện cập nhật mã nguồn của các hàm Lambda và gửi các sự kiện này đến các dịch vụ AWS khác, trong trường hợp này là CloudWatch.

Bạn có thể tạo các quy tắc EventBridge bằng cách sử dụng cú pháp sự kiện mẫu làm tham khảo. Để lấy sự kiện mẫu, hãy cập nhật mã nguồn của một hàm Lambda và tìm kiếm trong CloudTrail tất cả các sự kiện có Nguồn sự kiện là lambda.amazonaws.com, và Tên sự kiện bắt đầu bằng UpdateFunctionCode. UpdateFunctionCode là một trong nhiều sự kiện được capture cho các hàm Lambda. Ví dụ:

{
  “eventVersion”: “1.08”,
  “userIdentity”: {
    “type”: “AssumedRole”,
    “principalId”: “x”,
    “arn”: “arn:aws:sts::xxxxxxxxxxxx:assumed-role/Admin/x”,
    “accountId”: “xxxxxxxxxxxx”,
    “accessKeyId”: “xxxxxxxxxxxxxxxxx”,
    “sessionContext”: {
      “sessionIssuer”: {
        “type”: “Role”,
        “principalId”: “x”,
        “arn”: “arn:aws:iam::xxxxxxxxxxxx:role/Admin”,
        “accountId”: “xxxxxxxxxxxx”,
        “userName”: “Admin”
      },
      “webIdFederationData”: {},
      “attributes”: {
        “creationDate”: “2022-09-22T16:37:04Z”,
        “mfaAuthenticated”: “false”
      }
    }
  },
  “eventTime”: “2022-09-22T16:42:07Z”,
  “eventSource”: “lambda.amazonaws.com”,
  “eventName”: “UpdateFunctionCode20150331v2”,
  “awsRegion”: “us-east-1”,
  “sourceIPAddress”: “AWS Internal”,
  “userAgent”: “AWS Internal”,
  “requestParameters”: {
    “fullyQualifiedArn”: {
      “arnPrefix”: {
        “partition”: “aws”,
        “region”: “us-east-1”,
        “account”: “xxxxxxxxxxxx”
      },
      “relativeId”: {
        “functionName”: “example-function”
      },
      “functionQualifier”: {}
    },
    “functionName”: “arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:example-function”,
    “publish”: false,
    “dryRun”: false
  },
  “responseElements”: {
    “functionName”: “example-function”,
    “functionArn”: “arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:example-function”,
    “runtime”: “python3.8”,
    “role”: “arn:aws:iam::xxxxxxxxxxxx:role/role-name”,
    “handler”: “lambda_function.lambda_handler”,
    “codeSize”: 1011,
    “description”: “”,
    “timeout”: 123,
    “memorySize”: 128,
    “lastModified”: “2022-09-22T16:42:07.000+0000”,
    “codeSha256”: “x”,
    “version”: “$LATEST”,
    “environment”: {},
    “tracingConfig”: {
      “mode”: “PassThrough”
    },
    “revisionId”: “x”,
    “state”: “Active”,
    “lastUpdateStatus”: “InProgress”,
    “lastUpdateStatusReason”: “The function is being created.”,
    “lastUpdateStatusReasonCode”: “Creating”,
    “packageType”: “Zip”,
    “architectures”: [“x86_64”],
    “ephemeralStorage”: {
      “size”: 512
    }
  },
  “requestID”: “f566f75f-a7a8-4e87-a177-2db001d40382”,
  “eventID”: “4f90175d-3063-49b4-a467-04150b418457”,
  “readOnly”: false,
  “eventType”: “AwsApiCall”,
  “managementEvent”: true,
  “recipientAccountId”: “113420664689”,
  “eventCategory”: “Management”,
  “sessionCredentialFromConsole”: “true”
}

Các trường quan trọng là eventSource, eventName, functionName, và eventType. Đây là cú pháp sự kiện chỉ chứa các trường quan trọng:

{
  “source”: [“aws.lambda”],
  “detail-type”: [“AWS API Call via CloudTrail”],
  “detail”: {
    “eventSource”: [“lambda.amazonaws.com”],
    “eventName”: [{
      “prefix”: “UpdateFunctionCode”
    }],
    “eventType”: [“AwsApiCall”]
  }
}

Trong quy tắc EventBridge này, phần chi tiết chứa các thuộc tính để khớp với mẫu sự kiện UpdateFunctionCode ban đầu. Các giá trị cần khớp được đặt trong dấu ngoặc vuông dùng cú pháp EventBridge.

Tên sự kiện eventName thay đổi với mỗi sự kiện UpdateFunctionCode, bao gồm cả thông tin ngày và phiên bản trong giá trị (ví dụ: UpdateFunctionCode20150331v2) và do đó một bộ lọc khớp tiền tố được sử dụng để khớp với đầu của eventName.

Nguồn và detail-type của sự kiện là hai trường bổ sung được bao gồm bởi EventBridge. Đối với tất cả các lệnh gọi CloudTrail của Lambda, detail-type là [“AWS API Call via CloudTrail”] và nguồn là “aws.lambda”.

Tiếp theo, gửi một sự kiện đến CloudWatch. Mỗi quy tắc EventBridge có thể gửi sự kiện đến nhiều đích khác nhau, bao gồm Amazon SNSCloudWatch log group. Hãy chọn đích là nhóm log CloudWatch, với nhóm log được chỉ định là /aws/events/lambda/updates. EventBridge sẽ tạo nhóm log này trong CloudWatch.

Cuối cùng, hãy kiểm tra quy tắc EventBridge.

  1. Để kích hoạt một sự kiện, hãy thay đổi mã nguồn cho bất kỳ hàm Lambda nào và triển khai.
  1. Để xem sự kiện, hãy truy cập vào công cụ quản lý CloudWatch > Logs > groupsLogs.
  1. Chọn group log /aws/events/lambda/updates.
  1. Chọn luồng logs gần đây nhất
  1. Nếu quy tắc EventBridge thành công, sự kiện cập nhật mã Lambda sẽ visualize. Để xem JSON từ sự kiện, hãy mở rộng sự kiện bằng các mũi tên ở bên trái và xem trường chi tiết.

Step 2: Recording

Để visualize dữ liệu cập nhật hàm Lambda cùng với các chỉ số CloudWatch khác, hãy chuyển đổi nhật ký sự kiện thành chỉ số bằng cách sử dụng bộ lọc chỉ số. Một bộ lọc chỉ số được tạo trên một nhóm log. Nếu một nhật ký sự kiện khớp với bộ lọc chỉ số, một điểm dữ liệu chỉ số sẽ được tạo ra.

Một bộ lọc chỉ số sử dụng một mẫu lọc để khớp với các trường cụ thể trong sự kiện JSON. Trong trường hợp này, mẫu lọc khớp với eventName bắt đầu bằng UpdateFunctionCode (lưu ý dấu * để khớp tất cả).

{ $.detail.eventName=UpdateFunctionCode* }

Tạo một bộ lọc chỉ số với các thông tin sau:

Không gian tên chỉ số: LambdaEvents
Tên chỉ số: UpdateFunction
Giá trị chỉ số: 1
Kích thước: Tên kích thước: FunctionName; Giá trị kích thước: $.detail.responseElements.functionName

Kích thước cho phép thêm siêu dữ liệu vào chỉ số. Đặt kích thước với đường dẫn JSON $.detail.responseElements.functionName cho phép giá trị FunctionName được lấy từ dữ liệu trong sự kiện log. Điều này biến bộ lọc chỉ số trở nên thông dụng cho bất kỳ hàm Lambda nào.

Mẫu sự kiện của một bộ lọc chỉ số có thể được kiểm tra trên dữ liệu thực bằng phần Kiểm tra mẫu. Chọn luồng log để kiểm tra bộ lọc bằng cách sử dụng menu đưa xuống Chọn dữ liệu log và chọn Kiểm tra mẫu. Điều này visualize một bảng với các sự kiện khớp và giá trị trường.

Giao diện CloudWatch cung cấp một cái nhìn tổng quan về các chỉ số cho các hàm Lambda. Để xem dữ liệu chỉ số, hãy cập nhật mã nguồn cho một hàm Lambda và truy cập giao diện CloudWatch. Chọn Chỉ số > Tất cả chỉ số từ menu bên trái, không gian tên Tùy chỉnh của LambdaEvents, và kích thước FunctionName (như đã đặt trong bộ lọc chỉ số trước đó). Để xem dữ liệu trên biểu đồ, hãy đánh dấu chọn ô bên cạnh chỉ số quan tâm. Chỉ số có thể được thêm vào CloudWatch console từ menu Hành động.

Bộ lọc chỉ số chỉ tạo chỉ số khi một sự kiện log mới được nhập. Bạn phải đợi một sự kiện log mới để xem các chỉ số.

Step 3: Visualizing

Một bảng điều khiển CloudWatch cho phép trực quan hóa dữ liệu chỉ số và tạo các cái nhìn tùy chỉnh. Bảng điều khiển có thể chứa nhiều widget với dữ liệu từ chỉ số, nhật ký và cảnh báo.

Bảng điều khiển sau đây cho thấy một ví dụ về cách trực quan hóa các cập nhật mã Lambda cùng với dữ liệu hiệu suất khác. Không có cách trực quan hóa nào là đúng cho tất cả mọi người. Dữ liệu được thêm vào bảng điều khiển phụ thuộc vào các câu hỏi và hành động mà doanh nghiệp muốn thực hiện. Dữ liệu này có thể thay đổi và bao gồm dữ liệu hiệu suất, chỉ số KPI và trải nghiệm người dùng.

Bảng điều khiển hiển thị dữ liệu về cập nhật mã hàm Lambda và hiệu suất Lambda (thời gian chạy). Widget biểu đồ đường chỉ số visualize biểu đồ dữ liệu thời gian chạy của hàm Lambda với dữ liệu chỉ số cập nhật mã Lambda. Thời gian chạy là một chỉ số hiệu suất được cung cấp cho tất cả các hàm Lambda. Đọc thêm tại Làm việc với chỉ số hàm Lambda.

Ảnh chụp màn hình này cho thấy thời gian chạy của hàm Lambda cho hai hàm khác nhau: PlaceOrder và AddToBasket. Thời gian chạy cho mỗi hàm được thể hiện theo hai cách:

  • Một số đơn lẻ cho thấy thời gian chạy trung bình trong giờ cuối cùng.
  • Một biểu đồ về thời gian chạy theo thời gian.

Sự kiện cập nhật hàm Lambda được visualize trên biểu đồ thời gian chạy dưới dạng một điểm cam. Các cách nhìn khác nhau về thời gian chạy cho thấy một giá trị cấp cao và hành vi chi tiết theo thời gian. Hành vi chi tiết là quan trọng để hiểu kết quả. Với chỉ giá trị cấp cao, rất khó để thấy liệu sự gia tăng trong thời gian chạy hàng giờ có phát sinh từ sự gia tăng thời gian chạy ngắn hạn, xu hướng tăng dần hay sự thay đổi đột ngột trong hành vi hay không.

Điều rõ ràng từ bảng điều khiển này là ngay sau khi cập nhật mã Lambda, thời gian chạy của hàm PlaceOrder tăng đáng kể từ ~100ms lên ~300ms trung bình. Đây là một sự thay đổi đột ngột trong hành vi. Cùng một lần triển khai không có tác động tương tự đến thời gian chạy của hàm AddToBasket. Mặc dù thời gian chạy đang tăng vào cuối khoảng thời gian, nhưng không rõ ràng liệu điều này có phải do triển khai hay không. Bảng điều khiển này cung cấp nhận thức về tác động của thay đổi ở cấp độ hàm để doanh nghiệp có thể quyết định liệu tác động có thể chấp nhận được hay không.

Các nguồn để tạo bảng điều khiển của riêng bạn:

  • Khám phá các chỉ số Lambda mặc định có thể hữu ích.
  • Tìm hiểu thêm về Tạo và làm việc với widget trên bảng điều khiển CloudWatch bao gồm widget số chỉ số, widget đường chỉ số (biểu đồ thời gian) và widget văn bản.
  • Khám phá phần bảng điều khiển của hội thảo One Observability để thực hành trực tiếp.

Kết luận:

Blog này minh họa cách tạo một quy tắc EventBridge và bảng điều khiển CloudWatch để trực quan hóa tác động của các thay đổi mã hàm Lambda lên dữ liệu hiệu suất. Đầu tiên, một quy tắc EventBridge được tạo ra để capture các sự kiện cập nhật mã hàm Lambda trong CloudTrail. 

EventBridge gửi sự kiện đến CloudWatch nơi các sự kiện UpdateFunctionCode được record dưới dạng chỉ số. Dữ liệu sự kiện UpdateFunctionCode được trực quan hóa trong bảng điều khiển CloudWatch bên cạnh dữ liệu hiệu suất Lambda, cho phép các nhóm hiểu rõ hơn tác động của các thay đổi mã và đưa ra các giải pháp dựa trên dữ liệu.

Bạn có thể sửa đổi các khái niệm trong blog này và áp dụng chúng cho nhiều trường hợp sử dụng khác nhau. EventBridge có thể capture triển khai từ AWS CodeCommitAWS CloudFormation devloyment, và gửi các sự kiện đến bảng điều khiển CloudWatch để visualize cùng với các chỉ số khác.