[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