๐Ÿฅž BE
home

Dive into AWS Lambda

Limber up - What is AWS Lambda?

Serverless and AWS Lambda

AWS Lambda๋Š” AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… FasS ์ƒํ’ˆ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ์„œ๋ฒ„๋ฆฌ์Šค๋ž€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ธํ”„๋ผ ํ™˜๊ฒฝ ๊ตฌ์ถ•, OS ์„ค์น˜, ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ ์„ค์ • ๋“ฑ์„ ํ•  ํ•„์š” ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜คํ† ์Šค์ผ€์ผ๋ง, ๋ณด์•ˆ ๋“ฑ์„ ์ฑ…์ž„์ ธ ์ค€๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. AWS Lamdba๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ ์„œ๋ฒ„ ํ”„๋กœ๋น„์ €๋‹๊ณผ ๊ด€๋ฆฌ๋ฅผ ๋ชจ๋‘ AWS ์ธก์ด ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ ํ˜น์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์‹ ๊ฒฝ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ์ €ํฌ๊ฐ€ ์ž˜ ์•„๋Š” EC2์™€ ์–ด๋–ค ์ฐจ์ด์ผ๊นŒ์š”? AWS๊ฐ€ ์ฑ…์ž„์ ธ์ฃผ๋Š” ๋ฒ”์œ„์™€์˜ ๋น„๊ต๋ฅผ ํ†ตํ•ด ๋‘˜์„ ๋น„๊ตํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ํ™•์‹คํžˆ AWS Lambda์—์„œ ์œ ์ €๊ฐ€ ์‹ ๊ฒฝ์จ์•ผ ํ•  ๊ฒƒ๋“ค์ด ์ ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‹คํ–‰ ์‹œ๊ฐ„์ด๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ์—์„œ๋„ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ดํ›„์— ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.
์˜ ํ‘œ ์žฌ๊ฐ€๊ณต
๋‹ค์‹œ AWS Lambda ์†Œ๊ฐœ๋กœ ๋Œ์•„์™€์„œ, Lambda์˜ ํŠน์ง•์„ ์š”์•ฝํ•ด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค
โ€ข
Function-as-a-Service
โ€ข
ํ”„๋กœ๋น„์ €๋‹ ํ˜น์€ ์„œ๋ฒ„ ๊ด€๋ฆฌ, ๋ณด์•ˆ ๊ด€๋ฆฌ๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์šด์˜
โ€ข
์˜คํ† ์Šค์ผ€์ผ๋ง๊ณผ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ
โ€ข
์‹คํŒจ ํ˜น์€ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์ง€์›
โ€ข
์‚ฌ์šฉํ•œ๋งŒํผ๋งŒ ๋น„์šฉ ์ฐจ์ง•(๊ณผ ๋‹ค์†Œ ํ˜œ์ž์Šค๋Ÿฌ์šด ๋น„์šฉ์ •์ฑ…)

Working with AWS Lambda

