Praktik terbaik untuk Step Functions - AWS Step Functions

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.

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
  1. Buka Konsol Step Functions.

  2. 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.

  3. Pilih Salin ke yang baru.

    Workflow Studio terbuka dalam Mode desain menampilkan alur kerja mesin status yang Anda pilih.

  4. (Opsional) Perbarui desain alur kerja.

  5. 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.

  6. (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 dan Resource nama.

  7. 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 pass-large-payload membaca konten JSON file yang disimpan dalam bucket Amazon S3 tertentu.

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 adalahExecutionSucceeded, eksekusi selesai dengan sukses.

  • Jika nomor acara 25.000 tidakExecutionSucceeded, 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:

Menangani pengecualian layanan Lambda sementara

AWS Lambda terkadang dapat mengalami kesalahan layanan sementara. Dalam hal ini, memanggil Lambda menghasilkan kesalahan 500, ClientExecutionTimeoutException seperti,, ServiceExceptionAWSLambdaException, 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.ErrorName. Untuk mencoba lagi kesalahan pengecualian layanan Lambda, Anda dapat menggunakan kode 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

GetActivityTaskAPIIni dirancang untuk memberikan taskTokenpersis 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.