[AWS] Step Function

์Šคํ…ํ‰์…˜์€ ๋Œ€์ถฉ AWS Lambda์˜ ๋ณด์กฐํ˜• ์„œ๋น„์Šค๋ผ๊ณ  ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.
๋‹ค๋ฅธ ์šฉ๋„๋กœ๋„ ์“ธ ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ๋ณดํ†ต ๊ทธ์ •๋„๋กœ ์“ด๋‹ค.

AWS Lambda๊ฐ€ ์ข‹๊ธด ์ข‹์ง€๋งŒ ์“ฐ๋‹ค๋ณด๋ฉด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ œ์•ฝ์‚ฌํ•ญ์ด ๋”ฐ๋ฅผ ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ์‹คํ–‰์‹œ๊ฐ„์— ์ œํ•œ์ด ์žˆ์–ด์„œ ์ข€ ๋ญ”๊ฐ€ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์Šคํ…ํ‰์…˜์€ ์—ฌ๋Ÿฌ๋ฒˆ์˜ Lambda ํ˜ธ์ถœ์„ ์œ ๊ธฐ์ ์œผ๋กœ ์—ฎ์–ด์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ์„œ๋น„์Šค๋‹ค.
์ด๊ฑธ ์ด์šฉํ•˜๋ฉด Lambda ๋“ฑ์„ ๋” ํšจ์œจ์ ์ด๊ณ  ํŽธ๋ฆฌํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ์‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.




๋น„์šฉ

๋น„์šฉ์€ ์•„๋ž˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.
https://aws.amazon.com/ko/step-functions/pricing/

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์ƒํƒœ์ „ํ™˜ ํšŸ์ˆ˜๋งŒ์œผ๋กœ ์š”๊ธˆ์„ ์ง€๋ถˆํ•œ๋‹ค.

์ €๊ฒƒ๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ Express Workflows๋ผ๋Š” ๋ชจ๋“œ๋กœ ๋งŒ๋“ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์œผ๋กœ ์š”๊ธˆ์„ ๋œฏ๋Š”๋‹ค.

์ด๊ฑด ๋ณดํ†ต์€ ์“ธ์ผ์ด ์ž˜ ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.




์ƒํƒœ ๋จธ์‹  ์ฝ”๋“œ

์Šคํ…ํŽ‘์…˜์€ ์ƒํƒœ ๋จธ์‹ ์ด๋ผ๋Š” ๊ฒƒ์œผ๋กœ ์ „์ฒด์ ์ธ ๋กœ์ง์„ ์ œ์–ดํ•œ๋‹ค.
์ƒํƒœ๋จธ์‹  ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

{
  "Comment": "...",
  "StartAt": "...",
  "States": {
     ...
  }
}

Comment๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ฃผ์„, ์„ค๋ช…์ด๋‹ค. ์ค‘์š”ํ•˜์ง„ ์•Š๋‹ค.
States์—๋Š” ๋ชจ๋“  ์ƒํƒœ์˜ ์ •์˜๋ฅผ ํ‚ค-๊ฐ’ ํ˜•ํƒœ๋กœ ๋„ฃ๊ณ , StartAt๋Š” ์–ด๋–ค State์—์„œ ์‹œ์ž‘ํ• ์ง€๋ฅผ ์ •ํ•œ๋‹ค.


๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์€ ์ƒํƒœ๋จธ์‹ ์„ ์ฝ”๋“œ๋กœ ์ •์˜ํ•œ๋‹ค๋ฉด

์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

{
  "Comment": "A Hello World example demonstrating various state types of the Amazon States Language",
  "StartAt": "Pass",
  "States": {
    "Pass": {
      "Comment": "A Pass state passes its input to its output, without performing work. Pass states are useful when constructing and debugging state machines.",
      "Type": "Pass",
      "Next": "Hello World example?"
    },
    "Hello World example?": {
      "Comment": "A Choice state adds branching logic to a state machine. Choice rules can implement 16 different comparison operators, and can be combined using And, Or, and Not",
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.IsHelloWorldExample",
          "BooleanEquals": true,
          "Next": "Yes"
        },
        {
          "Variable": "$.IsHelloWorldExample",
          "BooleanEquals": false,
          "Next": "No"
        }
      ],
      "Default": "Yes"
    },
    "Yes": {
      "Type": "Pass",
      "Next": "Wait 3 sec"
    },
    "No": {
      "Type": "Fail",
      "Cause": "Not Hello World"
    },
    "Wait 3 sec": {
      "Comment": "A Wait state delays the state machine from continuing for a specified time.",
      "Type": "Wait",
      "Seconds": 3,
      "Next": "Parallel State"
    },
    "Parallel State": {
      "Comment": "A Parallel state can be used to create parallel branches of execution in your state machine.",
      "Type": "Parallel",
      "Next": "Hello World",
      "Branches": [
        {
          "StartAt": "Hello",
          "States": {
            "Hello": {
              "Type": "Pass",
              "End": true
            }
          }
        },
        {
          "StartAt": "World",
          "States": {
            "World": {
              "Type": "Pass",
              "End": true
            }
          }
        }
      ]
    },
    "Hello World": {
      "Type": "Pass",
      "End": true
    }
  }
}