Lambda๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Lambda๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๊นŒ Lambda์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋ฅผ Function-as-a-Service๋ผ๊ณ  ํ–ˆ์—ˆ์ฃ ? Lambda๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” lambda์˜ handler ํ•จ์ˆ˜๋ฅผ ๋ฌด์กฐ๊ฑด ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, ์ฝ”๋“œ์˜ ์ตœ์ข…์ ์ธ ์‹คํ–‰ ํ˜•ํƒœ๋ฅผ ํ•จ์ˆ˜๋กœ ์‹คํ–‰ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค). handler ํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ ์†Œ์Šค์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ function์„ ์‹คํ–‰ํ•˜๊ณ , API ํ˜•ํƒœ๋กœ ์™ธ๋ถ€ ์„œ๋น„์Šค ํ˜น์€ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
Lambda Handler Function
๋žŒ๋‹ค์˜ ํ•ต์‹ฌ์ด ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์ž์„ธํžˆ ๋ด…์‹œ๋‹ค.
import json def lambda_handler(event, context): # TODO implement return { 'statusCode': 200, 'body': json.dumps('Hello World') }
Python
๋ณต์‚ฌ
๋žŒ๋‹ค๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” event ๊ฐ์ฒด, ๋žŒ๋‹ค์˜ ๋Ÿฐํƒ€์ž„ ์ •๋ณด(request ID, log group ๋“ฑ)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” context ๊ฐ์ฒด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์†Œ์Šค์—์„œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๋ฐ›์œผ๋ฉด(ํŠธ๋ฆฌ๊ฑฐ ๋˜๋ฉด) ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ return๋งŒ ํ•˜๊ณ  ๋๋‚ผ ์ˆ˜๋„ ์žˆ๊ณ , API๋กœ ์™ธ๋ถ€ ์„œ๋น„์Šค ํ˜น์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋žŒ๋‹ค ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ AWS ์›น์—์„œ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ํƒ€์ดํ•‘ํ•  ์ˆ˜๋„ ์žˆ๊ณ , Zip ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2023๋…„ 9์›” ๊ธฐ์ค€ ๋žŒ๋‹ค๋Š” ๋‹ค์Œ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
โ€ข
.Net, Go, Python, Ruby, Java, Node.js (์ฝ˜์†” ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ๋Š” Node.js, Python, Ruby๋งŒ ์ง€์›)
๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋กœ๋„ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋กœ ๋ฐฐํฌํ•  ๊ฒฝ์šฐ AWS์˜ ์ด๋ฏธ์ง€ ํ—ˆ๋ธŒ์ธ Amazon ECR์— ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ , ๋žŒ๋‹ค์—์„œ ECR ์ด๋ฏธ์ง€ URI๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Lambda Layers
๋˜ํ•œ ๋žŒ๋‹ค์˜ Layers๋ฅผ ํ†ตํ•ด ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฐ, ํ˜น์€ ๋žŒ๋‹ค ํ•จ์ˆ˜๋“ค ๊ฐ„์— ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด์„ฑ๋“ค์„ ๋”ฐ๋กœ ๋นผ๋‚ด์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Layers ๊ธฐ๋Šฅ์ด ์ถœ์‹œ๋˜๊ธฐ ์ „์—๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ํŒจํ‚ค์ง€ ํŒŒ์ผ์ด ํ•จ๊ป˜ ์••์ถ•๋˜์–ด ๋žŒ๋‹ค ํ•จ์ˆ˜์— ์—…๋กœ๋“œ ๋˜์—ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋„ ์ตœ๋Œ€ 250MB ์•ˆ์œผ๋กœ์š”. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ถˆํŽธํ•จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
โ€ข
๊ฐ€์žฅ ์ค‘์‹ฌ์ด ๋˜๋Š” ์ฝ”๋“œ์˜ ์šฉ๋Ÿ‰์ด ์ƒ๋‹น๋ถ€๋ถ„ ์ œํ•œ๋˜๋ฉฐ
โ€ข
์ฝ”๋“œ, I/O, RAM ์‚ฌ์šฉ ์ œ์•ฝ์œผ๋กœ ๋žŒ๋‹ค ํ•จ์ˆ˜ ์‹คํ–‰ ๋„์ค‘ ํŒจํ‚ค์ง€ ์„ค์น˜๋Š” ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊นŒ์›€
โ€ข
์ฝ”๋“œ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ํŒจํ‚ค์ง€ ํŒŒ์ผ๊ณผ ๊ฐ™์ด ์••์ถ•ํ•ด์„œ ์—…๋กœ๋“œํ•ด์•ผ ํ•จ
ํ•˜์ง€๋งŒ Layers ๊ธฐ๋Šฅ์ด ์ถœ์‹œ๋˜์–ด ํ•จ์ˆ˜ ๊ฐ„์— ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ ํŒŒ์ผ ๋“ฑ์€ ๋”ฐ๋กœ ์••์ถ•ํ•˜์—ฌ ์—…๋กœ๋“œํ•˜๊ณ , ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” Layers๋ฅผ ๊ณจ๋ผ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Layers๋กœ ๋“ฑ๋ก๋œ ์••์ถ• ํŒŒ์ผ์€ ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ /opt ํด๋”์— ์••์ถ•์ด ํ•ด์ œ๋˜๊ณ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ์™€ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ์™ผ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด โ€˜๊ณ„์ธตโ€™ ํ˜น์€ โ€˜Layersโ€™๋กœ ๊ณ„์ธต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” Layers๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ถ„๋Ÿ‰ ์ƒ ์ƒ๋žตํ•˜์ง€๋งŒ ์œ„์—์„œ ๋‚˜์˜จ ๊ฒƒ ๊ฐ™์ด AWS ์›น์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋“ค์„ ๊ตฌ์„ฑํ•˜๊ณ  ์„ค์ •ํ•  ๋•Œ๋Š” ๋‹ค์†Œ ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AWS์—์„œ๋Š” SAM ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ AWS ์„œ๋น„์Šค๋“ค์„ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์œผ๋กœ ํ•œ ๋ฒˆ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Limitations of Lambda
๋žŒ๋‹ค์˜ ๊ฒฝ์šฐ ์ปดํ“จํŒ… ์ŠคํŽ™ ๊ด€๋ จํ•˜์—ฌ ๋งŽ์€ ์ œ์•ฝ ์‚ฌํ•ญ๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ์•„๋ž˜ ์‚ฌํ•ญ๋“ค์„ ์œ ์˜ํ•˜์—ฌ ์ž‘์—…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
1.
์‹คํ–‰์‹œ๊ฐ„
โ€ข
๋žŒ๋‹ค์˜ ๊ธฐ๋ณธ ์‹คํ–‰ ์‹œ๊ฐ„์€ 3์ดˆ, ์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„์€ 900์ดˆ(15๋ถ„)์ž…๋‹ˆ๋‹ค.
โ€ข
์‹คํ–‰ ์‹œ๊ฐ„์€ โ€˜๊ตฌ์„ฑ > ์ผ๋ฐ˜ ๊ตฌ์„ฑโ€™์—์„œ ํŽธ์ง‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์‹คํ–‰ ์‹œ๊ฐ„ ๋™์•ˆ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋žŒ๋‹ค๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํŒจ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋žŒ๋‹ค๋Š” ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
2.
๋ฉ”๋ชจ๋ฆฌ(์™€ CPU)
โ€ข
๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ŠคํŽ™์€ ๊ธฐ๋ณธ 128MB์ด๋ฉฐ, ์ตœ๋Œ€ 10240MB๊นŒ์ง€ ์„ค์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (์™œ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ณผ๊ฑฐ ์ตœ๋Œ€์น˜์ธ 3008MB๊นŒ์ง€๋งŒ ํ• ๋‹น ๊ฐ€๋Šฅํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค)
โ€ข
๋žŒ๋‹ค์˜ vCPU ์ŠคํŽ™์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ๋น„๋ก€ํ•˜์—ฌ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๊ณต์‹์ ์œผ๋กœ 1,769MB๋ฅผ ํ• ๋‹นํ•˜๋ฉด 1๊ฐœ์˜ CPU ์ŠคํŽ™์„ ์˜จ์ „ํžˆ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ •๋„๋งŒ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์ƒ์€ ๋งŽ์€ ์ด๋“ค์ด ์‹คํ—˜์„ ํ†ตํ•ด ๊ฒฝํ—˜์ ์œผ๋กœ ๋ฐํ˜€๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
โ—ฆ
Proportional CPU Allocation๊ณผ ๊ด€๋ จ๋œ ๋ฏธ๋””์—„ ๊ธ€์ด ์žˆ์œผ๋‹ˆ ๋”ฐ๋กœ ์ฐธ๊ณ ํ•ด๋ณด์…”๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค
โ€ข
๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์€ ๋น„์šฉ๊ณผ ์ง๊ฒฐ(๋น„์šฉ = memory * execution time)๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ๊ณผ ๋น„์šฉ ์‚ฌ์ด์˜ trade-off๋ฅผ ์ž˜ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
3.
์ž„์‹œ ํŒŒ์ผ ์‹œ์Šคํ…œ
โ€ข
๋žŒ๋‹ค์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์‹œ ํŒŒ์ผ ๊ณต๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
ํด๋” ๋ช…์€ /tmp ์ด๋ฉฐ, ๋žŒ๋‹ค๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ์ €์žฅ๋˜๋Š” ํŒŒ์ผ ๋“ฑ์€ ์ด ๊ณต๊ฐ„ ์•ˆ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
โ€ข
512MB๊ฐ€ ๊ธฐ๋ณธ์ด๋ฉฐ 10,240MB๊นŒ์ง€ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4.
๋ฐฐํฌ ํŒจํ‚ค์ง€ ์‚ฌ์ด์ฆˆ
โ€ข
๋žŒ๋‹ค ํ•จ์ˆ˜์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋Š” (๋ ˆ์ด์–ด์™€ ์ปค์Šคํ…€ ๋Ÿฐํƒ€์ž„์„ ํฌํ•จ) ์ตœ๋Œ€ 250MB, ์••์ถ•ํ–ˆ์„ ๊ฒฝ์šฐ 50MB๊นŒ์ง€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ 10GB๊นŒ์ง€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

AWS Lambda Use-Case

๊ทธ๋ ‡๋‹ค๋ฉด Lambda๊ฐ€ ์‹ค์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.
Case 1 - Data Transform Automation
๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” S3์™€ ์—ฐ๋™ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. S3์— ๊ฐ์ฒด๊ฐ€ ์—…๋กœ๋“œ ๋˜๋Š” ๊ฒƒ์„ ํŠธ๋ฆฌ๊ฑฐ๋กœ ์—…๋กœ๋“œ ๋œ ๊ฐ์ฒด๋ฅผ Lambda์—์„œ ์ ์ ˆํžˆ ๋ณ€ํ™˜, ๋‹ค์‹œ S3์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
Case 2 - Web Application
HTML, CSS์™€ ๊ฐ™์€ ์ •์ ์ธ ์ฝ˜ํ…์ธ ๋Š” S3์—์„œ, ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”ํ•œ ๋™์ ์ธ ์ฝ˜ํ…์ธ ๋Š” Lambda์™€ API Gateway๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฆ์œผ๋กœ๋Š” cognito๋ฅผ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•˜๊ณ ์š”.
Case 3 - Monitoring
CloudWatch์—์„œ ์—๋Ÿฌ ํ˜น์€ ์•Œ๋žŒ์ด ๋ฐœ์ƒํ•˜์˜€์„ ๊ฒฝ์šฐ Lambda์—์„œ ์ด๋ฅผ ๋ฐ›์•„ ๊ฐ€๊ณต, SNS์— ๋“ฑ๋ก๋œ ์ด๋ฉ”์ผ๋กœ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Slack webhook์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ฆผ๊ณผ ์—๋Ÿฌ ๋‚ด์šฉ์„ Slack ๋ด‡์œผ๋กœ ๋ฐ›์•„๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Deep Dive 0 - How Lambda works (in the view of AWS)

์œ„๊นŒ์ง€์˜ ๋‚ด์šฉ์€ AWS Lambda๋ฅผ ํ•œ ๋ฒˆ์ด๋ผ๋„ ์จ๋ณธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์–ผ์ถ” ๋‹ค ์•„๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋งŒ ํ–ˆ์ง€, ๋žŒ๋‹ค๋ผ๋Š” ์„œ๋น„์Šค๊ฐ€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. AWS Lambda์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋” ์‹ฌ์ธต์ ์œผ๋กœ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด, AWS Lambda๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ณด๋‹ค ์ƒ์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Architecture of AWS Lambda

