[*]{
“Comment”: “A Hello World example of the Amazon States Language using Pass states”,
“StartAt”: “HardCodedInputs”,
“States”: {
“HardCodedInputs”: {
“Type”: “Pass”,
“Parameters”: {
“cluster”: {
“ClusterId”: “ValueForClusterIdVariable”
},
“time”: “ValueForTimeVariable”,
“daysToLookBack”: “ValueFordaysToLookBackVariable”
},
“Next”: “Pre-Process”
},
“Pre-Process”: {
“Type”: “Pass”,
“Parameters”: {
“FormattedInputsForEmr”: {
“ClusterId.$”: “$.cluster.ClusterId”,
“Args”: [
{
“Arg1”: “spark-submit”
},
{
“Arg2”: “–class”
},
{
“Arg3”: “com.some.package.Class”
},
{
“Arg4”: “JarUri”
},
{
“Arg5”: “–startDate”
},
{
“Arg6.$”: “$.time”
},
{
“Arg7”: “–daysToLookBack”
},
{
“Arg8.$”: “$.daysToLookBack”
}
]
}
},
“Next”: “Some Step”
},
“Some Step”: {
“Type”: “Pass”,
“Parameters”: {
“ClusterId.$”: “$.FormattedInputsForEmr.ClusterId”,
“Step”: {
“Name”: “FirstStep”,
“ActionOnFailure”: “CONTINUE”,
“HadoopJarStep”: {
“Jar”: “command-runner.jar”,
“Args.$”: “$.FormattedInputsForEmr.Args[*][*]”
}
}
},
“End”: true
}
}
}
Solución:
Los parámetros le permiten definir pares clave-valor, por lo que como el valor de la clave “Args” es una matriz, no podrá hacer referencia dinámicamente a un elemento específico en la matriz, deberá hacer referencia a toda la matriz en su lugar. Por ejemplo, “Args. $”: “$ .Input.ArgsArray”.
Entonces, para su caso de uso, la mejor manera de lograr esto sería agregar un estado de preprocesamiento, antes de llamar a este estado. En el estado de preprocesamiento, puede llamar a una función Lambda y formatear su entrada / salida a través del código o, para algo tan simple como agregar un valor dinámico a una matriz, puede usar un Estado de paso para reformatear los datos y luego dentro del Estado de su tarea Parámetros que puede usar JSONPath para obtener la matriz que definió en el preprocesador. He aquí un ejemplo:
[*]{ "Comment": "A Hello World example of the Amazon States Language using Pass states", "StartAt": "HardCodedInputs", "States": { "HardCodedInputs": { "Type": "Pass", "Parameters": { "cluster": { "ClusterId": "ValueForClusterIdVariable" }, "time": "ValueForTimeVariable", "daysToLookBack": "ValueFordaysToLookBackVariable" }, "Next": "Pre-Process" }, "Pre-Process": { "Type": "Pass", "Parameters": { "FormattedInputsForEmr": { "ClusterId.$": "$.cluster.ClusterId", "Args": [ { "Arg1": "spark-submit" }, { "Arg2": "--class" }, { "Arg3": "com.some.package.Class" }, { "Arg4": "JarUri" }, { "Arg5": "--startDate" }, { "Arg6.$": "$.time" }, { "Arg7": "--daysToLookBack" }, { "Arg8.$": "$.daysToLookBack" } ] } }, "Next": "Some Step" }, "Some Step": { "Type": "Pass", "Parameters": { "ClusterId.$": "$.FormattedInputsForEmr.ClusterId", "Step": { "Name": "FirstStep", "ActionOnFailure": "CONTINUE", "HadoopJarStep": { "Jar": "command-runner.jar", "Args.$": "$.FormattedInputsForEmr.Args[*][*]" } } }, "End": true } } }
Puedes usar el [*]States.Array() función intrínseca. Tu [*]Parameters se convierte en:
[*] "Parameters": { "ClusterId.$": "$.cluster.ClusterId", "Step": { "Name": "FirstStep", "ActionOnFailure": "CONTINUE", "HadoopJarStep": { "Jar": "command-runner.jar", "Args.$": "States.Array('spark-submit', '--class', 'com.some.package.Class', 'JarUri', '--startDate', $.time, '--daysToLookBack', '$.daysToLookBack')" } } }
Las funciones intrínsecas están documentadas aquí, pero no creo que explique muy bien el uso. Los fragmentos de código proporcionados en la consola Step Functions son más útiles.
Tenga en cuenta que también puede formatear cadenas en los argumentos usando [*]States.Format(). Por ejemplo, puede construir una ruta utilizando una variable de entrada como segmento final de la ruta:
[*]"Args.$": "States.Array('mycommand', '--path', States.Format('my/base/path/{}', $.someInputVariable))"