AWS Step Functions ve Callback Deseni ile Gerçek Dünya Kullanım Senaryosu Oluşturma
AWS Step Functions, dağıtık uygulamaları görsel iş akışları kullanarak koordine etmenizi sağlayan güçlü bir orkestrasyon hizmetidir. En önemli yeteneklerinden biri, iş akışını bir dış olay gerçekleşene kadar duraklatmanıza olanak tanıyan Callback Deseni (Geri Çağırma Modeli) veya "Wait for Callback" özelliğidir.
Bu makalede, bu deseni kullanarak gerçek dünya senaryolarında, örneğin manuel onay gerektiren işlemlerde nasıl bir yapı kurabileceğimizi inceleyeceğiz.
<div class="toc"> <ul> <li><a href="#giris">Giriş</a></li> <li><a href="#callback-deseni-nedir">Callback Deseni Nedir?</a></li> <li><a href="#gercek-dunya-senaryosu">Gerçek Dünya Senaryosu: İçerik Denetimi</a></li> <li><a href="#adim-adim-uygulama">Adım Adım Uygulama</a></li> <li><a href="#sikca-sorulan-sorular">Sıkça Sorulan Sorular (SSS)</a></li> <li><a href="#sonuc">Sonuç</a></li> </ul> </div> <h2 id="giris">Giriş</h2>AWS Step Functions, farklı AWS hizmetlerini (Lambda, DynamoDB, SNS vb.) bir araya getirerek karmaşık iş akışları oluşturmanızı sağlar. Standart bir akışta bir adım tamamlanır tamamlanmaz diğeri başlar. Ancak bazen bir adımın tamamlanması günler, hatta aylar sürebilir (örneğin, bir yöneticinin onayı veya kargolanan bir ürünün teslimi). İşte burada Callback Deseni devreye girer.
<h2 id="callback-deseni-nedir">Callback Deseni Nedir?</h2>Callback deseni, bir görevi başlattıktan sonra Step Functions'a "bekle" komutunu verir. Bu desen kullanıldığında, Step Functions iş akışına özgü bir Task Token (Görev Belirteci) üretir ve bunu ilgili servise (örneğin bir Lambda fonksiyonuna veya SQS kuyruğuna) iletir.
İş akışı şu durumda beklemeye geçer:
- Görev başlatılır ve token üretilir.
- Token harici bir sisteme veya kişiye iletilir.
- Harici sistem işlemi tamamladığında, bu token ile birlikte
SendTaskSuccess(veya başarısızsaSendTaskFailure) API çağrısını yaparak iş akışını devam ettirir.
Bu mekanizma, "insan onayı" (human-in-the-loop) gerektiren süreçler için idealdir.
<h2 id="gercek-dunya-senaryosu">Gerçek Dünya Senaryosu: İçerik Denetimi</h2>Bir blog platformu işlettiğinizi düşünün. Kullanıcılar yazı gönderdiğinde, belirli anahtar kelimeleri (örneğin "yasaklı") içeren yazıların otomatik olarak yayınlanmasını istemezsiniz. Bu tür yazılar bir moderatörün onayına düşmelidir.
Akış şöyle olacaktır:
- Kullanıcı bir yazı gönderir.
- Step Function başlar ve metni analiz eder.
- Eğer yasaklı kelime varsa, akış duraklar ve moderatöre bir bildirim gider.
- Moderatör yönetim panelinden "Onayla" veya "Reddet" butonuna tıklar.
- Tıklama işlemi, Step Function'a token'ı geri gönderir ve akış devam eder.
Aşağıda, bu yapıyı kurmak için gerekli olan Step Function tanımını (ASL) ve Lambda fonksiyonu örneğini bulabilirsiniz.
<h3 id="step-function-tanimi">Step Function Tanımı (ASL)</h3>Aşağıdaki JSON tanımı, .waitForTaskToken ekini kullanarak callback desenini uygular:
{
"StartAt": "CheckContent",
"States": {
"CheckContent": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.content",
"StringMatches": "*yasaklı*",
"Next": "WaitForApproval"
}
],
"Default": "PublishContent"
},
"WaitForApproval": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
"Parameters": {
"FunctionName": "RequestModerationFunction",
"Payload": {
"taskToken.$": "$$.Task.Token",
"content.$": "$.content",
"author.$": "$.author"
}
},
"Next": "ProcessDecision"
},
"ProcessDecision": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.status",
"StringEquals": "APPROVED",
"Next": "PublishContent"
}
],
"Default": "RejectContent"
},
"PublishContent": {
"Type": "Pass",
"End": true
},
"RejectContent": {
"Type": "Fail",
"Cause": "Content Rejected by Moderator"
}
}
}
<h3 id="lambda-fonksiyonu">Lambda Fonksiyonu (Token Gönderimi)</h3>
Moderatör onay verdiğinde çağrılacak Lambda fonksiyonu (Node.js örneği):
const AWS = require('aws-sdk');
const stepfunctions = new AWS.StepFunctions();
exports.handler = async (event) => {
const { taskToken, decision } = JSON.parse(event.body);
const params = {
taskToken: taskToken,
output: JSON.stringify({ status: decision }) // 'APPROVED' veya 'REJECTED'
};
try {
await stepfunctions.sendTaskSuccess(params).promise();
return { statusCode: 200, body: "İşlem başarıyla iletildi." };
} catch (error) {
console.error(error);
return { statusCode: 500, body: "Hata oluştu." };
}
};
Bu kod, moderatörün kararını alır ve bekleyen Step Function iş akışını ilgili token ile devam ettirir.
<h2 id="sikca-sorulan-sorular">Sıkça Sorulan Sorular (SSS)</h2> <div itemscope itemtype="https://schema.org/FAQPage"> <div itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Step Functions bir callback için ne kadar bekleyebilir?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text">Standart Step Functions iş akışları 1 yıla kadar bekleyebilir. Express iş akışları ise en fazla 5 dakika çalışabilir, bu yüzden callback deseni için Standart akışlar önerilir.</div> </div> </div> <div itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Task Token kaybolursa ne olur?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text">Eğer token kaybolursa ve callback yapılamazsa, iş akışı zaman aşımına uğrayana kadar (veya manuel olarak durdurulana kadar) bekler. Bu nedenle her zaman bir 'TimeoutSeconds' değeri tanımlamanız önerilir.</div> </div> </div> <div itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">Bu desen sunucusuz (serverless) mimarilerde maliyetli midir?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text">Hayır, Standart Step Functions'da bekleme süresi için ücret ödemezsiniz. Sadece durum geçişleri (state transitions) için ücretlendirilirsiniz, bu da onu çok maliyet etkin kılar.</div> </div> </div> </div> <h2 id="sonuc">Sonuç</h2>AWS Step Functions Callback deseni, manuel onay süreçleri, harici webhooks entegrasyonları veya uzun süren asenkron işlemler için mükemmel bir çözümdür. "Wait for Callback" özelliği sayesinde, iş akışlarınızı sunucu yönetimi veya karmaşık poller (sorgulayıcı) mekanizmaları olmadan yönetebilirsiniz.
Daha fazla bilgi için <a href="https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-wait-token" target="_blank" rel="noopener noreferrer">AWS Resmi Dokümantasyonunu</a> inceleyebilirsiniz.
<p><em>Kaynak / Source: <a href="https://awsfundamentals.com/blog/building-a-real-world-use-case-with-step-functions-and-the-callback-pattern" target="_blank" rel="noopener noreferrer">https://awsfundamentals.com/blog/building-a-real-world-use-case-with-step-functions-and-the-callback-pattern</a></em></p>