๋žŒ๋‹ค์˜ ์•„ํ‚คํ…์ณ๋Š” ๋ธ”๋ž™๋ฐ•์Šค๋กœ ์ทจ๊ธ‰๋˜์—ˆ์œผ๋‚˜ ์ตœ๊ทผ AWS์—์„œ Security Overview of AWS Lambda๋ผ๋Š” ๋ฐฑ์„œ๋ฅผ ํ†ตํ•ด ๊ทธ ๋ชจ์Šต์ด ๊ฝค ์ƒ์„ธํ•˜๊ฒŒ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ 2018๋…„ ์ดํ›„ AWS Fargate์™€ Lamdba์— ์ ์šฉ๋œ Firecracker ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๋…ผ๋ฌธ(Firecracker: Lightweight Virtualization for Serverless Applications)์„ ํ†ตํ•ด Lambda์˜ ๋Œ€๋žต์ ์ธ ๋ชจ์Šต์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฌธ์„œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Daniel๊ณผ Pedro๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ Lambda์˜ ์•„ํ‚คํ…์ณ ๊ทธ๋ฆผ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.
D. Barcelona-Pons, P. Garc ฬฤฑa-Lo ฬpez, Benchmarking Parrelism in FasS Platforms (2020)
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ๊ณต๋ถ€ํ•ด๋ณด์‹  ๋ถ„๋“ค์—๊ฒŒ๋Š” ๊ฝค ์ต์ˆ™ํ•œ ๊ตฌ์กฐ์ผ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋žŒ๋‹ค๋Š” ํฌ๊ฒŒ Control Plane๊ณผ Data Plane์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. Control Plane์—์„œ๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜์˜ ์ƒ์„ฑ์ด๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ Management API(ex. CreateFunction, UpdateFunctionCode, PublishLayerVersion)๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์™€์˜ integration๋„ ์—ฌ๊ธฐ์—์„œ control plane์—์„œ ๊ด€๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
Data Plane์€ ์‹ค์ œ ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฆฌ๋ผ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์„ ํ•จ์ˆ˜ ํ˜ธ์ถœ(function invocation)์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ์š”, Data Plane์—์„œ๋Š” ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์š”์ฒญ์ด Load Balancer ํ˜น์€ Invoke Service๋ฅผ ๊ฑฐ์ณ Lambda Worker ์•ˆ์— Execution Environment(์‹คํ–‰ ํ™˜๊ฒฝ)์— ํ•จ์ˆ˜๊ฐ€ ํ• ๋‹น๋˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. Lambda Worker๋Š” ๋ฒ ์–ด๋ฉ”ํƒˆ EC2 Nitro ์ธ์Šคํ„ด์Šค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์‹คํ–‰ ํ™˜๊ฒฝ์€ ์ด EC2 ์ธ์Šคํ„ด์Šค ์œ„์—์„œ Firecracker ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ hardware-vitualized microVM์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” ์‹ค์ œ์ ์œผ๋กœ๋Š” ์ด microVM ์œ„์—์„œ ์ž‘๋™์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ Lambda ๋ฌธ์„œ์—์„œ ์‹คํ–‰ ํ™˜๊ฒฝ์ด container ๊ธฐ๋ฐ˜์ด๋ผ๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค)
๊ทธ๋Ÿผ ์ด์ œ ์œ„ ์•„์ผ€ํ…์ณ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Lambda ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์š”์ฒญ, ์ฒ˜๋ฆฌ๋˜๋Š” ํ๋ฆ„์„ ๋”ฐ๋ผ ์กฐ๊ธˆ ๋” ์ƒ์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ•˜โ€ฆ ์ž๋ฃŒ ๋‹ค ๋งŒ๋“ค๊ณ  ํ•œ๊ตญ AWS Summit 2019์—์„œ ๋ฐœํ‘œ๋œ ์ž๋ฃŒ๋ฅผ ๋ฐœ๊ฒฌํ•˜์—ฌโ€ฆ ๋‚ด์šฉ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋‚ด์šฉ์„ ๊ฐ™๊ณ ์š”, ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์›Œ์ปค์— ํ• ๋‹นํ•˜๋Š” ๋ถ€๋ถ„์— ์žˆ์–ด์„œ ์‚ด์ง ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ์„ค๋ช…์ด ๋“ค์–ด๊ฐ”์Šต๋‹ˆ๋‹ค.
Front End Invoke: ๋™๊ธฐ, ๋น„๋™๊ธฐ ํ˜ธ์ถœ์„ ๋ชจ๋‘ ๊ด€์žฅํ•˜๋ฉฐ API call์„ ์ฒ˜์Œ ๋ฐ›์€ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ์„ธ๊ณ„์˜ ๋งŽ์€ ์œ ์ €๋“ค์ด ๋žŒ๋‹ค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ด๊ฒƒ์„ ๋ฐธ๋Ÿฐ์‹ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค
Counting Service: ์‚ฌ์šฉ์ž๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ API ์š”์ฒญ์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ œํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
Worker Manager: ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  API ์š”์ฒญ์„ ๊ฐ€์šฉ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ค‘๊ณ„
Placement Service: ์›Œ์ปค์— Sandbox ๊ตฌ์„ฑ์„ ์ž์› ํ™œ์šฉ๋ฅ ์ด ๋†’๊ณ , ๊ณ ๊ฐ ์„œ๋น„์Šค ์˜ํ–ฅ์ด ์—†๋„๋ก ๊ด€๋ฆฌ (์›Œ์ปค์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ)
Load Balancing
๊ณ ๊ฐ€์šฉ์„ฑ, ์„ฑ๋Šฅ์„ ์œ„ํ•ด Front End์™€ Worker Manager๋„ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ต๊ณผํ•œ ์š”์ฒญ์„ Front End์—์„œ ๋ฐ›๊ณ , Front End๋Š” Worker Manager์—๊ฒŒ ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Worker๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด ๋ฐ”๋กœ ํ• ๋‹นํ•˜๊ณ , ์—†๋‹ค๋ฉด Worker Manager๊ฐ€ ์ƒˆ๋กœ์šด Worker๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ํ›„์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ• ๋‹น ๋ฉ๋‹ˆ๋‹ค.

Invocation Types

