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๋ก ์์ํ๋ ๊ฑฐ๋ํ ์ด์ผ๊ธฐ