Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Deliver Business Value Faster with AWS Step Functions

198 visualizaciones

Publicado el

AWS Serverless Hero Yan Cui, explains how to achieve business agility (deliver value to your customers faster) using Step Functions (Amazon’s application orchestration tool that lets you build visual workflows: https://aws.amazon.com/step-functions/). You will learn:
* about its pros & cons,
* when to use it,
* how to design systems with it, and
* hear about real-world case studies… to model your solutions after.

Event details: https://www.meetup.com/Serverless-Toronto/events/272394916/
Event recording: http://youtube.serverlesstoronto.org/

For more exciting learning opportunities, join our #ServerlessTO community: https://www.meetup.com/Serverless-Toronto/about/

Publicado en: Software
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Deliver Business Value Faster with AWS Step Functions

  1. 1. Welcome to ServerlessToronto.org “Home of Less IT Mess” 1 Introduce Yourself ☺ - Why are you here? - Looking for work or Offering work? Fill the survey to win prises: - https://forms.gle/gystJ2rbT8TdzkhZ6 “Deliver Business Value Faster with AWS Step Functions” will start at 5:10pm…
  2. 2. Serverless is not just about the Tech: 2 Serverless is New Agile & Mindset #1 Serverless Dev (Back-end FaaS dev, but turned into gluing APIs and Managed Services) #2 We're obsessed to creating business value (meaningful MVPs, Products), to empower Business users #3 We build bridges between Serverless Community (“Dev leg”), and Front-end & Voice- First developers & User Experience designers (“UX leg”) #4 Achieve agility NOT by “sprinting” faster (like in Scrum), but working smarter (by using bigger building blocks and less Ops)
  3. 3. What is the Serverless Mindset? 3 Way too often we – the IT folks, have obsession for “pimping up our cars” (infrastructure/code) instead for “driving business” forward & taking them places ☺
  4. 4. Upcoming #ServerlessTO Online Meetups 4 1. Google Cloud Next ’20 Recap + Cloud Run where Serverless meets Containers – Kelsey Hightower ** OCT 5 @ 6pm EST ** 2. Your Presentation ☺ Serverless ≠ AWS, so practitioners from other clouds are welcome!
  5. 5. Knowledge Sponsor 1. Production-Ready Serverless GOOD LUCK! 2. Serverless Architectures on AWS, 2nd Edition Fill the survey to win ☺
  6. 6. Deliver Business Value Faster with AWS Step Functions Yan Cui – AWS Serverless Hero, Consultant, Author, Trainer, Developer Advocate at @Lumigo 6 The Feature Presentation
  7. 7. What is step functions? How it works? When to use it? Orchestration vs Choreography Real-world case studies Design patterns Agenda
  8. 8. @theburningmonk theburningmonk.com Step Functions
  9. 9. @theburningmonk theburningmonk.com orchestration service that allows you to model workflows as state machines
  10. 10. @theburningmonk theburningmonk.com design with JSON https://states-language.net/spec.html
  11. 11. @theburningmonk theburningmonk.com
  12. 12. @theburningmonk theburningmonk.com Step Functions OOP class instanceexecution input arguments
  13. 13. @theburningmonk theburningmonk.com start a state machine via.. StepFunctions .startExecution(req) .promise()
  14. 14. @theburningmonk theburningmonk.com start a state machine via.. API Gateway StepFunctions .startExecution(req) .promise()
  15. 15. @theburningmonk theburningmonk.com start a state machine via.. EventBridge including cron StepFunctions .startExecution(req) .promise() API Gateway
  16. 16. @theburningmonk theburningmonk.com
  17. 17. @theburningmonk theburningmonk.com
  18. 18. @theburningmonk theburningmonk.com
  19. 19. @theburningmonk theburningmonk.com
  20. 20. @theburningmonk theburningmonk.com state transitions
  21. 21. @theburningmonk theburningmonk.com
  22. 22. @theburningmonk theburningmonk.com $25 PER MILLION
  23. 23. @theburningmonk theburningmonk.com $25 PER MILLION 15X LAMBDA PRICING!
  24. 24. @theburningmonk theburningmonk.com https://aws.amazon.com/about-aws/whats-new/2019/12/introducing-aws-step-functions-express-workflows
  25. 25. @theburningmonk theburningmonk.com
  26. 26. Yan Cui http://theburningmonk.com @theburningmonk AWS user for 10 years
  27. 27. http://bit.ly/yubl-serverless
  28. 28. Yan Cui http://theburningmonk.com @theburningmonk Developer Advocate @
  29. 29. Yan Cui http://theburningmonk.com @theburningmonk Independent Consultant advisetraining development
  30. 30. theburningmonk.com/courses
  31. 31. homeschool.dev
  32. 32. designing state machines
  33. 33. types of states
  34. 34. @theburningmonk theburningmonk.com "TaskState": {  "Type": "Task",  "Resource": "arn:aws:lambda:us-east-1:1234556788:function:hello-world",  "Next": "NextState",  "TimeoutSeconds": 300 } Task Performs a task.
  35. 35. @theburningmonk theburningmonk.com "TaskState": {  "Type": "Task",  "Resource": "arn:aws:lambda:us-east-1:1234556788:function:hello-world",  "Next": "NextState",  "TimeoutSeconds": 300 } Task Performs a task.
  36. 36. @theburningmonk theburningmonk.com "TaskState": {  "Type": "Task",  "Resource": "arn:aws:lambda:us-east-1:1234556788:function:hello-world",  "Next": "NextState",  "TimeoutSeconds": 300 } Task Performs a task.
  37. 37. @theburningmonk theburningmonk.com "TaskState": {  "Type": "Task",  "Resource": "arn:aws:lambda:us-east-1:1234556788:function:hello-world",  "Next": "NextState",  "TimeoutSeconds": 300 } Task Performs a task.
  38. 38. @theburningmonk theburningmonk.com "TaskState": {  "Type": "Task",  "Resource": "arn:aws:lambda:us-east-1:1234556788:function:hello-world",  "Next": "NextState",  "TimeoutSeconds": 300 } Task Defaults to 60s, even if function has longer timeout Performs a task.
  39. 39. @theburningmonk theburningmonk.com "TaskState": {  "Type": "Task",  "Resource": "arn:aws:lambda:us-east-1:1234556788:function:hello-world",  "Next": "NextState",  "TimeoutSeconds": 300 } Task Defaults to 60s, even if function has longer timeout Set this to match your function’s timeout Performs a task.
  40. 40. @theburningmonk theburningmonk.com "TaskState": {  "Type": "Task",  "Resource": "arn:aws:lambda:us-east-1:1234556788:function:hello-world",  "Next": "NextState",  "TimeoutSeconds": 300 } Task Doesn’t have to be Lambda function. Performs a task.
  41. 41. @theburningmonk theburningmonk.com "TaskState": {  "Type": "Task",  "Resource": "arn:aws:lambda:us-east-1:1234556788:function:hello-world",  "Next": "NextState",  "TimeoutSeconds": 300 } Task Doesn’t have to be Lambda function. Performs a task. Activity, AWS Batch, ECS task, DynamoDB, SNS, SQS, AWS Glue, SageMaker
  42. 42. @theburningmonk theburningmonk.com { “x”: 42, “y”: 13 } $ => { “x”: 42, “y”: 13 } "choose": { "Type": "Choice", "Choices": [ { "And": [ { "Variable": "$.x", "NumericGreaterThanEquals": 42 }, { "Variable": "$.y", "NumericLessThan": 42 } ], "Next": "subtract" } ], "Default": "add" },
  43. 43. @theburningmonk theburningmonk.com { “x”: 42, “y”: 13 } $ => { “x”: 42, “y”: 13 } "subtract": { "Type": "Task", “Resource": "arn:aws:lambda:…", "Next": "double", "ResultPath": "$.n" },
  44. 44. @theburningmonk theburningmonk.com { “x”: 42, “y”: 13 } $ => { “x”: 42, “y”: 13 } module.exports.handler = async (input, context) => { return input.x - input.y } $.n
  45. 45. @theburningmonk theburningmonk.com { “x”: 42, “y”: 13 } $ => { “x”: 42, “y”: 13, “n”: 29 }
  46. 46. @theburningmonk theburningmonk.com { “x”: 42, “y”: 13 } $ => { “x”: 42, “y”: 13, “n”: 29 } "double": { “Type": "Task", “Resource”: ”arn:aws:lambda:...", “InputPath": "$.n", “End": true }
  47. 47. @theburningmonk theburningmonk.com { “x”: 42, “y”: 13 } $ => { “x”: 42, “y”: 13, “n”: 29 } module.exports.handler = async (input, context) => { return input * 2; } $.n $
  48. 48. @theburningmonk theburningmonk.com { “x”: 42, “y”: 13 } $ => 58 "double": { “Type": "Task", “Resource”: ”arn:aws:lambda:...", “InputPath": "$.n", “End": true }
  49. 49. @theburningmonk theburningmonk.com { “x”: 42, “y”: 13 } { “output”: 58 }
  50. 50. @theburningmonk theburningmonk.com "NoOp": {  "Type": "Pass",    "Result": {    "is": 42  },  "ResultPath": "$.the_answer_to_the_question_of_life_the_universe_and_everything",  "Next": "NextState" } Pass Passes input to output without doing any work.
  51. 51. @theburningmonk theburningmonk.com "NoOp": {  "Type": "Pass",    "Result": {    "is": 42  },  "ResultPath": "$.the_answer_to_the_question_of_life_the_universe_and_everything",  "Next": "NextState" } Pass Passes input to output without doing any work.
  52. 52. @theburningmonk theburningmonk.com Pass Passes input to output without doing any work. { } {  “the_answer_to_the_question_of_life_the_universe_and_everything”: {    “is”: 42  } }
  53. 53. @theburningmonk theburningmonk.com "WaitTenSeconds" : {  "Type" : "Wait",  "Seconds" : 10,  "Next": "NextState" } Wait Wait before transitioning to next state. "WaitTenSeconds" : {  "Type" : "Wait", “Timestamp": "2018-08-08T01:59:00Z",   "Next": "NextState" }
  54. 54. @theburningmonk theburningmonk.com "WaitTenSeconds" : {  "Type" : "Wait",  "Seconds" : 10,  "Next": "NextState" } Wait Wait before transitioning to next state. "WaitTenSeconds" : {  "Type" : "Wait", “Timestamp": "2018-08-08T01:59:00Z",   "Next": "NextState" }
  55. 55. @theburningmonk theburningmonk.com "WaitTenSeconds" : {  "Type" : "Wait",  "SecondsPath" : "$.waitTime",  "Next": "NextState" } Wait Wait before transitioning to next state. "WaitTenSeconds" : {  "Type" : "Wait", “TimestampPath": “$.waitUntil”,   "Next": "NextState" }
  56. 56. @theburningmonk theburningmonk.com "ChoiceState": {  "Type" : "Choice",  "Choices": [    {       "Variable": "$.name",      "StringEquals": "Neo"      "Next": "RedPill"    }  ],  "Default": "BluePill" } Choice Adds branching logic to the state machine.
  57. 57. @theburningmonk theburningmonk.com "ChoiceState": {  "Type" : "Choice",  "Choices": [    {       "Variable": "$.name",      "StringEquals": "Neo"      "Next": "RedPill"    }  ],  "Default": "BluePill" } Choice Adds branching logic to the state machine.
  58. 58. @theburningmonk theburningmonk.com "ChoiceState": {  "Type" : "Choice",  "Choices": [    {       "Variable": "$.name",      "StringEquals": "Neo"      "Next": "RedPill"    }  ],  "Default": "BluePill" } Choice Adds branching logic to the state machine.
  59. 59. @theburningmonk theburningmonk.com "ChoiceState": {  "Type" : "Choice",  "Choices": [    {       "Variable": "$.name",      "StringEquals": "Neo"      "Next": "RedPill"    }  ],  "Default": "BluePill" } Choice Adds branching logic to the state machine. { “And”: [ {       "Variable": "$.name",       "StringEquals": “Cypher"     }, {       "Variable": "$.afterNeoIsRescued",       "BooleanEquals": true     }, ],   "Next": "BluePill" }
  60. 60. @theburningmonk theburningmonk.com "FunWithMath": {  "Type": "Parallel",  "Branches": [    {      "StartAt": "Add",      "States": {        "Add": {          "Type": "Task",          "Resource": "arn:aws:lambda:us-east-1:1234556788:function:add",          "End": true        }      }    },    …  ],  "Next": "NextState" } Parallel Performs tasks in parallel.
  61. 61. @theburningmonk theburningmonk.com "FunWithMath": {  "Type": "Map",  "Iterator": [    {      "StartAt": "DoSomething",      "States": {        "Add": {          "Type": "Task",          "Resource": “arn:aws:lambda:us-east-1:1234556788:function:doSomething",          "End": true        }      }    },    …  ],  "Next": "NextState" } Map Dynamic parallelism!
  62. 62. @theburningmonk theburningmonk.com "FunWithMath": {  "Type": "Map",  "Iterator": [    {      "StartAt": "DoSomething",      "States": {        "Add": {          "Type": "Task",          "Resource": "arn:aws:lambda:us-east-1:1234556788:function:doSomething",          "End": true        }      }    },    …  ],  "Next": "NextState" } Map Dynamic parallelism! e.g. [ { … }, { … }, { … } ]
  63. 63. @theburningmonk theburningmonk.com "SuccessState" : {  "Type" : "Succeed" } Succeed Terminates the state machine successfully.
  64. 64. @theburningmonk theburningmonk.com "FailState" : {  "Type" : “Fail", "Error" : "TypeA", "Cause" : "Kaiju Attack", } Fail Terminates the state machine and mark it as failure.
  65. 65. @theburningmonk theburningmonk.com https://aws.amazon.com/about-aws/whats-new/2019/08/aws-step-function-adds-support-for-nested-workflows
  66. 66. WHEN TO USE STEP FUNCTIONS?
  67. 67. @theburningmonk theburningmonk.com $25 PER MILLION 15X LAMBDA PRICING!
  68. 68. @theburningmonk theburningmonk.com another moving part to manage
  69. 69. @theburningmonk theburningmonk.com what’s the return-on-investment?
  70. 70. @theburningmonk theburningmonk.com Pros Cons $$$
  71. 71. @theburningmonk theburningmonk.com https://aws.amazon.com/about-aws/whats-new/2019/12/introducing-aws-step-functions-express-workflows
  72. 72. @theburningmonk theburningmonk.com Pros Cons visual $$$
  73. 73. @theburningmonk theburningmonk.com Great for collaboration with team members who are not engineers
  74. 74. @theburningmonk theburningmonk.com Makes it easy for anyone to identify and debug application errors.
  75. 75. @theburningmonk theburningmonk.com Pros Cons visual $$$ error handling
  76. 76. @theburningmonk theburningmonk.com Makes deciding on timeout setting for Lambda functions easier when you don’t have to consider retry and exponential backoff, etc.
  77. 77. @theburningmonk theburningmonk.com Surfaces error handling for everyone to see, makes it easy for others to see without digging into the code.
  78. 78. @theburningmonk theburningmonk.com Pros Cons visual $$$ error handling audit
  79. 79. @theburningmonk theburningmonk.com
  80. 80. @theburningmonk theburningmonk.com
  81. 81. @theburningmonk theburningmonk.com
  82. 82. @theburningmonk theburningmonk.com
  83. 83. @theburningmonk theburningmonk.com
  84. 84. @theburningmonk theburningmonk.com Pros Cons visual $$$ error handling audit
  85. 85. @theburningmonk theburningmonk.com business critical workflows what: stuff that makes money, e.g. payment and subscription flows. why: more robust error handling worth the premium.
  86. 86. @theburningmonk theburningmonk.com complex workflows what: complex workflows that involves many states, branching logic, etc. why: visual workflow is a powerful design (for product) and diagnostic tool (for customer support).
  87. 87. @theburningmonk theburningmonk.com long running workflows what: workflows that cannot complete in 15 minutes (Lambda limit). why: AWS discourages recursive Lambda functions, Step Functions gives you explicit branching checks, and can timeout at workflow level.
  88. 88. @theburningmonk theburningmonk.com https://aws.amazon.com/about-aws/whats-new/2019/12/introducing-aws-step-functions-express-workflows
  89. 89. @theburningmonk theburningmonk.com
  90. 90. @theburningmonk theburningmonk.com https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html
  91. 91. @theburningmonk theburningmonk.com https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html
  92. 92. @theburningmonk theburningmonk.com https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html
  93. 93. @theburningmonk theburningmonk.com https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html
  94. 94. @theburningmonk theburningmonk.com
  95. 95. @theburningmonk theburningmonk.com
  96. 96. @theburningmonk theburningmonk.com use Express Workflows for high-throughput, short-lived workflows (OLTP)
  97. 97. @theburningmonk theburningmonk.com Pros Cons visual $$$ error handling audit
  98. 98. @theburningmonk theburningmonk.com
  99. 99. @theburningmonk theburningmonk.com Orchestration Choreography
  100. 100. @theburningmonk theburningmonk.com Orchestration Choreography
  101. 101. @theburningmonk theburningmonk.com orchestration within a bounded-context choreography between bounded-contexts Rule of Thumb
  102. 102. @theburningmonk theburningmonk.com bounded context fits within my head high cohesion same ownership
  103. 103. @theburningmonk theburningmonk.com bounded context the workflow doesn’t exist as a standalone concept, but as the sum of a series of loosely connected parts Lambda Lambda Lambda SQS SQS API Gateway
  104. 104. @theburningmonk theburningmonk.com bounded context A bounded context B bounded context C EventBridge SNS
  105. 105. @theburningmonk theburningmonk.com https://lumigo.io/blog/5-reasons-why-you-should-use-eventbridge-instead-of-sns
  106. 106. @theburningmonk theburningmonk.com don’t forget to emit events from the workflow
  107. 107. @theburningmonk theburningmonk.com orchestration within a bounded-context choreography between bounded-contexts Rule of Thumb
  108. 108. Step Functions in the wild
  109. 109. @theburningmonk theburningmonk.com Backend system was slow and had timing issue, so they needed to add a 90s delay before processing payment. Step Functions was the most cost- efficient and scalable way to implement this wait.
  110. 110. @theburningmonk theburningmonk.com Update nutritional info on over 100 brands to comply with FDA regulations. Reduced processing time from 36 hours to 10 seconds.
  111. 111. @theburningmonk theburningmonk.com Transcode video segments in parallel. Reduced processing time from ~20 mins to ~2 mins.
  112. 112. @theburningmonk theburningmonk.com Manages their food delivery experience.
  113. 113. @theburningmonk theburningmonk.com Automates subscription fulfilments with Step Functions.
  114. 114. @theburningmonk theburningmonk.com Automates subscription billing system with Step Functions.
  115. 115. @theburningmonk theburningmonk.com Implements payment processing, and subscription fulfillment systems with Step Functions, and many more.
  116. 116. @theburningmonk theburningmonk.com sagas
  117. 117. @theburningmonk theburningmonk.com managing failures in a distributed transaction
  118. 118. @theburningmonk theburningmonk.com
  119. 119. @theburningmonk theburningmonk.com
  120. 120. @theburningmonk theburningmonk.com
  121. 121. @theburningmonk theburningmonk.com Success path!
  122. 122. @theburningmonk theburningmonk.com Failure paths…
  123. 123. @theburningmonk theburningmonk.com "BookFlight": { "Type": “Task", "Resource": “arn:aws:lambda:…”, "Catch": [ { "ErrorEquals": [ “States.ALL" ], "ResultPath": "$.BookFlightError", "Next": “CancelFlight" } ], "ResultPath": "$.BookFlightResult", "Next": "BookRental" },
  124. 124. @theburningmonk theburningmonk.com "BookFlight": { "Type": “Task", "Resource": “arn:aws:lambda:…”, "Catch": [ { "ErrorEquals": [ “States.ALL" ], "ResultPath": "$.BookFlightError", "Next": “CancelFlight" } ], "ResultPath": "$.BookFlightResult", "Next": "BookRental" },
  125. 125. @theburningmonk theburningmonk.com "BookFlight": { "Type": “Task", "Resource": “arn:aws:lambda:…”, "Catch": [ { "ErrorEquals": [ “States.ALL" ], "ResultPath": "$.BookFlightError", "Next": “CancelFlight" } ], "ResultPath": "$.BookFlightResult", "Next": "BookRental" },
  126. 126. @theburningmonk theburningmonk.com "CancelFlight": { "Type": “Task", "Resource": “arn:aws:lambda:…”, "Catch": [ { "ErrorEquals": [ “States.ALL" ], "ResultPath": "$.CancelFlightError", "Next": “CancelFlight" } ], "ResultPath": "$.CancelFlightResult", "Next": “CancelHotel" },
  127. 127. @theburningmonk theburningmonk.com "CancelFlight": { "Type": “Task", "Resource": “arn:aws:lambda:…”, "Catch": [ { "ErrorEquals": [ “States.ALL" ], "ResultPath": "$.CancelFlightError", "Next": “CancelFlight" } ], "ResultPath": "$.CancelFlightResult", "Next": “CancelHotel" },
  128. 128. @theburningmonk theburningmonk.com https://github.com/theburningmonk/lambda-saga-pattern
  129. 129. @theburningmonk theburningmonk.com callbacks
  130. 130. @theburningmonk theburningmonk.com https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-wait-token
  131. 131. @theburningmonk theburningmonk.com
  132. 132. @theburningmonk theburningmonk.com TaskToken
  133. 133. @theburningmonk theburningmonk.com
  134. 134. @theburningmonk theburningmonk.com TaskToken ?
  135. 135. @theburningmonk theburningmonk.com ?
  136. 136. @theburningmonk theburningmonk.com sendTaskSuccess(TaskToken) ?
  137. 137. @theburningmonk theburningmonk.com
  138. 138. @theburningmonk theburningmonk.com "Publish SQS message": {  "Type": "Task",  "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",  "Parameters": {  "QueueUrl": !Ref MyQueue, "MessageBody": { "Token.$": "$$.Task.Token" } },  "Next": "NextState" }
  139. 139. @theburningmonk theburningmonk.com "Publish SQS message": {  "Type": "Task",  "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",  "Parameters": {  "QueueUrl": !Ref MyQueue, "MessageBody": { "Token.$": "$$.Task.Token" } },  "Next": "NextState" }
  140. 140. @theburningmonk theburningmonk.com "Publish SQS message": {  "Type": "Task",  "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",  "Parameters": {  "QueueUrl": !Ref MyQueue, "MessageBody": { "Token.$": "$$.Task.Token" } },  "Next": "NextState" }
  141. 141. @theburningmonk theburningmonk.com "Publish SQS message": {  "Type": "Task",  "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",  "Parameters": {  "QueueUrl": !Ref MyQueue, "MessageBody": { "Token.$": "$$.Task.Token" } },  "Next": "NextState" }
  142. 142. @theburningmonk theburningmonk.com https://docs.aws.amazon.com/step-functions/latest/dg/input-output-contextobject.html
  143. 143. @theburningmonk theburningmonk.com "Publish SQS message": {  "Type": "Task",  "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",  "Parameters": {  "QueueUrl": !Ref MyQueue, "MessageBody": { "Token.$": "$$.Task.Token", "ExecutionId.$": "$$.Execution.Id", "StateMachineId.$": "$$.StateMachine.Id" } },  "Next": "NextState" }
  144. 144. @theburningmonk theburningmonk.com sendTaskSuccess(TaskToken) ? needs access to Step Functions
  145. 145. @theburningmonk theburningmonk.com HTTP POST ? sendTaskSuccess
  146. 146. @theburningmonk theburningmonk.com https://go.aws/38KynD1
  147. 147. @theburningmonk theburningmonk.com TaskToken
  148. 148. @theburningmonk theburningmonk.com map-reduce
  149. 149. @theburningmonk theburningmonk.com Map
  150. 150. @theburningmonk theburningmonk.com Map …
  151. 151. @theburningmonk theburningmonk.com Map … { … } { … } { … } { … } { … }
  152. 152. @theburningmonk theburningmonk.com Map … { … } { … } { … } { … } { … } [{ … }, { … } … ]
  153. 153. @theburningmonk theburningmonk.com Map … { … } { … } { … } { … } { … } [{ … }, { … } … ] Reduce
  154. 154. @theburningmonk theburningmonk.com https://github.com/awsdocs/aws-step-functions-developer-guide/blob/master/doc_source/limits.md
  155. 155. @theburningmonk theburningmonk.com https://github.com/awsdocs/aws-step-functions-developer-guide/blob/master/doc_source/limits.md use S3 to store large payloads
  156. 156. theburningmonk.com/hire-me AdviseTraining Delivery “Fundamentally, Yan has improved our team by increasing our ability to derive value from AWS and Lambda in particular.” Nick Blair Tech Lead
  157. 157. theburningmonk.com/courses HALF PRICE during Sept
  158. 158. @theburningmonk theburningmonk.com github.com/theburningmonk
  159. 159. Join www.ServerlessToronto.org Home of “Less IT Mess”

×