Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Praktik terbaik untuk Step Functions
Topik berikut adalah praktik terbaik untuk membantu Anda mengelola dan mengoptimalkan alur kerja Step Functions.
Daftar praktik terbaik
- Mengoptimalkan biaya menggunakan Alur Kerja Ekspres
- Menandai mesin dan aktivitas status di Step Functions
- Menggunakan batas waktu untuk menghindari eksekusi alur kerja Step Functions yang macet
- Menggunakan Amazon S3 ARNs alih-alih melewatkan muatan besar di Step Functions
- Memulai eksekusi baru untuk menghindari mencapai kuota riwayat di Step Functions
- Menangani pengecualian layanan Lambda sementara
- Menghindari latensi saat melakukan polling untuk tugas kegiatan
- CloudWatch Batas ukuran kebijakan sumber daya log
Mengoptimalkan biaya menggunakan Alur Kerja Ekspres
Step Functions menentukan harga untuk alur kerja Standar dan Ekspres berdasarkan jenis alur kerja yang Anda gunakan untuk membangun mesin status Anda. Untuk mengoptimalkan biaya alur kerja tanpa server Anda, Anda dapat mengikuti salah satu atau kedua rekomendasi berikut:
Untuk informasi tentang cara memilih jenis alur kerja Standar atau Ekspres memengaruhi penagihan, lihat AWS Step Functions Harga
Alur kerja Nest Express di dalam alur kerja Standar
Step Functions menjalankan alur kerja yang memiliki durasi terbatas dan jumlah langkah. Beberapa alur kerja dapat menyelesaikan eksekusi dalam waktu singkat. Orang lain mungkin memerlukan kombinasi dari high-event-rate alur kerja dan alur kerja yang berjalan lama. Dengan Step Functions, Anda dapat membangun alur kerja yang besar dan kompleks dari beberapa alur kerja yang lebih kecil dan sederhana.
Misalnya, untuk membangun alur kerja pemrosesan pesanan, Anda dapat menyertakan semua tindakan non-idempoten ke dalam alur kerja Standar. Ini dapat mencakup tindakan, seperti menyetujui pesanan melalui interaksi manusia dan memproses pembayaran. Anda kemudian dapat menggabungkan serangkaian tindakan idempoten, seperti mengirim pemberitahuan pembayaran dan memperbarui inventaris produk, dalam alur kerja Express. Anda dapat membuat sarang alur kerja Express ini dalam alur kerja Standar. Dalam contoh ini, alur kerja Standar dikenal sebagai mesin status induk. Alur kerja Express bersarang dikenal sebagai mesin status anak.
Ubah alur kerja Standar menjadi alur kerja Express
Anda dapat mengonversi alur kerja Standar yang ada menjadi alur kerja Express jika memenuhi persyaratan berikut:
-
Alur kerja harus menyelesaikan pelaksanaannya dalam waktu lima menit.
-
Alur kerja sesuai dengan model at-least-onceeksekusi. Ini berarti bahwa setiap langkah dalam alur kerja dapat berjalan lebih dari satu kali.
-
Alur kerja tidak menggunakan pola integrasi
.waitForTaskToken
atau.sync
layanan.
penting
Alur kerja ekspres menggunakan CloudWatch Log Amazon untuk merekam riwayat eksekusi. Anda akan dikenakan biaya tambahan saat menggunakan CloudWatch Log.
Untuk mengonversi alur kerja Standar menjadi alur kerja Express menggunakan konsol
-
Buka Konsol Step Functions
. -
Pada halaman mesin Negara, pilih mesin status tipe Standar untuk membukanya.
Tip
Dari daftar tarik-turun Jenis apa pun, pilih Standar untuk memfilter daftar mesin status dan hanya melihat alur kerja Standar.
-
Pilih Salin ke yang baru.
Workflow Studio terbuka dalam Mode desain menampilkan alur kerja mesin status yang Anda pilih.
-
(Opsional) Perbarui desain alur kerja.
-
Tentukan nama untuk mesin negara Anda. Untuk melakukan ini, pilih ikon edit di sebelah nama mesin status default MyStateMachine. Kemudian, dalam konfigurasi mesin Negara, tentukan nama di kotak Nama mesin Negara.
-
(Opsional) Dalam konfigurasi mesin State, tentukan pengaturan alur kerja lainnya, seperti jenis mesin status dan peran pelaksanaannya.
Pastikan untuk Type, Anda memilih Express. Simpan semua pilihan default lainnya pada pengaturan mesin State.
catatan
Jika Anda mengonversi alur kerja Standar yang sebelumnya ditentukan dalam AWS CDK atau AWS SAM, Anda harus mengubah nilai
Type
danResource
nama. -
Dalam kotak dialog Konfirmasi pembuatan peran, pilih Konfirmasi untuk melanjutkan.
Anda juga dapat memilih Lihat pengaturan peran untuk kembali ke konfigurasi mesin Status.
catatan
Jika Anda menghapus IAM peran yang dibuat Step Functions, Step Functions tidak dapat membuatnya kembali nanti. Demikian pula, jika Anda mengubah peran (misalnya, dengan menghapus Step Functions dari prinsipal dalam IAM kebijakan), Step Functions tidak dapat memulihkan pengaturan aslinya nanti.
Untuk informasi selengkapnya tentang praktik dan pedoman terbaik saat mengelola pengoptimalan biaya untuk alur kerja, lihat Membangun hemat biaya AWS Step Functions alur kerja
Menandai mesin dan aktivitas status di Step Functions
AWS Step Functions mendukung penandaan mesin status (baik Standar dan Express) dan aktivitas. Tag dapat membantu Anda melacak dan mengelola sumber daya Anda dan memberikan keamanan yang lebih baik AWS Identity and Access Management (IAM) kebijakan. Setelah menandai sumber daya Step Functions, Anda dapat mengelolanya dengan AWS Resource Groups. Untuk mempelajari caranya, lihat AWS Resource Groups Panduan Pengguna.
Untuk otorisasi berbasis tag, sumber daya eksekusi mesin status seperti yang ditunjukkan pada contoh berikut mewarisi tag yang terkait dengan mesin status.
arn:<partition>
:states:<Region>
:<account-id>
:execution:<StateMachineName>:<ExecutionId>
Saat Anda memanggil DescribeExecutionatau lainnya APIs di mana Anda menentukan sumber daya eksekusiARN, Step Functions menggunakan tag yang terkait dengan mesin status untuk menerima atau menolak permintaan saat melakukan otorisasi berbasis tag. Ini membantu Anda mengizinkan atau menolak akses ke eksekusi mesin status di tingkat mesin negara.
Untuk meninjau pembatasan yang terkait dengan penandaan sumber daya, lihat Pembatasan terkait penandaan.
Penandaan untuk Alokasi Biaya
Anda dapat menggunakan tag alokasi biaya untuk mengidentifikasi tujuan mesin negara dan mencerminkan organisasi itu di AWS tagihan. Daftar untuk mendapatkan AWS tagihan akun untuk menyertakan kunci tag dan nilai. Lihat Menyiapkan Laporan Alokasi Biaya Bulanan di AWS Billing Panduan Pengguna untuk detail tentang pengaturan laporan.
Misalnya, Anda dapat menambahkan tag yang mewakili pusat biaya dan tujuan sumber daya Step Functions Anda, sebagai berikut.
Sumber Daya | Kunci | Nilai |
---|---|---|
StateMachine1 |
Cost Center |
34567 |
Application |
Image processing |
|
StateMachine2 |
Cost Center |
34567 |
Application |
Rekognition processing |
Penandaan untuk Keamanan
IAMmendukung pengendalian akses ke sumber daya berdasarkan tag. Untuk mengontrol akses berdasarkan tag, berikan informasi tentang tag sumber daya Anda di elemen kondisi IAM kebijakan.
Misalnya, Anda dapat membatasi akses ke sumber daya Step Functions yang menyertakan tanda dengan kunci environment
dan nilai production
.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"states:TagResource",
"states:DeleteActivity",
"states:DeleteStateMachine",
"states:StopExecution"
],
"Resource": "*",
"Condition": {
"StringEquals": {"aws:ResourceTag/environment": "production"}
}
}
]
}
Untuk informasi selengkapnya, lihat Mengontrol Akses Menggunakan Tag di Panduan IAM Pengguna.
Mengelola tag di konsol Step Functions
Anda dapat melihat dan mengelola tag untuk mesin status Anda di konsol Step Functions. Dari halaman Detail mesin status, pilih Tanda.
Mengelola tag dengan Step Functions API Actions
Untuk mengelola tag menggunakan Step FunctionsAPI, gunakan API tindakan berikut:
Menggunakan batas waktu untuk menghindari eksekusi alur kerja Step Functions yang macet
Secara default, Amazon States Language tidak menentukan batas waktu untuk definisi mesin status. Tanpa timeout eksplisit, Step Functions sering kali hanya bergantung pada respons dari seorang pekerja aktivitas untuk mengetahui bahwa tugas selesai. Jika terjadi kesalahan dan TimeoutSeconds
bidang tidak ditentukan untuk Task
status Activity
atau, eksekusi macet menunggu respons yang tidak akan pernah datang.
Untuk menghindari situasi ini, tentukan batas waktu yang wajar saat Anda membuat mesin Task
di negara bagian Anda. Sebagai contoh:
"ActivityState": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:HelloWorld", "TimeoutSeconds": 300, "Next": "NextState" }
Jika Anda menggunakan callback dengan token tugas (. waitForTaskToken), kami menyarankan Anda menggunakan detak jantung dan menambahkan HeartbeatSeconds
bidang dalam definisi Task
status Anda. Anda dapat mengatur HeartbeatSeconds
menjadi kurang dari batas waktu tugas sehingga jika alur kerja Anda gagal dengan kesalahan detak jantung maka Anda tahu itu karena kegagalan tugas alih-alih tugas membutuhkan waktu lama untuk diselesaikan.
{ "StartAt": "Push to SQS", "States": { "Push to SQS": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken", "HeartbeatSeconds": 600, "Parameters": { "MessageBody": { "myTaskToken.$": "$$.Task.Token" }, "QueueUrl": "https://sqs.us-east-1.amazonaws.com/123456789012/push-based-queue" }, "ResultPath": "$.SQS", "End": true } } }
Untuk informasi selengkapnya, lihat Status alur kerja tugas di dokumentasi Amazon States Language.
catatan
Anda dapat mengatur timeout untuk mesin status Anda menggunakan kolom TimeoutSeconds
di ketetapan Amazon States Language. Untuk informasi selengkapnya, lihat Menyatakan struktur mesin di Amazon States Language untuk alur kerja Step Functions.
Menggunakan Amazon S3 ARNs alih-alih melewatkan muatan besar di Step Functions
Eksekusi yang meneruskan muatan data yang besar antar status dapat dihentikan. Jika data yang Anda lewati antar status mungkin bertambah hingga lebih dari 256 KB, gunakan Amazon Simple Storage Service (Amazon S3) untuk menyimpan data, dan mengurai Amazon Resource Name ARN () bucket dalam Payload
parameter untuk mendapatkan nama bucket dan nilai kunci. Atau, sesuaikan implementasi Anda sehingga Anda meneruskan muatan yang lebih kecil dalam eksekusi Anda.
Dalam contoh berikut, mesin negara meneruskan masukan ke AWS Lambda fungsi, yang memproses JSON file dalam bucket Amazon S3. Setelah Anda menjalankan mesin status ini, fungsi Lambda membaca isi JSON file, dan mengembalikan konten file sebagai output.
Buat fungsi Lambda
Fungsi Lambda berikut bernama
membaca konten JSON file yang disimpan dalam bucket Amazon S3 tertentu.pass-large-payload
catatan
Setelah Anda membuat fungsi Lambda ini, pastikan Anda memberikan IAM perannya izin yang sesuai untuk membaca dari bucket Amazon S3. Misalnya, lampirkan ReadOnlyAccess izin AmazonS3 ke peran fungsi Lambda.
import json import boto3 import io import os s3 = boto3.client('s3') def lambda_handler(event, context): event = event['Input'] final_json = str() s3 = boto3.resource('s3') bucket = event['bucket'].split(':')[-1] filename = event['key'] directory = "/tmp/{}".format(filename) s3.Bucket(bucket).download_file(filename, directory) with open(directory, "r") as jsonfile: final_json = json.load(jsonfile) os.popen("rm -rf /tmp") return final_json
Buat mesin negara
Mesin status berikut memanggil fungsi Lambda yang sebelumnya Anda buat.
{ "StartAt":"Invoke Lambda function", "States":{ "Invoke Lambda function":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "FunctionName":"arn:aws:lambda:us-east-2:123456789012:function:
pass-large-payload
", "Payload":{ "Input.$":"$" } }, "OutputPath": "$.Payload", "End":true } } }
Daripada meneruskan sejumlah besar data dalam input, Anda dapat menyimpan data tersebut di bucket Amazon S3, dan meneruskan Amazon Resource Name (ARN) bucket dalam Payload
parameter untuk mendapatkan nama bucket dan nilai kunci. Fungsi Lambda Anda kemudian dapat menggunakannya ARN untuk mengakses data secara langsung. Berikut ini adalah contoh input untuk eksekusi mesin status, di mana data disimpan data.json
dalam bucket Amazon S3 bernama. amzn-s3-demo-large-payload-json
{
"key": "data.json",
"bucket": "arn:aws:s3:::amzn-s3-demo-large-payload-json
"
}
Memulai eksekusi baru untuk menghindari mencapai kuota riwayat di Step Functions
AWS Step Functions memiliki kuota keras 25.000 entri dalam riwayat acara eksekusi. Ketika eksekusi mencapai 24.999 peristiwa, ia menunggu acara berikutnya terjadi.
-
Jika nomor acara 25.000 adalah
ExecutionSucceeded
, eksekusi selesai dengan sukses. -
Jika nomor acara 25.000 tidak
ExecutionSucceeded
,ExecutionFailed
peristiwa dicatat dan eksekusi mesin status gagal karena mencapai batas riwayat
Untuk menghindari mencapai kuota ini untuk eksekusi jangka panjang, Anda dapat mencoba salah satu solusi berikut:
-
Gunakan status Peta dalam mode Terdistribusi. Dalam mode ini,
Map
status menjalankan setiap iterasi sebagai eksekusi alur kerja anak, yang memungkinkan konkurensi tinggi hingga 10.000 eksekusi alur kerja anak paralel. Setiap eksekusi alur kerja anak memiliki riwayat eksekusi terpisah sendiri dari alur kerja induk. -
Mulai eksekusi mesin status baru langsung dari
Task
keadaan eksekusi yang sedang berjalan. Untuk memulai eksekusi alur kerja bersarang seperti itu, gunakanStartExecution
API tindakan Step Functions di mesin status induk bersama dengan parameter yang diperlukan. Untuk informasi selengkapnya tentang penggunaan alur kerja bersarang, lihat Mulai eksekusi alur kerja dari status tugas di Step Functions atau Menggunakan API tindakan Step Functions untuk melanjutkan tutorial eksekusi baru.Tip
Untuk menerapkan contoh alur kerja bersarang ke Akun AWS, lihat Modul 13 - Alur Kerja Ekspres Bersarang
. -
Menerapkan pola yang menggunakan AWS Lambda fungsi yang dapat memulai eksekusi baru mesin status Anda untuk membagi pekerjaan yang sedang berlangsung di beberapa eksekusi alur kerja. Untuk informasi selengkapnya, lihat tutorial Menggunakan fungsi Lambda untuk melanjutkan eksekusi baru di Step Functions.
Menangani pengecualian layanan Lambda sementara
AWS Lambda terkadang dapat mengalami kesalahan layanan sementara. Dalam hal ini, memanggil Lambda menghasilkan kesalahan 500, ClientExecutionTimeoutException
seperti,, ServiceException
AWSLambdaException
, atau. SdkClientException
Sebagai praktik terbaik, tangani pengecualian ini secara proaktif di mesin status Anda untuk Retry
memanggil fungsi Lambda, atau untuk Catch
kesalahan.
Kesalahan Lambda dilaporkan sebagai Lambda.
. Untuk mencoba lagi kesalahan pengecualian layanan Lambda, Anda dapat menggunakan kode ErrorName
Retry
berikut.
"Retry": [ { "ErrorEquals": [ "Lambda.ClientExecutionTimeoutException", "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException"], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ]
catatan
Kesalahan tidak tertangani di Lambda dilaporkan sebagai Lambda.Unknown
pada output kesalahan. Ini termasuk out-of-memory kesalahan dan batas waktu fungsi. Anda dapat mencocokkan di Lambda.Unknown
, States.ALL
, atau States.TaskFailed
untuk menangani kesalahan ini. Ketika Lambda mencapai jumlah maksimum permintaan, kesalahannya adalah Lambda.TooManyRequestsException
. Untuk informasi selengkapnya tentang Lambda Handled
dan Unhandled
kesalahan, lihat FunctionError
di AWS Lambda Panduan Pengembang.
Untuk informasi selengkapnya, lihat berikut ini:
Menghindari latensi saat melakukan polling untuk tugas kegiatan
GetActivityTask
APIIni dirancang untuk memberikan taskToken
persis sekali. Jika taskToken
dijatuhkan saat berkomunikasi dengan pekerja aktivitas, sejumlah permintaan GetActivityTask
dapat diblokir selama 60 detik menunggu respons hingga GetActivityTask
waktu habis.
Jika Anda hanya memiliki sejumlah kecil polling yang menunggu respons, mungkin semua permintaan akan mengantre di belakang permintaan yang diblokir dan berhenti. Namun, jika Anda memiliki sejumlah besar jajak pendapat yang luar biasa untuk setiap aktivitas Amazon Resource Name (ARN), dan beberapa persentase permintaan Anda macet menunggu, akan ada banyak lagi yang masih bisa mendapatkan taskToken
dan mulai memproses pekerjaan.
Untuk sistem produksi, kami merekomendasikan setidaknya 100 jajak pendapat terbuka per aktivitas ARN di setiap titik waktu. Jika satu polling diblokir, dan sebagian dari polling tersebut mengantre di belakangnya, masih banyak lagi permintaan yang akan menerima taskToken
untuk memproses tugas sementara GetActivityTask
diblokir.
Untuk menghindari masalah latensi seperti ini saat melakukan polling untuk tugas:
-
Terapkan poller Anda sebagai utas terpisah dari tugas dalam pelaksanaan pekerja aktivitas Anda.
-
Miliki setidaknya 100 jajak pendapat terbuka per aktivitas ARN di setiap titik waktu.
catatan
Menskalakan hingga 100 jajak pendapat terbuka per ARN bisa mahal. Misalnya, 100 fungsi Lambda polling per ARN 100 kali lebih mahal daripada memiliki fungsi Lambda tunggal dengan 100 utas polling. Untuk mengurangi latensi dan meminimalkan biaya, gunakan bahasa yang memiliki asinkron I/O, dan terapkan beberapa utas polling per pekerja. Untuk pekerja aktivitas contoh tempat utas poller terpisah dari utas tugas, lihat Contoh: Pekerja Aktivitas di Ruby.
Untuk informasi selengkapnya tentang aktivitas dan pekerja aktivitas lihat Pelajari tentang Aktivitas di Step Functions.
CloudWatch Batas ukuran kebijakan sumber daya log
Saat Anda membuat mesin status dengan logging, atau memperbarui mesin status yang ada untuk mengaktifkan logging, Step Functions harus memperbarui kebijakan sumber daya Log Anda CloudWatch dengan grup log yang Anda tentukan. CloudWatch Kebijakan sumber daya log dibatasi hingga 5.120 karakter.
Saat CloudWatch Log mendeteksi bahwa kebijakan mendekati batas ukuran, CloudWatch Log secara otomatis mengaktifkan pencatatan untuk grup log yang dimulai/aws/vendedlogs/
.
Anda dapat mengawali nama grup CloudWatch log Log /aws/vendedlogs/
untuk menghindari batas ukuran kebijakan sumber daya CloudWatch Log. Jika Anda membuat grup log di konsol Step Functions, nama grup log yang disarankan sudah akan diawali dengan/aws/vendedlogs/states
.
CloudWatch Log juga memiliki kuota 10 kebijakan sumber daya per wilayah, per akun. Jika Anda mencoba mengaktifkan logging pada mesin status yang sudah memiliki kebijakan sumber daya 10 CloudWatch Log di wilayah untuk akun, mesin status tidak akan dibuat atau diperbarui. Untuk informasi selengkapnya tentang mencatat kutipan, lihat Kuota CloudWatch log.
Jika Anda mengalami masalah saat mengirim log ke CloudWatch Log, lihatTroubleshooting state machine logging to CloudWatch Logs. Untuk mempelajari lebih lanjut tentang pencatatan secara umum, lihat Mengaktifkan logging dari AWS layanan.