處理無伺服器應用程式中的錯誤
使用 AWS Step Functions 和 AWS Lambda
在此教學中,您將了解如何使用 AWS Step Functions 處理工作流程執行階段的錯誤。AWS Step Functions 是一種無伺服器協調服務,可讓您輕鬆地將多個 Lambda 函數協調為易於偵錯和變更的彈性工作流程。AWS Lambda 是一種運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。
Lambda 函數偶爾會失敗,例如當發出未處理的例外、當這種函數執行得超過設定的逾時時間,或是記憶體用盡時。在您的每一個 Lambda 函數中撰寫並維護錯誤處理邏輯,以處理例如 API 調節或通訊端逾時等情況,恐怕是既耗時又繁複的工作,對於分散式應用程式而言更是如此。將此程式碼內嵌至各個 Lambda 函數,會在其彼此之間造成相依性;隨著事物變遷,這麼多的關聯可能維護不易。
為了避免這些困擾,同時減少所需撰寫的錯誤處理程式碼數量,您可使用 AWS Step Functions 建立能支援函數錯誤處理的無伺服器工作流程。無論是開發人員建立的函數例外狀況 (例如,找不到檔案) 或未預期 (例如,記憶體不足) 的錯誤,您可設定 Step Functions 根據發生的錯誤類型,使用條件邏輯加以回應。以此方式將工作流程邏輯與商務邏輯相互區隔,無需變更 Lambda 函數的商務邏輯,即可修改工作流程對於錯誤的回應方式。
在此教學中,您將使用 AWS Step Functions 設計並執行無伺服器工作流程,穩定地處理這類錯誤。您將會建立 AWS Lambda 函數以模擬呼叫 RESTful API,傳回各種回應碼和例外。接著,會請您使用 AWS Step Functions 建立具有「重試」和「擷取」能力的狀態機器,依照發生的例外而定,以不同的邏輯回應。
步驟 1.建立 Lambda 函數以模擬 API
在此步驟中,您將建立 Lambda 函數,模擬幾種基本的 API 互動。Lambda 函數會以您提供的錯誤代碼作為事件參數中的輸入,發出例外以模擬虛構 API 所作的回應。
a. 開啟 AWS 管理主控台,以便讓此逐步指南持續保持開啟狀態。當畫面載入時,請輸入您的使用者名稱和密碼以開始使用。接著在搜尋列輸入 Lambda,選取 Lambda 開啟服務主控台。
d.在 MockAPIFunction 畫面,向下捲動至函數程式碼畫面。在此教學中,您將建立函數,其使用程式設計模型於 Python 中編寫 Lambda 函數。在程式碼視窗中,將所有程式碼取代為以下所示,接著選擇儲存。
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')
步驟 2.建立 AWS Identity and Access Management (IAM) 角色
AWS Step Functions 能執行程式碼並存取其他 AWS 資源 (例如,存放在 Amazon S3 儲存貯體內的資料)。為維護安全起見,您必須使用 AWS Identity and Access Management (IAM),授與 Step Functions 對這些資源的存取權。
步驟 3.建立 Step Functions 狀態機器
現在您已建立模擬 API 回應的簡易 Lambda 函數,接著可以建立 Step Functions 狀態機器以呼叫 API 並處理例外。
在此步驟中,您將使用 Step Functions 主控台建立狀態機器,其使用「任務」狀態搭配「重試」和「擷取」欄位以處理各種 API 回應碼。您將以「任務」狀態叫用您模擬的 API Lambda 函數,其將傳回您作為輸入提供到狀態機器的 API 狀態碼。
a.開啟 AWS Step Functions 主控台。在建立狀態機器頁面,選取從頭開始撰寫。在詳細資訊區段,將您的狀態機器命名為 MyAPIStateMachine,然後選取我要使用現有的角色。
b.接下來,請您設計狀態機器,能夠依照您的模擬 API 所給的回應採取不同的動作。若無法連線至該 API,工作流程會再試一次。重試是解決暫時錯誤的好方法。此工作流程也能擷取模擬 API 擲出的各種例外。
將狀態機器定義區段的內容取代為以下程式碼:
{
"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
}
}
}
步驟 4.測試錯誤處理工作流程
為了測試您的錯誤處理工作流程,您將叫用狀態機器,提供錯誤代碼作為輸入,以呼叫模擬 API。
步驟 5.檢查狀態機器的執行
步驟 6.終止您的資源
在此步驟中,您將終止您的 AWS Step Functions 和 AWS Lambda 相關資源。
重要:終止非主動使用中的資源可降低成本,且為最佳實務。未終止資源可能產生費用。
恭喜您!
您已使用 AWS Step Functions 和 AWS Lambda,為網路 API 建立錯誤處理工作流程。使用 AWS Lambda,您可以為幾乎任何類型的應用程式或後端服務執行程式碼,無須任何管理。只需上傳程式碼,Lambda 就會運用其高可用性來處理執行程式碼及擴展規模所需的各項工作。
將 AWS Step Functions 與 AWS Lambda 合併 ,可輕鬆協調無伺服器應用程式的 AWS Lambda 函數。Step Functions 可讓您使用 Lambda 函數控制繁複的工作流程,無需以基礎應用程式管理並協調狀態。您還可以將 Step Functions 用於使用運算資源 (如 Amazon EC2 和 Amazon ECS) 的微型服務協調。