๊ทธ๋ฆฌ๊ณ  States์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํƒ€์ž…์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
Pass๋Š” ๋‹ค์Œ ์ƒํƒœ๋กœ ์ง€๋‚˜๊ฐ€๊ฒŒ๋งŒ ํ•˜๊ณ , Choice๋Š” If-Else ๋ถ„๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
Fail์€ ์‹คํŒจ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , Wait๋Š” ๋Œ€๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Pass ํƒ€์ž…์— End ๊ฐ’์„ ์ฃผ๋ฉด ๊ทธ๋Œ€๋กœ ์ข…๋ฃŒํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ƒํƒœ๋จธ์‹ ์€ GUI๋กœ ๋œ ํŽธ๋ฆฌํ•œ ํŽธ์ง‘๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ผญ ๋‹ค ์•Œ์•„์•ผ ํ•˜๋Š”๊ฑด ์•„๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ ๊ตฌ์กฐ๊ฐ€ ์ด๋ ‡๋‹ค๋Š” ๊ฒƒ๋งŒ ์•Œ์•„๋‘์ž.




์ƒํƒœ ๋จธ์‹  ์ƒ์„ฑ

๊ทธ๋Ÿผ ์ด์ œ ์ƒํƒœ๋จธ์‹ ์„ ๋งŒ๋“ค์–ด๋ณด์ž.
์ฝ”๋“œ๋กœ๋„ ํ•  ์ˆ˜ ์žˆ๊ณ , GUI๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋ƒฅ GUI๋กœ ํ•ด๋ณด๊ฒ ๋‹ค.

๊ทธ๋Ÿผ ์ด๋Ÿฐ์‹์œผ๋กœ ๋œฐ ๊ฒƒ์ด๋‹ค.

AWS ๋ฆฌ์†Œ์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜

ํ๋ฆ„ ์ œ์–ด ๋กœ์ง์„ ๋“œ๋ž˜๊ทธํ•ด์„œ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ๋ง์ด๋‹ค.




์˜ˆ์ œ: ์ฃผ์‚ฌ์œ„ ๋˜์ง€๊ธฐ ํ”„๋กœ๊ทธ๋žจ

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํ•œ๋ฒˆ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์งš์–ด๋ณด๊ฒ ๋‹ค.

๋‚˜๋Š” 1-6๊นŒ์ง€์˜ ๊ฐ’์ด ์žˆ๋Š” ์ฃผ์‚ฌ์œ„๋ฅผ ๋˜์ง€๋˜, 6์ด ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋˜์ง€๋Š” ๋ฃจํ‹ด์„ ์ •์˜ํ•˜๊ณ  ์‹ถ๋‹ค.
์žฌ์‹œ๋„ํ• ๋•Œ๋Š” 5์ดˆ๋งŒ ํ…€์„ ์ฃผ๊ฒ ๋‹ค.

๊ทธ๋Ÿผ ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐฐ์น˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.




์ฃผ์‚ฌ์œ„ ๋˜์ง€๊ธฐ ๊ตฌํ˜„

์ฃผ์‚ฌ์œ„ ๋˜์ง€๊ธฐ๋ฅผ ํด๋ฆญํ•ด์„œ ์‹คํ–‰๋  ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ๋‹ค.

๊ทธ๋ƒฅ ๋‚œ์ˆ˜๋กœ 1-6 ๊ฐ’์„ ๋˜์ ธ์ฃผ๋Š” ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‘๋‹ต๊ฐ’์œผ๋กœ ํ•ด๋‹น ์ˆซ์ž๋ฅผ ๋„ฃ์—ˆ๋Š”๋ฐ, ๋žŒ๋‹ค์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์ด ๋‹ค์Œ ์ƒํƒœ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์ด ๋œ๋‹ค.




์กฐ๊ฑด ๋ถ„๊ธฐ ๊ตฌํ˜„

์ด๋ฒˆ์—” 6์ธ์ง€ ์ฒดํฌํ•˜๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

