Setting the file. One moment. Compensation Saga Pattern Asl · AWS Step Functions · aws/agent-toolkit-for-aws · Skills Docs70
Creating Amazon Aurora Db Cluster With Instances
93
Routing Traffic With Route53 And CloudFront
Resilience Program Design
116.4
Migrating From Jsonpath To Jsonata
(opens in a new tab)
assets/compensation-saga-pattern.asl.json
JSON·134 lines·4 KB
"Key"
: {
11 "productId": {
12 "S": "{% $states.input.productId %}"
13 }
14 },
15 "UpdateExpression": "SET reserved = reserved + :qty",
16 "ExpressionAttributeValues": {
17 ":qty": {
18 "N": "{% $string($states.input.quantity) %}"
19 }
20 }
21 },
22 "Assign": {
23 "orderId": "{% $states.input.orderId %}",
24 "productId": "{% $states.input.productId %}",
25 "reservedQty": "{% $states.input.quantity %}",
26 "total": "{% $states.input.total %}"
27 },
28 "Catch": [
29 {
30 "ErrorEquals": [
31 "States.ALL"
32 ],
33 "Assign": {
34 "orderId": "{% $states.input.orderId %}",
35 "failedStep": "ReserveInventory",
36 "errorInfo": "{% $states.errorOutput %}"
37 },
38 "Next": "OrderFailed"
39 }
40 ],
41 "Next": "ChargePayment"
42 },
43 "ChargePayment": {
44 "Type": "Task",
45 "Resource": "arn:aws:states:::lambda:invoke",
46 "Arguments": {
47 "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:ChargeCard:$LATEST",
48 "Payload": {
49 "orderId": "{% $orderId %}",
50 "amount": "{% $total %}"
51 }
52 },
53 "Assign": {
54 "chargeId": "{% $states.result.Payload.chargeId %}"
55 },
56 "Output": "{% $states.result.Payload %}",
57 "Catch": [
58 {
59 "ErrorEquals": [
60 "States.ALL"
61 ],
62 "Assign": {
63 "failedStep": "ChargePayment",
64 "errorInfo": "{% $states.errorOutput %}"
65 },
66 "Next": "ReleaseInventory"
67 }
68 ],
69 "Next": "ShipOrder"
70 },
71 "ShipOrder": {
72 "Type": "Task",
73 "Resource": "arn:aws:states:::lambda:invoke",
74 "Arguments": {
75 "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:ShipOrder:$LATEST",
76 "Payload": {
77 "orderId": "{% $orderId %}"
78 }
79 },
80 "Catch": [
81 {
82 "ErrorEquals": [
83 "States.ALL"
84 ],
85 "Assign": {
86 "failedStep": "ShipOrder",
87 "errorInfo": "{% $states.errorOutput %}"
88 },
89 "Next": "RefundPayment"
90 }
91 ],
92 "Next": "OrderComplete"
93 },
94 "RefundPayment": {
95 "Type": "Task",
96 "Resource": "arn:aws:states:::lambda:invoke",
97 "Arguments": {
98 "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:RefundCharge:$LATEST",
99 "Payload": {
100 "chargeId": "{% $chargeId %}",
101 "reason": "{% $errorInfo.Cause %}"
102 }
103 },
104 "Next": "ReleaseInventory"
105 },
106 "ReleaseInventory": {
107 "Type": "Task",
108 "Resource": "arn:aws:states:::dynamodb:updateItem",
109 "Arguments": {
110 "TableName": "InventoryTable",
111 "Key": {
112 "productId": {
113 "S": "{% $productId %}"
114 }
115 },
116 "UpdateExpression": "SET reserved = reserved - :qty",
117 "ExpressionAttributeValues": {
118 ":qty": {
119 "N": "{% $string($reservedQty) %}"
120 }
121 }
122 },
123 "Next": "OrderFailed"
124 },
125 "OrderFailed": {
126 "Type": "Fail",
127 "Error": "{% $failedStep & 'Error' %}",
128 "Cause": "{% 'Order ' & $orderId & ' failed at ' & $failedStep & ': ' & ($exists($errorInfo.Cause) ? $errorInfo.Cause : 'Unknown') %}"
129 },
130 "OrderComplete": {
131 "Type": "Succeed"
132 }
133 }
134}