Data Plane์—์„œ๋Š” ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์š”์ฒญ์ด Load Balancer ํ˜น์€ Invoke Service๋กœ ์ „๋‹ฌ๋œ๋‹ค๊ณ  ํ•œ ๋ฐ” ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Invoke API์— Requset-Response Mode์™€ Event Mode ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ๊ฐ ์•„๋ž˜ ๊ทธ๋ฆผ์˜ Sync Invocations์™€ Event Invocations์— ๋Œ€์‘ํ•ด์„œ ์ƒ๊ฐํ•ด์ฃผ์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
D. Barcelona-Pons, P. Garc ฬฤฑa-Lo ฬpez, Benchmarking Parrelism in FasS Platforms (2020)
Requset-Response Mode
์š”์ฒญ-์‘๋‹ต ๋ชจ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ(synchronously) ํ˜ธ์ถœํ•˜๊ณ  ์ฆ‰์‹œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ํŽ˜์ด๋กœ๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๊ฑฐ์ณ ๋ฐ”๋กœ Invoke Service๋กœ ๋ณด๋‚ด์ง€๋Š”๋ฐ์š”, ์ด๋•Œ Invoke Service๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ž ์‹œ ํ์— ๋„ฃ์–ด๋†“๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์žฌ์‹œ๋„ ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด๋กœ๋“œ๊ฐ€ invoke service์— ์ „๋‹ฌ์ด ๋˜๋ฉด, ๊ทธ๋•Œ invoke service๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ execution environment๋ฅผ ์ฐพ์•„ ์ด๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๋งˆ๋•…ํ•œ execution environment๊ฐ€ ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค)
Event Mode
์ด๋ฒคํŠธ ๋ชจ๋“œ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ(asynchronously) ํ˜ธ์ถœ๋˜์–ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ชจ๋“œ์—์„œ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ํ ๋ฉ๋‹ˆ๋‹ค(์ฐธ๊ณ ๋กœ ์ด๋•Œ Amazon SQS queue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ณต์œ  ํ์—์„œ ๋Œ€๊ธฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ˜ธ์ถœ ์†๋„, ์ด๋ฒคํŠธ ํฌ๊ธฐ ๋“ฑ์— ๋”ฐ๋ผ ์ „์šฉ ํ์— ํ• ๋‹น๋˜๊ฑฐ๋‚˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).
๋Œ€์ถฉ ์ด๋Ÿฐ ๋Š๋‚Œ?
ํ๋œ ์ด๋ฒคํŠธ๋Š” ๋žŒ๋‹ค์˜ poller fleet(ํ์—์„œ ์•„์ง ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์€ ๊ฒƒ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ EC2 ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน)์— ์˜ํ•ด ๋ฐฐ์น˜ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋˜๊ณ  invoke service์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ invoke service๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ๋ถˆ๊ฐ€ํ•œ ์ƒํƒœ๋ผ๋ฉด poller feet์—์„œ ์ธ๋ฉ”๋ชจ๋ฆฌ ํ˜•ํƒœ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๊ด€, ์žฌ์‹œ๋„๋ฅผ ์š”์ฒญํ•˜๊ณ , ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด๋ผ๋ฉด ํ• ๋‹น๋œ execution environment๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜์–ด ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์™„์ „ํžˆ ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋žŒ๋‹ค๋Š” ์ด๋ฅผ ๋ฒ„๋ฆฌ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ dead letter queue (DLQ) ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜๋ฆฌ ์‹คํŒจํ•œ ์ด๋ฒคํŠธ๋ฅผ Amazon SQS๋‚˜ Amazon SNS์— ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ธ๋“ค๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
Invocation Types with Examples
์œ„์—๋งŒ ๋ด์„œ๋Š” ์‹ค์ œ๋กœ๋Š” ๋ญ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์‚ฌ์‹ค ์ž˜ ๊ฐ์ด ์•ˆ ์˜ค์ฃ ? ์‹ค์ œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.
์šฐ์„  ๋™๊ธฐ์  ํ˜ธ์ถœ๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ Request-response ๋ชจ๋“œ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ด…์‹œ๋‹ค. ์œ„ ๋ฐฉ์‹์œผ๋กœ ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, ํ˜ธ์ถœ์ž๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์‘๋‹ต(response)๋ฅผ ๋ณด๋‚ผ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์— ๋Œ€ํ•œ ์„ธ๋ถ€ ๋‚ด์šฉ์€ ์‘๋‹ต์˜ ํ—ค๋”์™€ ๋ฐ”๋”” ์•ˆ์— ๋“ค์–ด์™€์„œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค(์ด๋Š” ๊ณง ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ณณ์—์„œ ์ง์ ‘ ์ด ์‘๋‹ต์„ ๋ถ„์„ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค)
๋žŒ๋‹ค ํ•จ์ˆ˜์˜ URL HTTP(S) ์—”๋“œํฌ์ธํŠธ, Lambda API, AWS CLI ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, ํ˜น์€ CloudFront, API GateWay, ELB์™€ ๊ฐ™์€ AWS ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—ฌ๊ธฐ์— ์†ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ๋น„๋™๊ธฐ์  ํ˜ธ์ถœ๊ณผ Event ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, ํ˜ธ์ถœ๋งŒ ๋˜์ ธ๋‘๊ณ  ๋”ฐ๋กœ ๋žŒ๋‹ค ํ•จ์ˆ˜์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜์ ธ์ง„ ์ด๋ฒคํŠธ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํ์— ๋„ฃ์–ด์กŒ๋‹ค๊ฐ€ ๋žŒ๋‹ค์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. S3๋‚˜, SNS, CloudWatch Logs๋‚˜ CodeCommit ๋“ฑ์˜ ์ด๋ฒคํŠธ๋กœ ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—ฌ๊ธฐ์— ์†ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์œ„ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ ์˜ˆ์‹œ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์‚ด์ง ์• ๋งคํ•œ ์ƒํ™ฉ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ Kinesis๋‚˜ SQS์™€ ๊ฐ™์€ ์ŠคํŠธ๋ฆผ์ด๋‚˜ ํ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์„œ๋น„์Šค๊ฐ€ ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ƒํ™ฉ, ์ฆ‰ Poll-Based Invoke ์ƒํ™ฉ์ธ๋ฐ์š”. ์ด๋•Œ ๋žŒ๋‹ค๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•ด์„œ ํด๋งํ•˜๊ณ , ๋ ˆ์ฝ”๋“œ๋ฅผ retireveํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ์ด๋ฒคํŠธ ์†Œ์Šค ๋งคํ•‘(Event Source Mapping)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ์†Œ์Šค ๋งคํ•‘์€ ํƒ€๊นƒ ์ด๋ฒคํŠธ ์†Œ์Šค์—์„œ ์•„์ดํ…œ์„ ์ฝ๊ณ , ๋ฐฐ์น˜ ํ˜•ํƒœ๋กœ ๋žŒ๋‹ค ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์น˜ ํฌ๊ธฐ๋Š” ๊ธฐ๋ณธ 1์ด์ง€๋งŒ, ์ด๋ฒคํŠธ ์†Œ์Šค์— ๋”ฐ๋ผ ์ตœ๋Œ€์ตœ์†Œ ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์ด๋ฒคํŠธ ๋ฐฐ์น˜(event batch)๊ฐ€ ๋žŒ๋‹ค ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋ฉฐ, ๋งŒ์•ฝ ํ•จ์ˆ˜์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚  ๊ฒฝ์šฐ ์ด ๋ฐฐ์น˜ ์ „์ฒด์— ๋Œ€ํ•ด ์žฌ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Execution Environment