Add Conditions๋ฅผ ํด๋ฆญํ•ด์„œ ์กฐ๊ฑด์„ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ํ™”๋ฉด์ด ๋œจ๋Š”๋ฐ

์ด์ „์˜ diceNumber๊ฐ€ 6์ผ๋•Œ๋งŒ ์ด๋™์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.

$๊ฐ€ ์ด์ „ ์ƒํƒœ๊ฐ’์˜ ๋ณ„์นญ์ธ๊ฑฐ๊ฐ™๋‹ค.
๊ฐ’ ์ ‘๊ทผ์€ JSON ๋ฌธ๋ฒ•์„ ๋”ฐ๋ฅธ๋‹ค.




์„ฑ๊ณต ์ผ€์ด์Šค ๊ตฌํ˜„ํ•˜๊ธฐ

6์ด ๋งž์•˜์„๋•Œ ๋ฐ”๋กœ ์ด๋™ํ•  ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ๋‹ค.
๋ณ„๊ฑฐ์—†๋‹ค.

๊ทธ๋ƒฅ ์Šฌ๋ž™์— ๋ฉ”์„ธ์ง€๋งŒ ์ฐ์–ด์ฃผ๋„๋ก ํ–ˆ๋‹ค.





์‹คํŒจ ์ผ€์ด์Šค ๊ตฌํ˜„ํ•˜๊ธฐ

์ผ๋‹จ ๋žŒ๋‹ค๋กœ ์ˆซ์ž๊ฐ€ ๋ญ๊ฐ€ ๋‚˜์™”๋Š”์ง€๋Š” ์ฐ์–ด์ฃผ๋ ค ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ์ด์ „ ์ƒํƒœ๊ฐ’์—์„œ ์ˆซ์ž๊ฐ’์„ ๊บผ๋‚ด์„œ ๋ณด๋‚ด์ฃผ๋„๋ก ํ–ˆ๋‹ค.

์ด์ „ ์ƒํƒœ๊ฐ’์€ event์— ๊ทธ๋Œ€๋กœ ์ฃผ์ž…๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Pass๋Š” ๊ทธ๋ƒฅ Wait๋กœ ์ด์–ด์ง€๊ฒŒ ํ–ˆ๊ณ 

Wait๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด 5์ดˆ๋ฅผ ์ž…๋ ฅํ•ด๋’€๋‹ค.

์ž. ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ์€ ๋๋‚ฌ๋‹ค.
๋‹ค์Œ์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๋ณด์—ฌ์ค„ ๊ฒƒ์ด๋‹ค.

์ง€๋‚˜์ณ์„œ ์ƒ์„ฑ์„ ์™„๋ฃŒํ•˜๋ฉด ๋œ๋‹ค.




์ƒํƒœ๋จธ์‹  ์‹คํ–‰

๋งŒ๋“ค์–ด๋†“์€ ๋จธ์‹ ์„ ์‹คํ–‰ํ•ด๋ณด์ž.
๋ฐฉ๋ฒ•์€ ์–ด๋ ต์ง€ ์•Š๋‹ค.

๊ทธ๋ƒฅ ์ €๊ธฐ "์‹คํ–‰ ์‹œ์ž‘" ๋ˆ„๋ฅด๊ณ 

ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•„์š”ํ•˜๋‹ค๋ฉด ๋„ฃ๋Š”๋‹ค.

์ €๊ธฐ์„œ ๋„ฃ๋Š” ๊ฐ’์ด ์ตœ์ดˆ ์ƒํƒœ๊ฐ’์ด ๋  ๊ฒƒ์ด๋‹ค.

์ €๋ ‡๊ฒŒ ํ•ด์„œ ์‹คํ–‰ํ•˜๋ฉด

์ด๋ ‡๊ฒŒ ์‹คํ–‰ ์ฝ˜์†”์ด ๋œจ๊ณ 

์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด์„œ

๋ฉ”์„ธ์ง€๊ฐ€ ๋‚ ๋ผ์˜ฌ ๊ฒƒ์ด๋‹ค.

์œ„์— ๋ฉ”์„ธ์ง€ 2๊ฐœ๋Š” ์ƒ๊ด€์—†๋Š”๊ฑฐ๋ผ ๊ฐ€๋ ธ๋‹ค.

์ถœ๋ ฅ๋„ ๋œฌ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ์จ๋จน์œผ๋ฉด ๋œ๋‹ค.



์ฐธ์กฐ
https://blog.leedoing.com/184
https://medium.com/@tturnbull/passing-data-between-lambdas-with-aws-step-functions-6f8d45f717c3