[英]Can a lambda in an AWS Step Function know the "execution name" of the step function that launched it?
我有這個步驟 function 有時會失敗,我想將其記錄在(發電機)數據庫中。 如果我可以創建一個新的錯誤處理步驟並且那個人會從某個地方(沒有在上下文中找到它)獲取“執行名稱”並將其記錄為失敗,那將會很方便。
那可能嗎?
AWS Step Functions 最近發布了一項稱為上下文對象的功能。
在 Parameters 塊中使用 $$ 符號,您可以訪問有關執行的信息,包括執行名稱、arn、狀態機名稱、arn 等。
https://docs.aws.amazon.com/step-functions/latest/dg/input-output-contextobject.html
是的,它可以,但它並不像您希望的那樣直接。
您期望 Lambda 應該能夠獲取調用狀態機的名稱是正確的。 Lambdas 在上下文對象中傳遞,該對象返回有關調用者的信息。 但是,當狀態機調用您的 Lambda 時,該對象為 null。 這意味着兩件事。 你將不得不更加努力地獲得你需要的東西,而且這可能會在未來實施。
現在,我所知道的實現這一目標的唯一方法是從另一個 Lambda 中開始執行狀態機,並在輸入 Json 中傳遞名稱。 這是我的Java代碼......
String executionName = //generate a unique name...
StartExecutionRequest startExecutionRequest = new StartExecutionRequest()
.withStateMachineArn(stateMachineArn)
.withInput(" {"executionName" : executionName} ") //make sure you escape the quotes
.withName(executionName);
StartExecutionResult startExecutionResult = sf.startExecution(startExecutionRequest);
String executionArn = startExecutionResult.getExecutionArn();
如果您這樣做,您現在將在第一步的輸入 JSON 中擁有您的執行名稱。 如果你想在其他步驟中使用它,你應該傳遞它。
您可能還需要執行的ARN,以便您可以從活動或任務中調用狀態機方法。 您可以使用 executionName 自己構建 ARN...
阿爾恩:AWS:美國:美國東1:acountid:執行:statemachinename:executionName
您可以創建一個狀態來提取所有其他狀態可以訪問的上下文詳細信息,例如:
{
"StartAt": "ExtractContextDetails",
"States": {
"ExtractContextDetails": {
"Parameters": {
"arn.$": "$$.Execution.Id"
},
"Type": "Pass",
"ResultPath": "$.contextDetails",
"Next": "NextStateName"
}
}
....
}
否。除非您在事件中傳遞該信息,否則 Lambda 不知道它是否是步進函數的一部分。 階躍函數編排 lambdas 並維護 lambdas 之間的狀態。
我強烈建議在使用 step 函數時在 step 函數配置中指定某種鍵。 對於我的步驟功能,我總是提供:
"ResultPath": "$",
"Parameters": {
"source": "StepFunction",
"type": "LAMBDA_METHOD_SWITCH_VALUE",
"payload.$": "$"
},
並讓對 lambda 的每次調用都使用type
字段來確定要調用的代碼。 當您的代碼失敗時,將其包裝在 try/catch 中並顯式使用傳入的type
,該type
可以是步驟的名稱來確定下一步要做什么。
"States": {
"Get Alter Query": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"FunctionName": "arn:aws:lambda:ap-northeast-2:1111111:function:test-stepfuction:$LATEST",
"Payload": {
"body.$": "$",
"context.$": "$$"
}
},
"Retry": [
{
"ErrorEquals": [
"Lambda.ServiceException",
"Lambda.AWSLambdaException",
"Lambda.SdkClientException",
"Lambda.TooManyRequestsException"
],
"IntervalSeconds": 2,
"MaxAttempts": 6,
"BackoffRate": 2
}
],
"Next": "Alter S3 Location"
}
}
我通過向有效負載添加上下文來解決它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.