์ง€๊ธˆ๊นŒ์ง€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ํŽ˜์ด๋กœ๋“œ๊ฐ€ Lambda Worker์—์„œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Lambda Worker
๋ณธ๊ฒฉ์ ์œผ๋กœ Execution Environment๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์•ž์„œ, ํ•ด๋‹น ํ™˜๊ฒฝ์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” Lambda Worker์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์•„ํ‚คํ…์ณ ํŒŒํŠธ์—์„œ invoke service๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ํŽ˜์ด๋กœ๋“œ๊ฐ€ lambda worker ์œ„์— ์žˆ๋Š” execution environment๋กœ ์ „๋‹ฌ๋œ๋‹ค๊ณ  ์„ค๋ช…ํ•œ ๋ฐ” ์žˆ์Šต๋‹ˆ๋‹ค. Lambda Woker๋Š” Amazon EC2 AWS Nitro ์ธ์Šคํ„ด์Šค์ด๊ณ , ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค ์œ„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ Micro Virtual Machine(MVM)์ด ๋Œ์•„๊ฐ€๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ€์ƒ ๋จธ์‹ ์€ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์„ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“  ๊ฐ€์ƒ๋จธ์‹  ์†Œํ”„ํŠธ์›จ์–ด(KVM)์ธ Firecracker๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
Security Overview of AWS Lambda AWS Whitepaper
์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ์ˆ ๋“ค์ด ์‚ฌ์šฉ๋˜์–ด ์œ ์ €๋“ค๋งˆ๋‹ค ๊ฒฉ๋ฆฌ๋œ ๊ณต๊ฐ„ ์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋žŒ๋‹ค๋ฅผ ์ข€ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค
โ€ข
Control groups (cgroups) โ€“ Used to constrain the function's access to CPU and memory. (๊ฐ ํ™˜๊ฒฝ์— ๋ฆฌ์†Œ์Šค ํ• ๋‹น)
โ€ข
Namespaces โ€“ Each execution environment runs in a dedicated namespace. We do this by having unique group process IDs, user IDs, network interfaces, and other resources managed by the Linux kernel.
โ€ข
seccomp-bpf โ€“ To limit the system calls (syscalls) that can be used from within the execution environment. (๋ณด์•ˆ ๊ด€๋ จ)
โ€ข
iptables and routing tables โ€“ To prevent ingress network communications and to isolate network connections between MVMs.
โ€ข
chroot โ€“ Provide scoped access to the underlying filesystem. (๋ฃจํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ๋…๋ฆฝ๋œ ๋ฃจํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณ„๋„์˜ ๊ณต๊ฐ„์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ)
โ€ข
Firecracker configuration โ€“ Used to rate limit block device and network device throughput.
โ€ข
Firecracker security features โ€“ For more information about Firecracker's current security design, refer to Firecracker's latest design document.
์ฐธ๊ณ ๋กœ ๋žŒ๋‹ค์—์„œ๋Š” ๊ฒฉ๋ฆฌ ๋ฐ ๋ณด์•ˆ์„ ์œ„ํ•ด /dev/shm (๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ์˜ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํŒŒ์ผ ์‹œ์Šคํ…œ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋žŒ๋‹ค ํ™˜๊ฒฝ์—์„œ Python Multiprocessing ๋ชจ๋“ˆ์—์„œ Pool์€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๋ฉฐ, chromium ์‚ฌ์šฉ์‹œ ์ผ์ • ๋ถ€๋ถ„ ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์›Œ์ปค์˜ ์ž„๋Œ€์‹œ๊ฐ„์€ ์ตœ๋Œ€ 14์‹œ๊ฐ„ ์ •๋„์ž…๋‹ˆ๋‹ค. ์›Œ์ปค๊ฐ€ ์ตœ๋Œ€ ์ž„๋Œ€ ์‹œ๊ฐ„์— ๋„๋‹ฌํ•˜๊ฑฐ๋‚˜, ๋” ์ด์ƒ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ• ๋‹น๋˜์ง€ ์•Š๊ฒŒ ๋˜๋ฉด Micro Virutual Machine์€ gracefulํ•˜๊ฒŒ ์ข…๋ฃŒ๋˜๊ณ  ์›Œ์ปค ์ธ์Šคํ„ด์Šค ๋˜ํ•œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
2014๋…„ ๋žŒ๋‹ค๊ฐ€ ์ฒ˜์Œ ๊ณต๊ฐœ๋˜์—ˆ์„ ๋•Œ๋Š” Firecracker๊ฐ€ ์•„๋‹Œ QEMU์™€ ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฉ๋ฆฌ, ๊ฐ€์ƒํ™”๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๊ฐ€์ƒ ๋จธ์‹  ์•ˆ์—์„œ๋Š” ์™„์ „ํ•œ ๊ฒฉ๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์ •๋‹น ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. (๋ณด์•ˆ๊ณผ ํšจ์œจ์„ฑ์˜ Trade-off) ํ•˜์ง€๋งŒ 2018๋…„ 12์›”๋ถ€ํ„ฐ KVM์€ ์œ ์ง€ํ•˜๋˜ ๊ทธ ์•ˆ์—์„œ ๋Œ์•„๊ฐ€๋Š” QEMU๋ฅผ Firecracker MicroVM์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ ํ•˜๋‚˜์˜ KVM ์•ˆ์—์„œ ๋‹ค๋ฅธ ๊ณ„์ •์˜ ๋žŒ๋‹ค ์‹คํ–‰ ํ™˜๊ฒฝ์ด ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๊ฒŒ๋” ๋ณ€๊ฒฝ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Rust๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹คโ€ฆ ๊ฐ„์ง€โ€ฆ
Firecracker ๋•๋ถ„์— ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ์—์„œ ์ˆ˜์ฒœ๊ฐœ์˜ VM์ด ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์„๋งŒํผ ๊ฐ€๋ณ๊ณ  ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
Execution Environment
์›Œ์ปค ์œ„์— ์ƒˆ๋กœ์šด ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•  ๋•Œ ์›Œ์ปค์— ์œ ์ €์˜ ํ•จ์ˆ˜ ์•„ํ‹ฐํŒฉํŠธ(zip์ด๋‚˜ ์ด๋ฏธ์ง€ ํ˜•์‹์œผ๋กœ ์˜ฌ๋ ธ์„ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ ์ตœ์ ํ™”๋œ ํ˜•ํƒœ์˜ ๊ฒƒ)์— ๋Œ€ํ•ด์„œ ์ž„์‹œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์‹คํ–‰ ํ™˜๊ฒฝ ์•ˆ์—์„œ ๋Ÿฐํƒ€์ž„์ด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ๋˜๊ณ , ๋žŒ๋‹ค ํ•จ์ˆ˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
์ƒ์„ฑ๋œ ์‹คํ–‰ ํ™˜๊ฒฝ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
Amazon Linux 2 ๊ธฐ๋ฐ˜์˜ (์ตœ์†Œํ•œ์˜) ๋ฆฌ๋ˆ…์Šค ์œ ์ € ์ŠคํŽ˜์ด์Šค
โ€ข
ํ•จ์ˆ˜ ์ฝ”๋“œ
โ€ข
AWS Lambda Layers
โ€ข
๋Ÿฐํƒ€์ž„ (ex. Go 1.X, Java 11, Node.js 12, Python 3.8, ์ปค์Šคํ…€)
โ€ข
์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ /tmp ๋””๋ ‰ํ† ๋ฆฌ
์ƒ์„ฑ๋œ ์‹คํ–‰ ํ™˜๊ฒฝ(์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ)์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(one concurrent invocation at a time). ์ด๋•Œ ์‚ฌ์šฉ๋œ ์‹คํ–‰ ํ™˜๊ฒฝ์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ํ˜น์€ ๊ฐ™์€ ํ•จ์ˆ˜์ด๋‚˜ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ํ•จ์ˆ˜๋Š” ์‹คํ–‰ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด์ „์— ์‹คํ–‰ ๋˜์—ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฒ„์ „์˜ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ๋Š” ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฒ˜์Œ ๋žŒ๋‹ค ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ํ™˜๊ฒฝ A๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด๋ด…์‹œ๋‹ค. ์‹คํ–‰ ํ™˜๊ฒฝ A์—์„œ ํ•จ์ˆ˜๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๋™์•ˆ ๋™์ผํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ•˜๋‚˜ ๋” ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด, ๋žŒ๋‹ค๋Š” ์ž๋™์œผ๋กœ ์‹คํ–‰ํ™˜๊ฒฝ B๋ฅผ ๋งŒ๋“ค์–ด ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‹คํ–‰ํ™˜๊ฒฝ A์—์„œ ์ž‘์—…์ด ๋๋‚ฌ๊ณ , B์—์„œ๋Š” ์•„์ง ์•ˆ ๋๋‚œ ์ƒํ™ฉ์—์„œ 3๋ฒˆ์งธ ํ˜ธ์ถœ์ด ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด ๋žŒ๋‹ค๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ A๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์œ ์˜ํ•  ๊ฒƒ์€ ๊ฐ™์€ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์žฌ์‚ฌ์šฉ ํ•  ๋•Œ ํ•ด๋‹น ํ™˜๊ฒฝ์—์„œ์˜ /tmp ํ˜น์€ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ(or ์ƒํƒœ)๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋‚จ์•„ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•จ์ˆ˜ ์‹คํ–‰์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์œ ์˜ํ•˜์—ฌ (ํŠนํžˆ ๊ฐ™์€ ์š”์ฒญ์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”) ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋™์ผํ•œ ์‹คํ–‰ ํ™˜๊ฒฝ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์ฒ˜๋ฆฌ(ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์„ ๋ชปํ•œ๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค)๋˜๊ธฐ ๋•Œ๋ฌธ์— Java์˜ static state์™€ ๊ฐ™์ด process-wideํ•œ ์ƒํƒœ๋“ค์˜ ๊ฒฝ์šฐ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ์ง€๋‹Œ /tmp ํด๋” ์•ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋‚จ์•„ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•จ์ˆ˜ ์‹คํ–‰์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์ถฉ๋ถ„ํžˆ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์œ ์˜ํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋งํ•˜์ž๋ฉด ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํฐ ๋ฐ์ดํ„ฐ๋ฅผ /tmp์— ์ž„์‹œ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ ์บ์‹œ, long-lived connections๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋žŒ๋‹ค ํ•จ์ˆ˜์˜ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ AWS ์ธก์—์„œ ๊ฐ ์–ธ์–ด๋ณ„ ์—…๋ฐ์ดํŠธ ํ˜น์€ ๋ณด์•ˆ ํŒจ์น˜ ๋“ฑ์„ ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋“ค์€ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋žŒ๋‹ค์—์„œ ํŠน์ • ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋žŒ๋‹ค ํ•จ์ˆ˜ ์‹คํ–‰์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์•ก์…˜์„ ์ทจํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฉ”์ผ ๋“ฑ์„ ํ†ตํ•ด ์•Œ๋ฆผ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

Deep Dive 1 - Cold Start

์„œ๋ฒ„๋ฆฌ์Šค ํ˜น์€ ๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ๊ฒช๊ฒŒ๋˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋žŒ๋‹ค๋Š” EC2์ฒ˜๋Ÿผ 24์‹œ๊ฐ„ ๋‚ด๋‚ด ์„œ๋ฒ„๊ฐ€ ์„ธํŒ…๋˜์–ด ๋Œ์•„๊ฐ€์ง€ ์•Š๊ณ , ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ž ์‹œ ๋นŒ๋ฆฌ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ผ์ • ์‹œ๊ฐ„์ด ๋˜๋ฉด ๋„์›Œ์กŒ๋˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ , ์šฐ๋ฆฌ๋Š” ๋‹ค์‹œ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋Œ๋ ค์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
์•ž์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋“ค์–ด์˜ค๋ฉด, ํ•จ์ˆ˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ์›Œ์ปค์—์„œ ์ƒˆ๋กœ์šด microVM์„ ๋„์šฐ๊ณ , ์‚ฌ์šฉ์ž์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด ๋ฐ›๋Š” ๋“ฑ์˜ ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ์„ ํ–‰๋œ๋‹ค๊ณ  ์„ค๋ช…ํ•œ ๋ฐ” ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ๋‹ค์‹œ ๋งํ•ด ์‚ฌ์šฉ์ž๋Š” AWS๊ฐ€ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์ค„ ๋•Œ๊นŒ์ง€ ์ž ์‹œ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ดˆ๊ธฐํ™” ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์„ ํ†ต์ƒ ์ฝœ๋“œ ์Šคํƒ€ํŠธ(cold start)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์— ์ง€์—ฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•˜๊ณ , 15๋ถ„ ๋‚ด์— ํ•จ์ˆ˜๋ฅผ ๋‹ค ๋Œ๋ฆฌ์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
์ฝœ๋“œ ์Šคํƒ€ํŠธ๋ผ๋Š” ๊ฒƒ์€ ์„œ๋น„์Šค ๋กœ์ง ์ƒ ํ•„์—ฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋Š” ๋ฐฉ๋ฒ• ํ˜น์€ ์‹คํ–‰ ํ™˜๊ฒฝ์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š๋„๋ก ๊ณ„์† ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ๋„์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์šฐ์„  ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…์‹œ๋‹ค.
โ€ข
๊ฐ€์žฅ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์€ ์ปดํ“จํŒ… ํŒŒ์›Œ๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ, ์ฆ‰ ๋” ์ข‹์€ CPU๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋žŒ๋‹ค์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ๋น„๋ก€ํ•˜์—ฌ CPU๊ฐ€ ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•จ์œผ๋กœ์จ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋‹ค๋งŒ ๋น„์šฉ ๋ฌธ์ œ์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค)
โ€ข
๋ฆฌํ”Œ๋ ‰์…˜์„ ๋˜๋„๋ก ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ž๋ฐ”์™€ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ(์ž๋ฐ” ์–ธ์–ด๋ฅผ ์œ„ํ•œ ORM ํ”„๋ ˆ์ž„์›Œํฌ)์˜ ๊ฒฝ์šฐ ๋ฆฌํ”Œ๋ ‰์…˜์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ๋„ statefulํ•œ ๊ฒƒ๋“ค์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋˜๋„๋ก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜น์€ ํŒŒ์ด์ฌ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
โ—ฆ
์ž๋ฐ”์˜ ๊ฒฝ์šฐ .jar ํŒŒ์ผ๋“ค์„ ๋ณ„๋„์˜ /lib ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค
โ€ข
๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋ฐ›๋Š” ์‹œ๊ฐ„์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์šด๋ฐ›์„ ํŒจํ‚ค์ง€์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ž„์œผ๋กœ์จ ์†๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ์ฝœ๋“œ ์Šคํƒ€ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋ฏธ ๋žŒ๋‹ค์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์–ด๋Š์ •๋„ ๊ตฌ์ถ•ํ•ด๋†“๋Š” ๋ฐฉ๋ฒ•, ์ฆ‰ ์›œ ์Šคํƒ€ํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์ž…๋‹ˆ๋‹ค.
โ€ข
๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์†์ ์œผ๋กœ ๋žŒ๋‹ค ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ
โ—ฆ
(๋žŒ๋‹ค ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋กœ์ง์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฑฐ๋‚˜ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ ๋ถˆ๊ฐ€)
โ—ฆ
CloudWatch๋ฅผ ํ†ตํ•ด ๋žŒ๋‹ค๋ฅผ 5๋ถ„์— ํ•œ ๋ฒˆ์”ฉ ํ˜ธ์ถœํ•ด์ฃผ๊ธฐ
โ—ฆ
Route53 health check๋ฅผ ๋žŒ๋‹ค ํ•จ์ˆ˜ API Gateway Endpoint๋กœ ์„ค์ •ํ•˜๊ธฐ
โ—ฆ
๊ธฐํƒ€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉํ•˜๊ธฐ (์˜ˆ์‹œ)
โ€ข
์ „์—ญ ๋ณ€์ˆ˜, /tmp ํด๋” ์‚ฌ์šฉํ•˜๊ธฐ
โ—ฆ
์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ, ์‹คํ–‰ํ™˜๊ฒฝ์—์„œ /tmp ํด๋”์™€ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ์‹คํ–‰ ํ™˜๊ฒฝ์— ๋‚จ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ตœ์ดˆ์˜ ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์™ธ์—๋Š” ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰
โ—ฆ
ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ์–ด๋–ค ํ˜ธ์ถœ์ด ์ด ์‹คํ–‰ ํ™˜๊ฒฝ ์•ˆ์—์„œ ์‹คํ–‰๋  ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์œ ์˜
โ€ข
ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ(Provisioned Concurrency) ์‚ฌ์šฉ
โ—ฆ
๋ฏธ๋ฆฌ ํ”„๋กœ๋น„์ €๋‹๋œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์˜ˆ์•ฝํ•ด๋‘๋Š” ๊ธฐ๋Šฅ. ์„ค์ •ํ•œ ์ˆ˜๋งŒํผ ๋ฏธ๋ฆฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด๋‘๊ณ  ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๊ณ , ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœ์„ธ์Šค ์ƒ๋žต ํ›„ ๋ฐ”๋กœ ์ฝ”๋“œ ์‹คํ–‰
โ—ฆ
์ด๋Š” ๊ณง ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ์ผœ๋‘๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์—†๋”๋ผ๋„ ๋น„์šฉ ์ฒญ๊ตฌ ๋จ
AWS X-Ray๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ํ”„๋กœ๋น„์ €๋‹๋˜๊ณ  ๋Œ์•„๊ฐ€๋Š” ๊ณผ์ •์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ„์„ํ•˜์—ฌ ์ดˆ๊ธฐํ™” ๊ณผ์ •์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์‹ค ์ œ๊ฐ€ ๋žŒ๋‹ค๋ฅผ ๋”ฅํ•˜๊ฒŒ ์จ๋ณด์ง„ ์•Š์•„์„œ ์ฝœ๋“œ ์Šคํƒ€ํŠธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‹ฌ๊ฐํ•œ์ง€ ์ฒด๊ฐ์ด ์ž˜ ์•ˆ ๋˜๊ธด ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ์•ฝ 300ms ์•ˆ์œผ๋กœ ๋‚˜์˜จ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ์‹ค์ œ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋„ค์š” (์‹คํ—˜๊ณผ ์„œ๋น„์Šค๋Š” ๋˜ ๋งŽ์ด ๋‹ค๋ฅด๋‹ˆ๊นŒ์š”)

