by James Beswick | on 02 MAY 2024 | in AWS Step Functions, Serverless | Permalink | Share
Bài đăng này được viết bởi Ben Freiberg, Kiến trúc sư giải pháp cao cấp.
Các nhà phát triển thường chọn AWS Step Functions (AWS Step Functions) để điều phối các dịch vụ bao gồm ứng dụng của họ. Step Functions là một dịch vụ quy trình làm việc trực quan giúp các nhà phát triển dễ dàng xây dựng các ứng dụng phân tán, tự động hóa các quy trình, điều phối các vi dịch vụ và tạo các đường ống dữ liệu và máy học (ML). Step Functions tích hợp với hơn 220 dịch vụ AWS và mọi điểm cuối HTTP có thể truy cập công khai. Step Functions cung cấp nhiều tính năng giúp các nhà phát triển xây dựng, chẳng hạn như xử lý lỗi tích hợp, lịch sử thực thi quy trình làm việc theo thời gian thực và có thể kiểm tra và xử lý song song quy mô lớn.
Một số lĩnh vực có thể tốn thời gian cho các nhà phát triển khi thử nghiệm quy trình làm việc Step Functions. Ví dụ: xác thực với các dịch vụ bên ngoài, xử lý đầu vào\/đầu ra, quyền AWS IAM(AWS IAM) hoặc các hàm nội tại. Để đơn giản hóa và tăng tốc độ giải quyết những vấn đề này, Step Functions đã phát hành một khả năng mới vào năm ngoái để kiểm tra các trạng thái riêng lẻ:TestState API(TestState API). Tính năng này cho phép bạn kiểm tra các trạng thái một cách độc lập với việc thực hiện quy trình công việc của bạn. Bạn có thể thay đổi đầu vào và kiểm tra các kịch bản khác nhau mà không cần triển khai quy trình công việc hoặc thực thi toàn bộ máy trạng thái. Tính năng này có sẵn cho tất cả các trạng thái nhiệm vụ, lựa chọn và vượt qua.
Vì các nhà phát triển dành nhiều thời gian cho IDE và thiết bị đầu cuối nên TestState cũng có sẵn thông qua API. Điều này cho phép bạn lặp lại các thay đổi cho một trạng thái riêng lẻ và cho phép bạn tinh chỉnh quá trình xử lý đầu vào/đầu ra hoặc logic điều kiện ở trạng thái lựa chọn mà không cần rời khỏi IDE. Trong bài đăng này, bạn sẽ tìm hiểu cách API TestState có thể tăng tốc độ thử nghiệm và phát triển của bạn.
Bắt đầu với TestState
Giả sử bạn đang phát triển quy trình xử lý thanh toán bao gồm ba trạng thái. Đầu tiên, trạng thái Lựa chọn kiểm tra loại thanh toán dựa trên dữ liệu đầu vào. Tùy thuộc vào loại, nó gọi hàm AWS Lambda(AWS Lambda) hoặc điểm cuối bên ngoài. Trạng thái tác vụ gọi hàm Lambda bao gồm một số quá trình xử lý đầu vào/đầu ra.
Để bắt đầu với API TestState, bạn phải tạo vai trò IAM mà dịch vụ có thể đảm nhận. Vai trò này phải chứa các quyền IAM cần thiết đối với tài nguyên mà tiểu bang của bạn đang truy cập. Để biết thông tin về các quyền mà một trạng thái có thể cần, hãy xem Quyền IAM(IAM permissions to test a state) để kiểm tra trạng thái. Đoạn mã sau đây hiển thị các quyền cần thiết tối thiểu:
| JSON{ “Version”: “2012-10-17”, “Statement”: [ { “Effect”: “Allow”, “Action”: [ “states:TestState”, “iam:PassRole” ], “Resource”: “*” } ]} |
Tiếp theo, bạn phải cung cấp định nghĩa về trạng thái đang được kiểm tra. Trạng thái lựa chọn được cấu hình để kiểm tra hình thức thanh toán và nếu có voucherId, trong trường hợp có chứng từ. Đoạn mã sau đây cho thấy định nghĩa trạng thái:
| JSON { “Type”: “Choice”, “Choices”: [ { “And”: [ { “Variable”: “$.payment.type”, “IsPresent”: true }, { “Variable”: “$.payment.type”, “StringEquals”: “voucher” } ], “Next”: “Process voucher” }, { “Variable”: “$.payment.type”, “StringEquals”: “credit”, “Next”: “Call payment provider” } ], “Default”: “Fail”} |
Sử dụng định nghĩa vai trò và trạng thái, bây giờ bạn có thể kiểm tra xem đầu vào có dẫn đến trạng thái tiếp theo dự kiến hay không:
| BASH aws stepfunctions test-state –definition file://choice.json –role-arn “arn:aws:iam::<account-id>:role/StepFunctions-TestState-Role” –input ‘{“payment”:{“type”:”voucher”}}’ |
Phản hồi cho thấy thử nghiệm không gặp phải bất kỳ lỗi nào và trạng thái tiếp theo sẽ gọi hàm Lambda để xử lý voucher như mong đợi.
| JSON { “output”: “{\”payment\”:{\”type\”:\”voucher\”}}”, “nextState”: “Process voucher”, “status”: “SUCCEEDED”} |
Tương tự, với loại tín dụng thanh toán làm đầu vào, trạng thái tiếp theo sẽ gọi điểm cuối của bên thứ ba:
| BASH aws stepfunctions test-state–definition file://choice.json–role-arn “arn:aws:iam::<account-id>:role/StepFunctions-TestState-Role”–input ‘{“payment”:{“type”:”credit”}}’ |
| JSON { “output”: “{\”payment\”:{\”type\”:\”credit\”}}”, “nextState”: “Call payment provider”, “status”: “SUCCEEDED”} |
Vì API TestState lấy định nghĩa trạng thái làm đối số, bạn không phải triển khai lại máy trạng thái khi thay đổi định nghĩa trạng thái. Thay vào đó, bạn có thể lặp lại và kiểm tra cài đặt của mình bằng cách chuyển định nghĩa trạng thái đã sửa đổi sang API TestState.
Sử dụng các cấp độ kiểm tra
Đối với mỗi tiểu bang, bạn có thể chỉ định số lượng chi tiết bạn muốn xem trong kết quả kiểm tra. Những chi tiết này cung cấp thêm thông tin về tiểu bang mà bạn đang thử nghiệm. Ví dụ: nếu bạn đã sử dụng bất kỳ bộ lọc xử lý dữ liệu đầu vào và đầu ra nào, chẳng hạn như InputPath(InputPath) hoặc ResultPath(ResultPath) ở trạng thái, bạn có thể xem kết quả xử lý dữ liệu trung gian và cuối cùng. Step Functions cung cấp các cấp độ sau để chỉ định chi tiết bạn muốn xem, INFO(INTO), DEBUG(DEBUG) và TRACE(TRACE). Tất cả các mức này trả về các trường trạng thái và nextState.
Tiếp theo, trạng thái Lambda Invoke được kiểm tra. Trong trường hợp này, trạng thái bao gồm xử lý đầu vào\/đầu ra. Đầu ra từ hàm được chuyển đổi bằng cách đổi tên và tái cấu trúc trường và sau đó hợp nhất với đầu vào ban đầu. Đây là phần có liên quan của định nghĩa nhiệm vụ:
| JSON “Process voucher”: { “Type”: “Task”, “Resource”: “arn:aws:states:::lambda:invoke”, “Parameters”: {…}, “Retry”: […], “Next”: “Success”, “ResultPath”: “$.voucherProcessed”, “ResultSelector”: { “status.$”: “$.Payload.result”, “workflowId.$”: “$.Payload.workflow” }} |
Lần này kiểm tra bằng bảng điều khiển Step Functions, có thể giúp dễ hiểu hơn các bước xử lý đầu vào \/ đầu ra. Để bắt đầu, hãy mở máy trạng thái trong Workflow Studio và chọn trạng thái, sau đó chọn Trạng thái Kiểm tra. Đảm bảo chọn DEBUG làm cấp độ kiểm tra. Sau khi kiểm tra trạng thái, hãy chuyển sang tab Xử lý đầu vào \/ đầu ra để kiểm tra các bước trung gian.
Khi bạn gọi API TestState và đặt tham số inspectionLevel thành DEBUG, phản hồi API bao gồm một đối tượng được gọi là inspectionData. Đối tượng này chứa các trường để giúp bạn kiểm tra cách dữ liệu được lọc hoặc thao tác trong trạng thái khi nó được thực thi. Dữ liệu này được hiển thị trong tab Xử lý đầu vào\/đầu ra trong bảng điều khiển. Việc có thể xem tất cả các bước xử lý dễ dàng ở một nơi cho phép các nhà phát triển phát hiện sự cố và lặp lại nhanh hơn, tiết kiệm thời gian.
Thử nghiệm tích hợp điểm cuối của bên thứ ba
Các ứng dụng có thể gọi các điểm cuối của bên thứ ba yêu cầu xác thực. Step Functions cung cấp tài nguyên điểm cuối HTTPS để kết nối với các mục tiêu HTTP của bên thứ ba bên ngoài Đám mây AWS.
Điểm cuối HTTPS sử dụng kết nối Amazon EventBridge(Amazon EventBridge connections) để quản lý thông tin xác thực cho đích. Điều này xác định loại ủy quyền được sử dụng, có thể là xác thực cơ bản với tên người dùng và mật khẩu, khóa API hoặc OAuth. Kết nối EventBridge sử dụng AWS Secrets Manager(AWS Secrets Manager) để lưu trữ bí mật. Điều này giữ bí mật ra khỏi máy trạng thái, giảm rủi ro vô tình tiết lộ bí mật của bạn trong nhật ký hoặc trong định nghĩa máy trạng thái.
Việc xác thực đúng cấu hình có thể liên quan đến một số lần lặp tốn thời gian. Với cấp độ kiểm tra TRACE, các nhà phát triển có thể xem yêu cầu và phản hồi HTTP thô, rất hữu ích cho việc xác minh tiêu đề, tham số truy vấn và các chi tiết cụ thể khác của API. Tùy chọn này chỉ có sẵn cho Tác vụ HTTP(HTTP Task). Bạn cũng có thể xem các bí mật có trong kết nối EventBridge (EventBridge connection). Để thực hiện việc này, bạn phải đặt tham số revealSecrets thành true trong API(TestState). Điều này có thể giúp xác minh rằng các tham số xác thực chính xác được sử dụng.
Để bắt đầu, hãy đảm bảo rằng vai trò thực thi được sử dụng để kiểm thử có các quyền cần thiết, như được hiển thị ở đây:
| JSON { “Version”: “2012-10-17”, “Statement”: [ { “Effect”: “Allow”, “Action”: [ “secretsmanager:GetSecretValue”, “secretsmanager:DescribeSecret” ], “Resource”: “arn:aws:secretsmanager:<your-region>:<account-id>:secret:events!connection/<your-connection-id>” } ]}{ “Version”: “2012-10-17”, “Statement”: [ { “Sid”: “RetrieveConnectionCredentials”, “Effect”: “Allow”, “Action”: [ “events:RetrieveConnectionCredentials” ], “Resource”: [ “arn:aws:events:<your-region>:<account-id>:connection/<your-connection-id>” ] } ]}{ “Version”: “2012-10-17”, “Statement”: [ { “Sid”: “InvokeHTTPEndpoint”, “Effect”: “Allow”, “Action”: [ “states:InvokeHTTPEndpoint” ], “Resource”: [ “arn:aws:states:<your-region>:<account-id>:stateMachine:<your-statemachine>” ] } ]} |
Khi bạn kiểm tra tác vụ HTTP, hãy đảm bảo đặt mức kiểm tra thành TRACE. Sau đó sử dụng tab yêu cầu và phản hồi HTTP để kiểm tra chi tiết. Khả năng này giúp bạn tiết kiệm thời gian khi gỡ lỗi các vấn đề xác thực phức tạp.
Tự động kiểm thử
Kiểm thử không chỉ là một hoạt động thủ công để có được cấu hình đúng. Thông thường, các thử nghiệm được chạy như một phần của bộ kiểm tra, được thực hiện tự động để xác thực hành vi chính xác. Nó cũng ngăn chặn hồi quy khi thực hiện thay đổi. API TestState cũng có thể dễ dàng được tích hợp trong các thử nghiệm như vậy. Đoạn mã sau đây cho thấy một bài kiểm tra sử dụng Jest framework trong JavaScript. Thử nghiệm kiểm tra xem trạng thái tiếp theo chính xác có được tạo ra hay không, đưa ra định nghĩa và đầu vào. Định nghĩa nằm trong một tệp khác, cũng có thể được sử dụng cho cơ sở hạ tầng dưới dạng mã (IaC) để tạo máy trạng thái.
| JavaScript const { SFNClient, TestStateCommand } = require(“@aws-sdk/client-sfn”);// Import the state definition const definition = require(“./definition.json”); const client = new SFNClient({}); describe(“Step Functions”, () => { test(“that next state is correct”, async () => { const command = new TestStateCommand({ definition: JSON.stringify(definition), roleArn: “arn:aws:iam::<account-id>:role/<role-with-sufficient-permissions>”, input: “{}” # Adjust as necessary }); const data = await client.send(command); expect(data.status).toBe(“SUCCEEDED”); expect(data.nextState).toBe(“Success”); # Adjust as necessary });}); |
Với kiểm tra tự động, bạn có thể thay đổi định nghĩa quy trình làm việc của mình một cách an toàn mà không cần nỗ lực thủ công. Bằng cách đó, bạn sẽ được cảnh báo ngay lập tức nếu một thay đổi sẽ dẫn đến sự không tương thích. Với TestState, bạn có thể tăng phạm vi kiểm tra của mình với ít nỗ lực hơn vì bạn có thể kiểm tra trạng thái trực tiếp. Điều này đặc biệt hữu ích cho các quy trình công việc phức tạp và các trạng thái yêu cầu một tập hợp các trường hợp cụ thể để tiếp cận chúng. Nó cũng giúp bạn dễ dàng xác nhận tính đúng đắn của việc xử lý lỗi của mình. Bây giờ bạn có thể kiểm tra nhiều kết hợp tiềm năng của Retriers(Retriers)và Catchers(Catchers ) đã cấu hình của bạn dễ dàng hơn nhiều.
Kết thúc
API TestState giúp các nhà phát triển lặp lại nhanh hơn, giải quyết vấn đề hiệu quả và cung cấp các ứng dụng chất lượng cao với độ tin cậy cao hơn. Bằng cách cho phép các nhà phát triển kiểm tra các trạng thái riêng lẻ một cách độc lập và tích hợp thử nghiệm vào quy trình phát triển ưa thích của họ, nó đơn giản hóa quá trình gỡ lỗi và giảm chuyển đổi ngữ cảnh. Cho dù kiểm tra xử lý đầu vào \/ đầu ra, xác thực với các dịch vụ bên ngoài hoặc tích hợp điểm cuối của bên thứ ba, API TestState có thể là một công cụ hữu ích để kiểm tra.
TAGS:contributed, serverless