Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Melewati data antar negara bagian dengan variabel
Mengelola status dengan variabel dan Jsonata
Step Functions baru-baru ini menambahkan variabel dan Jsonata untuk mengelola status dan mengubah data.
Pelajari lebih lanjut di posting blog Menyederhanakan pengalaman pengembang dengan variabel dan Jsonata
Video berikut menjelaskan variabel dan Jsonata dalam Step Functions dengan contoh DynamoDB:
Dengan variabel dan output status, Anda dapat meneruskan data di antara langkah-langkah alur kerja Anda.
Dengan menggunakan variabel alur kerja, Anda dapat menyimpan data dalam satu langkah dan mengambil data tersebut di langkah masa depan. Misalnya, Anda dapat menyimpan respons API yang berisi data yang mungkin Anda perlukan nanti. Sebaliknya, output status hanya dapat digunakan sebagai masukan ke langkah berikutnya.
Tinjauan konseptual variabel
Dengan variabel alur kerja, Anda dapat menyimpan data untuk referensi nanti. Misalnya, Langkah 1 mungkin menyimpan hasil dari permintaan API sehingga bagian dari permintaan itu dapat digunakan kembali nanti di Langkah 5.
Dalam skenario berikut, mesin status mengambil data dari API satu kali. Pada Langkah 1, alur kerja menyimpan data API yang dikembalikan (hingga 256 KiB per status) dalam variabel 'x' untuk digunakan dalam langkah selanjutnya.
Tanpa variabel, Anda harus meneruskan data melalui output dari Langkah 1 ke Langkah 2 ke Langkah 3 ke Langkah 4 untuk menggunakannya di Langkah 5. Bagaimana jika langkah-langkah perantara itu tidak membutuhkan data? Meneruskan data dari negara ke negara melalui output dan input akan menjadi upaya yang tidak perlu.
Dengan variabel, Anda dapat menyimpan data dan menggunakannya di setiap langkah masa depan. Anda juga dapat memodifikasi, mengatur ulang, atau menambahkan langkah-langkah tanpa mengganggu aliran data Anda. Mengingat fleksibilitas variabel, Anda mungkin hanya perlu menggunakan Output untuk mengembalikan data dari sub-alur kerja Paralel dan Peta, dan di akhir eksekusi mesin status Anda.
Menyatakan yang mendukung variabel
Jenis status berikut mendukung Assign untuk mendeklarasikan dan menetapkan nilai ke variabel: Lulus, Tugas, Peta, Paralel, Pilihan, Tunggu.
Untuk mengatur variabel, berikan objek JSON dengan nama dan nilai variabel:
"Assign": {
"productName": "product1",
"count" : 42,
"available" : true
}
Untuk mereferensikan variabel, tambahkan nama dengan tanda dolar ($), misalnya,. $productName
Variabel yang dicadangkan: $ negara
Step Functions mendefinisikan variabel cadangan tunggal yang disebut $states. Dalam status Jsonata, struktur berikut ditetapkan $states untuk digunakan dalam ekspresi Jsonata:
# 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
}
Pada entri status, Step Functions menetapkan masukan status ke $states.input. Nilai $states.input dapat digunakan di semua bidang yang menerima ekspresi Jsonata. $states.inputselalu mengacu pada input status asli.
UntukTask,Parallel, dan Map menyatakan:
-
$states.resultmengacu pada hasil mentah API atau sub-alur kerja jika berhasil. -
$states.errorOutputmengacu pada Output Kesalahan jika API atau sub-alur kerja gagal.$states.errorOutputdapat digunakan diCatchlapanganAssignatauOutput.
Mencoba mengakses $states.result atau $states.errorOutput di bidang dan status di mana mereka tidak dapat diakses akan tertangkap saat pembuatan, pembaruan, atau validasi mesin status.
$states.contextObjek memberikan informasi alur kerja Anda tentang eksekusi spesifik mereka, seperti, token tugasStartTime, dan input alur kerja awal. Untuk mempelajari selengkapnya, lihat Mengakses data eksekusi dari objek Context di Step Functions.
Sintaks nama variabel
Nama variabel mengikuti aturan untuk Pengidentifikasi Unicode seperti yang dijelaskan dalam UnicodeĀ® Standard
Konvensi nama variabel mirip dengan aturan untuk JavaScript dan bahasa pemrograman lainnya.
Lingkup variabel
Alur kerja Step Functions menghindari kondisi bersaing dengan variabel melalui penggunaan cakupan alur kerja lokal.
Workflow-local lingkup mencakup semua status di dalam bidang Negara mesin negara, tetapi tidak status di dalam status Paralel atau Peta. Status di dalam status Paralel atau Peta dapat merujuk ke variabel lingkup luar, tetapi mereka membuat dan memelihara variabel dan nilai alur kerja-lokal mereka sendiri yang terpisah.
Parallelcabang dan Map iterasi dapat mengakses nilai variabel dari lingkup luar, tetapi mereka tidak memiliki akses ke nilai variabel dari cabang atau iterasi bersamaan lainnya. Saat menangani kesalahan, Assign bidang dalam a Catch dapat menetapkan nilai ke variabel di lingkup luar, yaitu ruang lingkup di mana Parallel/Map status ada.
Pengecualian: Status Peta Terdistribusi saat ini tidak dapat mereferensikan variabel di cakupan luar.
Variabel ada dalam cakupan jika ada status dalam cakupan yang menetapkan nilai untuknya. Untuk membantu menghindari kesalahan umum, variabel yang ditetapkan dalam lingkup dalam tidak dapat memiliki nama yang sama dengan yang ditetapkan dalam lingkup luar. Misalnya, jika lingkup tingkat atas memberikan nilai ke variabel yang dipanggilmyVariable, maka tidak ada lingkup lain (di dalamMap,Parallel) yang dapat menetapkan juga. myVariable
Akses ke variabel tergantung pada ruang lingkup saat ini. Status Paralel dan Peta memiliki cakupannya sendiri, tetapi dapat mengakses variabel dalam lingkup luar.
Ketika status Paralel atau Peta selesai, semua variabelnya akan keluar dari cakupan dan berhenti dapat diakses. Gunakan bidang Output untuk meneruskan data dari cabang Paralel dan iterasi Peta.
Tetapkan bidang di ASL
AssignBidang di ASL digunakan untuk menetapkan nilai ke satu atau lebih variabel. AssignBidang ini tersedia di tingkat atas setiap negara bagian (kecuali Succeed danFail), di dalam aturan Choice negara bagian, dan di dalam Catch bidang. Contoh:
# 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 %}"
}
},
AssignBidang mengambil objek JSON. Setiap bidang tingkat atas memberi nama variabel untuk ditetapkan. Pada contoh sebelumnya, nama variabel adalah desiredPrice danmaximumWait. Saat menggunakan Jsonata, {% ... %} menunjukkan ekspresi Jsonata yang mungkin berisi variabel atau ekspresi yang lebih kompleks. Untuk informasi selengkapnya tentang ekspresi Jsonata, lihat dokumentasi. JSONata.org
Saat menggunakan Jsonata sebagai bahasa query, diagram berikut menunjukkan bagaimana bidang Assign dan Output diproses secara paralel. Perhatikan implikasinya: menetapkan nilai variabel tidak akan mempengaruhi keadaan Output.
Contoh Jsonata berikut mengambil order.product dari input status. Variabel currentPrice diatur ke nilai dari hasil tugas.
# 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"
}
Catatan: Anda tidak dapat menetapkan nilai ke bagian dari variabel. Misalnya, Anda bisa"Assign":{"x":42}, tetapi Anda tidak bisa "Assign":{"x.y":42} atau"Assign":{"x[2]":42}.
Urutan evaluasi di bidang penetapan
Semua referensi variabel dalam status Step Functions menggunakan nilai seperti pada entri status.
Fakta sebelumnya penting untuk memahami bagaimana Assign bidang memberikan nilai ke satu atau lebih variabel. Pertama, nilai baru dihitung, kemudian Step Functions menetapkan nilai baru ke variabel. Nilai variabel baru akan tersedia dimulai dengan status berikutnya. Misalnya, perhatikan Assign bidang berikut:
# Starting values: $x=3, $a=6
"Assign": {
"x": "{% $a %}",
"nextX": "{% $x %}"
}
# Ending values: $x=6, $nextX=3
Dalam contoh sebelumnya, variabel ditugaskan dan x direferensikan.
Ingat, semua ekspresi dievaluasi terlebih dahulu, kemudian tugas dibuat. Dan nilai yang baru ditetapkan akan tersedia di negara bagian berikutnya.
Mari kita lihat contoh secara rinci. Asumsikan bahwa dalam keadaan sebelumnya, $x diberi nilai tiga (3) dan $a diberi nilai enam (6). Langkah-langkah berikut menjelaskan proses:
-
Semua ekspresi dievaluasi, menggunakan nilai saat ini dari semua variabel.
Ekspresi
"{% $a %}"akan mengevaluasi ke 6, dan"{% $x %}"akan mengevaluasi ke 3. -
Selanjutnya, tugas dibuat:
$xakan diberi nilai enam (6)$nextXakan diberikan tiga (3)
Catatan: Jika $x sebelumnya tidak ditetapkan, contoh akan gagal karena $x tidak terdefinisi.
Singkatnya, Step Functions mengevaluasi semua ekspresi dan kemudian membuat tugas. Urutan terjadinya variabel di Assign lapangan tidak masalah.
Batas
Ukuran maksimum variabel tunggal adalah 256Kib, untuk alur kerja Standar dan Ekspres.
Ukuran gabungan maksimum untuk semua variabel dalam satu Assign bidang juga 256Kib. Misalnya, Anda dapat menetapkan X dan Y ke 128KiB, tetapi Anda tidak dapat menetapkan X dan Y ke 256KiB di bidang yang sama. Assign
Ukuran total semua variabel yang disimpan tidak dapat melebihi 10MiB per eksekusi.
Menggunakan variabel dalam status JsonPath
Variabel juga tersedia di negara bagian yang menggunakan JSONPath untuk bahasa kueri mereka.
Anda dapat mereferensikan variabel di bidang apa pun yang menerima ekspresi JsonPath ($.atau $$. sintaks), dengan pengecualianResultPath, yang menentukan lokasi dalam input status untuk menyuntikkan hasil status. Variabel tidak dapat digunakan dalam ResultPath
Di JsonPath, $ simbol mengacu pada nilai 'saat ini' dan $$ mewakili objek Konteks status. Ekspresi JsonPath dapat dimulai dengan $. as in. $.customer.name Anda dapat mengakses konteks dengan $$. as in$$.Execution.Id.
Untuk referensi variabel, Anda juga menggunakan $ simbol sebelum nama variabel, misalnya, $x atau$order.numItems.
Di bidang JsonPath yang menerima fungsi intrinsik, variabel dapat digunakan dalam argumen, misalnya. States.Format('The order number is {}', $order.number)
Digram berikut menggambarkan bagaimana langkah penetapan dalam tugas JsonPath terjadi pada saat yang sama dengan: ResultSelector
Menetapkan variabel di JsonPath
Penugasan variabel JsonPath berperilaku mirip dengan templat payload. Bidang yang diakhiri dengan .$ menunjukkan nilainya adalah ekspresi JsonPath yang dievaluasi Step Functions ke nilai selama eksekusi mesin status (misalnya: $.order..product dan). $.order.total
# Example of Assign with JSONPath
{
"Type": "Task",
...
"Assign": {
"products.$": "$.order..product",
"orderTotal.$": "$.order.total"
},
"Next": "the next state"
}
Untuk status JsonPath, nilai $ dalam Assign bidang tergantung pada jenis status. Di Task,Map, Parallel negara bagian, $ mengacu pada API/sub-workflow hasilnya. In Choice and Wait state, $ mengacu pada input efektif, yang merupakan nilai InputPath setelah diterapkan pada input status. UntukPass, $ mengacu pada hasil, apakah yang dihasilkan oleh Result bidang atau Parameters bidangInputPath/.
Contoh JSONPath berikut menetapkan objek JSON ke details variabel, hasil ekspresi JSONPath $.result.code keresultCode, dan hasil ekspresi JSONPath ke. States.Format('Hello {}', $customer.name) message Jika ini dalam Task keadaan, maka $ masuk $.order.items dan $.result.code mengacu pada hasil API. startTimeVariabel diberikan dengan nilai dari objek Context,$$.Execution.StartTime.
"Assign": {
"details": {
"status": "SUCCESS",
"lineItems.$": "$.order.items"
},
"resultCode.$": "$.result.code",
"message.$": "States.Format('Hello {}', $customer.name)",
"startTime.$": "$$.Execution.StartTime"
}