기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
변수를 사용하여 상태 간에 데이터 전달
변수 및 JSONata를 사용하여 상태 관리
Step Functions는 최근에 상태를 관리하고 데이터를 변환하기 위해 변수와 JSONata를 추가했습니다.
블로그 게시물에서 변수 및 JSONata를 사용한 개발자 경험 간소화에서 AWS Step Functions
다음 비디오에서는 DynamoDB 예제를 사용하여 Step Functions의 변수 및 JSONata를 설명합니다.
변수 및 상태 출력을 사용하면 워크플로의 단계 간에 데이터를 전달할 수 있습니다.
워크플로 변수를 사용하면 한 단계에서 데이터를 저장하고 향후 단계에서 해당 데이터를 검색할 수 있습니다. 예를 들어 나중에 필요할 수 있는 데이터가 포함된 API 응답을 저장할 수 있습니다. 반대로 상태 출력은 다음 단계의 입력으로만 사용할 수 있습니다.
변수의 개념적 개요
워크플로 변수를 사용하면 나중에 참조할 데이터를 저장할 수 있습니다. 예를 들어 1단계는 API 요청의 결과를 저장할 수 있으므로 해당 요청의 일부를 5단계의 뒷부분에서 재사용할 수 있습니다.
다음 시나리오에서는 상태 머신이 API에서 데이터를 한 번 가져옵니다. 1단계에서 워크플로는 반환된 API 데이터(상태당 최대 256KiB)를 이후 단계에서 사용할 변수 'x'에 저장합니다.
변수가 없으면 5단계에서 사용하려면 1단계에서 2단계, 3단계, 4단계의 출력을 통해 데이터를 전달해야 합니다. 이러한 중간 단계에 데이터가 필요하지 않으면 어떻게 해야 하나요? 출력 및 입력을 통해 데이터를 상태에서 상태로 전달하는 것은 불필요한 작업입니다.
변수를 사용하면 데이터를 저장하고 향후 단계에서 사용할 수 있습니다. 데이터 흐름을 중단하지 않고 단계를 수정, 재배열 또는 추가할 수도 있습니다. 변수의 유연성을 고려할 때 병렬 및 맵 하위 워크플로와 상태 시스템 실행 종료 시 데이터를 반환하는 데만 출력을 사용해야 할 수 있습니다.
변수를 지원하는 상태
다음 상태 유형은가 값을 선언하고 변수에 할당Assign
할 수 있도록 지원합니다. Pass, Task, Map, Parallel, Choice, Wait.
변수를 설정하려면 변수 이름과 값을 JSON 객체에 제공합니다.
"Assign": {
"productName": "product1",
"count" : 42,
"available" : true
}
변수를 참조하려면 이름 앞에 달러 기호($
)를 붙입니다. 예: $productName
.
예약 변수: $states
Step Functions는 라는 단일 예약 변수를 정의합니다$states
. JSONata 상태에서는 JSONata 표현식에 사용할 수 있도록 다음 구조가 $states
에 할당됩니다.
# Reserved $states variable in JSONata states
$states = {
"input": // Original input to the state
"result": // API or sub-workflow's result (if successful)
"errorOutput": // Error Output (only available in a Catch)
"context": // Context object
}
상태 입력 시 Step Functions는 상태 입력을에 할당합니다$states.input
. 의 값은 JSONata 표현식을 수락하는 모든 필드에 사용할 $states.input
수 있습니다.는 $states.input
항상 원래 상태 입력을 참조합니다.
Task
, Parallel
및 Map
상태의 경우:
-
$states.result
는 성공할 경우 API 또는 하위 워크플로의 원시 결과를 나타냅니다. -
$states.errorOutput
는 API 또는 하위 워크플로가 실패한 경우 오류 출력을 참조합니다.$states.errorOutput
는Catch
필드의Assign
또는에서 사용할 수 있습니다Output
.
액세스할 수 없는 필드 및 상태에서 $states.result
또는 $states.errorOutput
에 액세스하려고 하면 상태 시스템의 생성, 업데이트 또는 검증 시 발견됩니다.
$states.context
객체는 , StartTime
태스크 토큰, 초기 워크플로 입력과 같은 특정 실행에 대한 워크플로 정보를 제공합니다. 자세한 내용은 Step Functions의 컨텍스트 객체에서 실행 데이터 액세스 을 참조하십시오.
변수 이름 구문
변수 이름은 Unicode® Standard Annex #31에 설명된 유니코드
변수 이름 규칙은 JavaScript 및 기타 프로그래밍 언어에 대한 규칙과 유사합니다.
가변 범위
Step Functions 워크플로는 워크플로-로컬 범위를 사용하여 변수가 있는 레이스 조건을 방지합니다.
워크플로-로컬 범위에는 상태 시스템의 상태 필드 내의 모든 상태가 포함되지만 병렬 또는 맵 상태 내의 상태는 포함되지 않습니다. 병렬 또는 맵 상태 내의 상태는 외부 범위 변수를 참조할 수 있지만 별도의 워크플로-로컬 변수 및 값을 생성하고 유지합니다.
Parallel
브랜치 및 Map
반복은 외부 범위에서 변수 값에 액세스할 수 있지만 다른 동시 브랜치 또는 반복의 변수 값에는 액세스할 수 없습니다. 오류를 처리할 때의 Assign
필드는 외부 범위, 즉 병렬/맵 상태가 존재하는 범위의 변수에 값을 할당할 Catch
수 있습니다.
예외: Distributed Map 상태는 현재 외부 범위의 변수를 참조할 수 없습니다.
범위의 상태가 변수에 값을 할당하는 경우 변수는 범위에 존재합니다. 일반적인 오류를 방지하기 위해 내부 범위에 할당된 변수는 외부 범위에 할당된 변수와 동일한 이름을 가질 수 없습니다. 예를 들어 최상위 범위가 라는 변수에 값을 할당하는 경우 다른 범위(, 내부Map
Parallel
)myVariable
도에 할당할 수 myVariable
없습니다.
변수에 대한 액세스는 현재 범위에 따라 달라집니다. 병렬 및 맵 상태는 자체 범위가 있지만 외부 범위의 변수에 액세스할 수 있습니다.
병렬 또는 맵 상태가 완료되면 모든 변수가 범위를 벗어나 액세스가 중지됩니다. 출력 필드를 사용하여 병렬 브랜치 및 맵 반복에서 데이터를 전달합니다.
ASL에서 필드 할당
ASL의 Assign
필드는 하나 이상의 변수에 값을 할당하는 데 사용됩니다. Assign
필드는 각 상태의 최상위 수준( Succeed
및 제외Fail
), Choice
상태 규칙 내부 및 Catch
필드 내부에서 사용할 수 있습니다. 예시:
# Example of Assign with JSONata
"Store inputs": {
"Type": "Pass",
"Next": "Get Current Price",
"Comment": "Store the input desired price into a variable: $desiredPrice",
"Assign": {
"desiredPrice": "{% $states.input.desired_price %}",
"maximumWait": "{% $states.input.max_days %}"
}
},
Assign
필드는 JSON 객체를 가져옵니다. 각 최상위 필드는 할당할 변수의 이름을 지정합니다. 이전 예제에서 변수 이름은 desiredPrice
및 입니다maximumWait
. JSONata를 사용할 때는 변수 또는 더 복잡한 표현식을 포함할 수 있는 JSONata 표현식을 {% ... %}
나타냅니다. JSONata 표현식에 대한 자세한 내용은 JSONata.org 설명서를
JSONata를 쿼리 언어로 사용하는 경우 다음 다이어그램은 할당 및 출력 필드를 병렬로 처리하는 방법을 보여줍니다. 암시: 변수 값을 할당해도 상태 출력에는 영향을 주지 않습니다.
다음 JSONata 예제는 상태 입력order.product
에서 가져옵니다. 변수는 작업 결과의 값으로 currentPrice
설정됩니다.
# Example of Task with JSONata assignment from result
{
"Type": "Task",
...
"Assign": {
"product": "{% $states.input.order.product %}",
"currentPrice": "{% $states.result.Payload.current_price %}"
},
"Next": "the next state"
}
참고: 변수의 일부에는 값을 할당할 수 없습니다. 예를 들어 "Assign":{"x":42}
는 할 수 있지만 "Assign":{"x.y":42}
또는는 할 수 없습니다"Assign":{"x[2]":42}
.
할당 필드의 평가 순서
Step Functions 상태의 모든 변수 참조는 상태 항목에 있는 것처럼 값을 사용합니다.
앞의 사실은 Assign
필드가 하나 이상의 변수에 값을 할당하는 방법을 이해하는 데 중요합니다. 먼저 새 값이 계산되고 Step Functions는 변수에 새 값을 할당합니다. 새 변수 값은 다음 상태에서부터 사용할 수 있습니다. 예를 들어 다음 Assign
필드를 고려해 보세요.
# Starting values: $x=3, $a=6
"Assign": {
"x": "{% $a %}",
"nextX": "{% $x %}"
}
# Ending values: $x=6, $nextX=3
앞의 예에서 변수x
는 할당되고 참조됩니다.
모든 표현식이 먼저 평가되고 할당이 이루어집니다. 그리고 새로 할당된 값은 다음 상태에서 사용할 수 있습니다.
예제를 자세히 살펴보겠습니다. 이전 상태에서 $x
에 값이 세(3) 개 할당되고 값이 여섯(6) 개 할당$a
되었다고 가정합니다. 다음 단계에서는 프로세스에 대해 설명합니다.
-
모든 표현식은 모든 변수의 현재 값을 사용하여 평가됩니다.
표현식은 6으로 평가되고
"{% $a %}"
는 3으로 평가"{% $x %}"
됩니다. -
다음으로 할당이 이루어집니다.
$x
에 육(6) 값이 할당됩니다.$nextX
세(3) 개가 할당됩니다.
참고: 이전에 할당$x
되지 않은 경우가 정의되지 않았기 때문에 예제가 실패$x
합니다.
요약하면 Step Functions는 모든 표현식을 평가한 다음 할당합니다. Assign
필드에서 변수가 발생하는 순서는 중요하지 않습니다.
Limits
단일 변수의 최대 크기는 Standard 및 Express 워크플로 모두에 대해 256Kib입니다.
단일 Assign
필드의 모든 변수에 대한 최대 결합 크기도 256Kib입니다. 예를 들어 X와 Y를 128KiB에 할당할 수 있지만 동일한 Assign
필드에서 X와 Y를 모두 256KiB에 할당할 수는 없습니다.
저장된 모든 변수의 총 크기는 실행당 10MiB를 초과할 수 없습니다.
JSONPath 상태에서 변수 사용
변수는 쿼리 언어에 JSONPath를 사용하는 상태에서도 사용할 수 있습니다.
JSONpath 표현식( $.
또는 $$.
구문)을 수락하는 모든 필드에서 변수를 참조할 수 있습니다. 단ResultPath
, 상태 입력에서 상태 결과를 주입할 위치를 지정하는는 예외입니다. 변수는에서 사용할 수 없습니다ResultPath
.
JSONPath에서 $
기호는 '현재' 값을 나타내며 컨텍스트 객체 상태를 $$
나타냅니다. JSONPath 표현식은 에서와 $.
같이 로 시작할 수 있습니다$.customer.name
. $$.
에서처럼를 사용하여 컨텍스트에 액세스할 수 있습니다$$.Execution.Id
.
변수를 참조하려면 $x
또는와 같은 변수 이름 앞에 $
기호를 사용합니다$order.numItems
.
내장 함수를 허용하는 JSONPath 필드에서는 변수를와 같은 인수에 사용할 수 있습니다States.Format('The order number is {}', $order.number)
.
다음 다이어그램은 JSONPath 작업의 할당 단계가 ResultSelector와 동시에에서 어떻게 발생하는지 보여줍니다.
JSONPath에서 변수 할당
JSONPath 변수 할당은 페이로드 템플릿과 유사하게 작동합니다. 로 끝나는 필드는 Step Functions가 상태 시스템 실행 중에 값으로 평가하는 JSONPath 표현식.$
입니다(예: $.order..product
및 $.order.total
).
# Example of Assign with JSONPath
{
"Type": "Task",
...
"Assign": {
"products.$": "$.order..product",
"orderTotal.$": "$.order.total"
},
"Next": "the next state"
}
JSONPath 상태의 경우 $
Assign
필드의 값은 상태 유형에 따라 다릅니다. 에서 Task,
상태는 API/하위 워크플로 결과를 Map
Parallel
$
나타냅니다. Choice
및 Wait
상태에서는 InputPath
가 상태 입력에 적용된 후의 값인 유효 입력을 $
나타냅니다. 의 경우 Pass
는 Result
필드에 의해 생성되든 InputPath
/Parameters
필드에 의해 생성되든 결과를 $
나타냅니다.
다음 JSONPath 예제에서는 details
변수에 JSON 객체,에 JSONPath 표현식의 결과resultCode
, $.result.code
에 JSONPath 표현식의 결과를 할당States.Format('Hello {}', $customer.name)
합니다message
. 이 Task
상태가 상태인 경우 $.order.items
및 $
에서 API 결과를 $.result.code
참조합니다. startTime
변수는 컨텍스트 객체의 값으로 할당됩니다$$.Execution.StartTime
.
"Assign": {
"details": {
"status": "SUCCESS",
"lineItems.$": "$.order.items"
},
"resultCode.$": "$.result.code",
"message.$": "States.Format('Hello {}', $customer.name)",
"startTime.$": "$$.Execution.StartTime"
}