Deep Dive 2 - Concurrency and Auto Scaling

๋™์ผํ•œ ์š”์ฒญ(ex. ๊ฐ‘์ž๊ธฐ ํŠธ๋ž˜ํ”ฝ์ด ๊ธ‰์ฆํ•˜์—ฌ API Gateway๋ฅผ ํ†ตํ•ด ์ˆ˜๋งŽ์€ (๋™์ผํ•œ )ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ํ•œ ์‹คํ–‰ ํ™˜๊ฒฝ ์•ˆ์—์„œ ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ๋‹ค ๋Œ์•„๊ฐ€๊ธฐ๋„ ์ „์— ์ˆ˜๋งŽ์€ ํ˜ธ์ถœ์ด ๋™์‹œ์— ์˜ค๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ๋žŒ๋‹ค๋Š” ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ๋“ค์„ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๋งŒํผ ์ฒ˜๋ฆฌ ํ™˜๊ฒฝ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž๋™์œผ๋กœ ๋„์›Œ์ค๋‹ˆ๋‹ค.
์ฐธ๊ณ ๋กœ ํ•„์š”ํ•œ ๋™์‹œ์„ฑ์„ ๊ณ„์‚ฐ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Concurrency = (average requests per second) * (average request duration in seconds)
Plain Text
๋ณต์‚ฌ

Auto Scaling (in the view of AWS)

๋žŒ๋‹ค ์•„ํ‚คํ…์ณ์˜ ๊ด€์ ์—์„œ ์˜คํ†  ์Šค์ผ€์ผ๋ง์ด ์ด๋ฃจ์–ด์ง€๋Š” ํ๋ฆ„์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์œ„์—์„œ ์–ธ๊ธ‰ํ•˜์˜€๋“ฏ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ†ต๊ณผํ•œ ์š”์ฒญ์„ Front End์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋•Œ Front End๋Š” Worker๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐ”์œ์ง€, ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋” ํ• ๋‹นํ•ด๋„ ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ Placement์—๊ฒŒ์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค. Placement๊ฐ€ ์ ํ•ฉํ•œ ์›Œ์ปค์˜ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ๊ฒŒ ๋˜๋ฉด, Worker Manager๋Š” ํ•ด๋‹น ์›Œ์ปค์— ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ• ๋‹นํ•˜๊ณ  ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์›Œ์ปค๋ฅผ ๋„์›Œ ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ •๋ณด๋ฅผ ํš๋“ํ•œ Manager์—๊ฒŒ ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Worker๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
Placement๋Š” ํ˜„์žฌ ์›Œ์ปค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์›Œ์ปค์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๊ณ  ๋ฆฌํ„ดํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๋˜ํ•œ placement์—์„œ ๋‹ด๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Function Scaling with Concurrency limit

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์˜คํ†  ์Šค์ผ€์ผ๋ง์œผ๋กœ ์–ด๋””๊นŒ์ง€ ๋™์‹œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์†๋„๋กœ ์˜คํ†  ์Šค์ผ€์ผ๋ง์ด ์ง„ํ–‰๋ ๊นŒ์š”?
Concurrency Limit
์šฐ์„  ๋™์‹œ์„ฑ ํ•œ๋„(Concurrency limit)๋Š” ์–ผ๋งˆ๋งŒํผ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€์— ๋Œ€ํ•œ ์ œํ•œ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ํ•œ๋„๋ฅผ ๋„˜์–ด์„œ๋Š” ํ•จ์ˆ˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ๋žŒ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์š”์ฒญ ์‚ญ์ œ๋ฅผ ํ•˜๋Š” ๋“ฑ ์“ฐ๋กœํ‹€๋ง์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ํ•œ๋„๋Š” ๊ณ„์ • ์•ˆ์—์„œ ๊ณต์œ ๋˜๋ฉฐ, ๊ธฐ๋ณธ 1000๊ฐœ๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค(๋” ํ•„์š”ํ•˜๋ฉด AWS์— ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ)
Burst Concurrency
๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ํŠธ๋ž˜ํ”ฝ ๋ฒ„์ŠคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ์ด๋ฅผ ์Šค๋ฌด์Šคํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ(Burst Concurrency)์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์งง์€ ์‹œ๊ฐ„ ์•ˆ์— ๋™์‹œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์Šค์ผ€์ผ ์—…์ด ๋˜๋Š”, ๋ง ๊ทธ๋Œ€๋กœ ๋ฒ„์ŠคํŠธํ•˜๊ฒŒ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด์ฃ . ์œ„ ๊ทธ๋ฆผ์—์„œ๋„ Burst limit์ด๋ผ๊ณ  ์ ํ˜€์žˆ๋Š” ๊ณณ๊นŒ์ง€๋Š” ๋น ๋ฅด๊ฒŒ function instance๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์ด ๋ณด์ด์‹ค ๊ฒ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ burst limit์ด๋ผ๋Š” ๋‹จ์–ด์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ, ๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ์—๋„ ํ•œ๋„๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ์ด๋Š” ์˜ค๋ฒ„ ์Šค์ผ€์ผ๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ ํ•œ๋„๋Š” ๋ฆฌ์ „๋ณ„๋กœ ๋‹ค๋ฅด์ง€๋งŒ ์ตœ๋Œ€ 500~3000๊ฐœ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
๋ฆฌ์ „
๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ ํ•œ๋„
๋ฏธ๊ตญ ์„œ๋ถ€(์˜ค๋ ˆ๊ณค), ๋ฏธ๊ตญ ๋™๋ถ€(๋ฒ„์ง€๋‹ˆ์•„ ๋ถ๋ถ€), ์œ ๋Ÿฝ(์•„์ผ๋žœ๋“œ)
3,000
์•„์‹œ์•„ ํƒœํ‰์–‘(๋„์ฟ„), ์œ ๋Ÿฝ(ํ”„๋ž‘ํฌํ‘ธ๋ฅดํŠธ), ๋ฏธ๊ตญ ๋™๋ถ€(์˜คํ•˜์ด์˜ค)
1,000
๊ธฐํƒ€ ๋ชจ๋“  ๋ฆฌ์ „
500
์ด๋•Œ ๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ ํ•œ๋„๋ผ๋Š” ๊ฐœ๋…์€ ํ•œ ๋ฒˆ์— ์ถฉ์ „ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ตœ์ดˆ์˜ ๋ฒ„์ŠคํŠธ๊ฐ€ ์ง„ํ–‰๋œ ์ดํ›„์— ๊ณ„์† ์š”์ฒญ์ด ๋Œ€๋Ÿ‰์œผ๋กœ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ์€ 1๋ถ„์— 500๊ฐœ์”ฉ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„์œผ๋กœ ๋น„์œ ํ•˜์ž๋ฉด ๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ ํ•œ๋„๊ฐ€ ์ตœ๋Œ€ MP ์ˆ˜์น˜์ด๊ณ , 1๋ถ„์— ํ•œ ๋ฒˆ MP๊ฐ€ 500์”ฉ ํšŒ๋ณต๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ gif๋Š” ๋™์‹œ์„ฑ ํ•œ๋„๊ฐ€ 10000, ๋ฒ„์ŠคํŠธ ํ•œ๋„๊ฐ€ 3000์ด๋ฉฐ, 09:00์— 2000๊ฐœ์˜ ๋ฒ„์ŠคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ดํ›„์— ๊ณผ์ •์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
Throttling
๋งŒ์•ฝ ๋™์‹œ์„ฑ ํ•œ๋„๋ณด๋‹ค ๋งŽ์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ, ๋™์‹œ์„ฑ ํ•œ๋„๋Š” ์•„์ง ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์š”์ฒญ ์ฆ๊ฐ€์˜ ์†๋„๊ฐ€ ๋™์‹œ์„ฑ ์šฉ๋Ÿ‰(concurrency capacity) ์†๋„๋ฅผ ๋„˜์„ ๊ฒฝ์šฐ ์“ฐ๋กœํ‹€๋ง์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์•ž์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ์˜ ์ž‘์—…์ด ๋๋‚˜๋Š”๋Œ€๋กœ, ํ˜น์€ 1๋ถ„ ํ›„ burst quota๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋Œ€๋กœ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค
Provisioned Concurrency
ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ(Provisioned Concurrency)์€ ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด, ๋ฏธ๋ฆฌ ์ดˆ๊ธฐํ™”๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ค€๋น„์‹œ์ผœ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ๋ฐ”๋กœ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋น„์œ ํ•˜์ž๋ฉด ์‹๋‹น์— ํ•ด์‹ ํƒ• ๋‹จ์ฒด ์ฃผ๋ฌธ์„ ๋ฏธ๋ฆฌ ๋„ฃ์–ด๋‘๋Š” ๊ฒƒ์ด์ฃ . ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝœ๋“œ ์Šคํƒ€ํŠธ๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ ์„œ๋น„์Šค์˜ ๋ ˆ์ดํ„ด์‹œ๋ฅผ ์ค„์ด๊ณ , ์ผ๊ด€๋œ ๋ ˆ์ดํ„ด์‹œ๋กœ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹จ, ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ์„ ๊ตฌ์„ฑํ–ˆ๋‹ค๊ณ  ๋ฐ”๋กœ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. 1~2๋ถ„ ์ •๋„์˜ ์ค€๋น„ ์‹œ๊ฐ„์ด ์žˆ์€ ํ›„์— ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ ํ• ๋‹น์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ๊ณผ ์—ฐ๊ณ„ํ•ด์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์šฐ์„  ๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ ํ•œ๋„๋งŒํผ(์ตœ๋Œ€ 3000) ๋จผ์ € ํ”„๋กœ๋น„์ €๋‹๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋„์›Œ์ ธ์„œ ํ•จ์ˆ˜๋ฅผ ์ž‘๋™์‹œํ‚ค๊ณ , 1๋ถ„๋งˆ๋‹ค 500๊ฐœ์˜ ์ƒˆ๋กœ์šด ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ ์œ ๋‹›์ด ์ถฉ์ „๋˜์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ณ„์ • ๋™์‹œ์„ฑ ํ•œ๋„๊ฐ€ 10000, ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ์ด 5000, ๋ฒ„์ŠคํŠธ ๋™์‹œ์„ฑ ํ•œ๋„๊ฐ€ 3000์ธ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.
10:00-10:01๋™์•ˆ 3000๊ฐœ์˜ ๋ฒ„์ŠคํŠธ ํ•œ๋„๋งŒํผ ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ์ด ํ• ๋‹น๋˜๊ณ , ์ดํ›„์— ํ”„๋กœ๋น„์ €๋‹ ๋™์‹œ์„ฑ ํ•œ๋„์ธ 5000๊ฐœ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ 1๋ถ„์— 500๊ฐœ์˜ ์ถ”๊ฐ€ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ”„๋กœ๋น„์ €๋‹ ๋ฉ๋‹ˆ๋‹ค.
Reserved Concurrency
๋™์‹œ์„ฑ ์ œํ•œ์€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ณ„์ • ๋ณ„๋กœ ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ง์€ ํ•จ์ˆ˜ A๊ฐ€ ๋™์‹œ์„ฑ 1000๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ B๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์„ฑ์ด ์—†๋‹ค๋Š” ๋ง์ด์ฃ . ์‚ฌ์†Œํ•œ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค ๋กœ์ง์— ์“ฐ๋กœํ‹€๋ง์ด ๊ฑธ๋ฆด ์ˆ˜๋„ ์žˆ๋Š” ์ด ์ƒํ™ฉ์„ ์˜ˆ์•ฝ๋œ ๋™์‹œ์„ฑ(Reserved Concurrency) ๊ธฐ๋Šฅ์œผ๋กœ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ์•ฝ๋œ ๋™์‹œ์„ฑ์€ ๋ง ๊ทธ๋Œ€๋กœ ํ•œ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์„ฑ์— ์ฟผํ„ฐ๋ฅผ ๊ฑธ์–ด๋‘˜ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์˜ค๋ Œ์ง€์™€ ๋ธ”๋ฃจ์— ๊ฐ๊ฐ 400๊ฐœ์”ฉ์˜ ์˜ˆ์•ฝ๋œ ๋™์‹œ์„ฑ์„ ๊ฑธ์–ด๋‘๋ฉด ๊ทธ๋งŒํผ์˜ ๋™์‹œ์„ฑ ์‹คํ–‰์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. unreaserved์—์„œ ํ•œ๋„(200)์„ ๋„˜์–ด์„  ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•ด๋„ ๋” ์ด์ƒ์˜ ๋™์‹œ์„ฑ์„ ํ• ๋‹น๋ฐ›์ง€ ๋ชปํ•˜๊ณ , ์“ฐ๋กœํ‹€๋ง์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ์•ฝ๋œ ๋™์‹œ์„ฑ์€ ์ค‘์š”ํ•œ ํ•จ์ˆ˜์˜ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅํ•ด์ฃผ๊ธฐ๋„ ํ•˜์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ๊ทธ ์™ธ์˜ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์„ฑ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด๊ธฐ๋„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์นซํ•˜๋ฉด ๋™์‹œ์„ฑ์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ์˜ˆ์•ฝ์„ ๋„ˆ๋ฌด ๋„‰๋„‰ํ•˜๊ฒŒ ์žก์•„๋‘๋ฉด ์˜คํžˆ๋ ค ๋น„ํšจ์œจ์„ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ ์ ˆํ•œ ์ˆ˜์˜ ์˜ˆ์•ฝ๋œ ๋™์‹œ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ์•ฝ๋œ ๋™์‹œ์„ฑ์€ ๋ง ๊ทธ๋Œ€๋กœ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋™์‹œ์„ฑ์˜ ํ•œ๋„๋ฅผ ๊ฑธ์–ด๋‘๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์š”๊ธˆ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ๊ณผ ์˜ˆ์•ฝ๋œ ๋™์‹œ์„ฑ์„ ํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ 200๊ฐœ์˜ ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ๋Š” ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์—†์ด ๋ฐ”๋กœ ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ดํ›„ 201~400๊ฐœ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š” ์ฝœ๋“œ ์Šคํƒ€ํŠธ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•˜๋ฉฐ ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
400๊ฐœ์˜ ์˜ˆ์•ฝ๋œ ๋™์‹œ์„ฑ ํ•œ๋„์— ๋‹ค๋‹ค๋ฅผ ๊ฒฝ์šฐ, ๋žŒ๋‹ค๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ๋” ์ด์ƒ ์Šค์ผ€์ผ ์•„์›ƒํ•˜์ง€ ๋ชปํ•˜๋ฉฐ ์ถ”๊ฐ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์“ฐ๋กœํ‹€๋ง์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์š”์ฒญ์ด ์ค„๊ณ  ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด์„œ ๋‹ค์‹œ ๋žŒ๋‹ค๊ฐ€ ์š”์ฒญ์— ๋งž์ถฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ t5 ์‹œ์ ์—์„œ๋Š” ๋™์‹œ ์š”์ฒญ์ด ํ”„๋กœ๋น„์ €๋‹๋œ ๋™์‹œ์„ฑ ํ•œ๋„๋ณด๋‹ค ๋” ์ ๊ฒŒ ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ฝœํŠธ ์Šคํƒ€ํŠธ ์ง€์—ฐ์‹œ๊ฐ„ ์—†์ด ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋‹ค๋ฃจ๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ํ•˜์ง€ ๋ชปํ•œ ์ด์•ผ๊ธฐ

SAM ํ…œํ”Œ๋ฆฟ๊ณผ CloudFormation
VPC๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

์ฐธ๊ณ  ์ž๋ฃŒ