Count visitors with Lambda

์ด๋ฒˆ ์žฅ์—์„  AWS ๋ฆฌ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐฉ๋ฌธ์ž ์ˆ˜ ์นด์šดํŠธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ด๋ฅผ ๋ฐฐํฌ ์ค‘์ธ ์ •์  ์›น ์ด๋ ฅ์„œ ํŽ˜์ด์ง€์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์ด ์‚ฌ์šฉ๋˜๋ฉฐ ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ๋“ค์ด ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ๋ฐฉ๋ฌธ์ž ์ˆ˜ ์นด์šดํŠธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ธฐ์ˆ 

  • AWS DynamoDB: ๋ฐฉ๋ฌธ์ž ์ˆ˜ ์ •๋ณด๋ฅผ ์ €์žฅ

  • AWS Lambda: ์œ ์ €๊ฐ€ ์ด๋ ฅ์„œ์— ์ ‘์†ํ•˜๋ฉด ๋ฐฉ๋ฌธ์ž ์ˆ˜ ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•จ

  • AWS API Gateway: ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ์˜ Trigger ์—ญํ• ์„ ํ•จ

  • Javascript: ์ด๋ ฅ์„œ์— ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์„ ๋ถˆ๋Ÿฌ์˜ด

AWS Dynamo DB

๋ชจ๋“  ๊ทœ๋ชจ์—์„œ 10๋ฐ€๋ฆฌ์ดˆ ๋ฏธ๋งŒ์˜ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋น ๋ฅด๊ณ  ์œ ์—ฐํ•œ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค

Dynamo DB๋Š” AWS์—์„œ ์ œ๊ณตํ•˜๋Š” NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. AWS ์ด์™ธ์—๋„ ๋งค์šฐ ๋‹ค์–‘ํ•œ ํด๋ผ์šฐ๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ Dynamo DB๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฉ๋ฌธ์ž ์ˆ˜ ์นด์šดํŠธ ๊ธฐ๋Šฅ์€ ๋น„๊ต์  ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋‹จ์ˆœํ•˜๋ฏ€๋กœ ๋ณ„๋„์˜ ์Šคํ‚ค๋งˆ ์ •์˜๊ฐ€ ํ•„์š”์—†๋Š” Dynamo DB๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„์ „ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Table(ํ…Œ์ด๋ธ”)

Dynamo DB๋Š” ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” JSON ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋ฏ€๋กœ Dynamo DB์˜ ์‘๋‹ต๊ฐ’์„ ๋‹ค๋ฃฐ ๋–ˆ ์ด ์ ์„ ์œ ๋…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Table ์ƒ์„ฑํ•˜๊ธฐ

Dynamo DB๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ํ‚ค-๊ฐ’์„ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Dynamo DB ์ฝ˜์†”๋กœ ์ด๋™ํ•˜์—ฌ ๋ฆฌ์ „ ์„ค์ •์„ ํ•˜๊ณ  Create table์„ ํ†ตํ•ด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ์ด๋ฆ„์€ ๋ณธ์ธ์ด ๊ตฌ๋ถ„์ง“๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ณธ ์˜ˆ์‹œ์—์„  resume_visitor๋กœ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Partition key๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋• ๊ธฐ๋ณธํ‚ค๋ฅผ ์ง€์ •ํ•ด์•ผํ•˜๋ฉฐ, ๊ธฐ๋ณธํ‚ค๋Š” ํ…Œ์ด๋ธ” ๊ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ๊ธฐ์ค€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Partition key๋Š” Dynamo DB๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ธฐ๋ณธํ‚ค ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ๋ณธ ์˜ˆ์‹œ์—์„  String ํ˜•ํƒœ์˜ stats๋ผ๋Š” ๊ธฐ๋ณธํ‚ค๋ฅผ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ

์ดํ›„ ๋ณ„๋‹ค๋ฅธ ์ถ”๊ฐ€ ์„ค์ •์—†์ด ์ƒ์„ฑํ•ด๋„๋˜์ง€๋งŒ ์ด๋ ฅ์„œ ํŽ˜์ด์ง€์˜ ์กฐํšŸ์ˆ˜๋Š” ๊ทธ๋ฆฌ ๋†’์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋ฏ€๋กœ ๊ณผ๊ธˆ ํ˜•ํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋น„์šฉ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„  Table settings์—์„œ Customize settings์„ ์„ ํƒํ•˜๊ณ  Read/write capacity settings์—์„œ On-demand๋ฅผ ์„ ํƒํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ Create table์„ ๋ˆŒ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ ๋‚˜๋ฉด ํ…Œ์ด๋ธ”์— ๋“ค์–ด๊ฐˆ ์š”์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์†Œ๋ฅผ Item์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ๋ชฉ๋ก์—์„œ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๋ˆŒ๋Ÿฌ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

Item ์ƒ์„ฑ ์œ„์น˜

์ดํ›„ ํ™”๋ฉด์—์„œ Actions -> Create item์ˆœ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์•„์ดํ…œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ™”๋ฉด์—์„œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ์‹œ ์„ค์ •ํ•œ Partition key์ธ stats ๋ณด์ด๊ณ  ์ดํ›„ ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™”๋ฉด์ด ๊ตฌ์„ฑ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ฅ์„œ ๋ฐฉ๋ฌธ์ž๋ฅผ ๊ธฐ๋กํ•ด์•ผํ•˜๋ฏ€๋กœ ๋‹ค์Œ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๊ฐ’์„ ๋„ฃ์–ด ์•„์ดํ…œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Attribute ์„ค์ •

stats์˜ Value์ธ views๋Š” ์ถ”๊ฐ€ํ•  ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Partition key์ƒ์„ฑ์‹œ String์œผ๋กœ ์„ค์ •ํ•˜์˜€์œผ๋ฏ€๋กœ ์ด๋Š” ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ดํ›„ Attribute name ํ•ญ๋ชฉ์œผ๋กœ count๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•ด๋‹น ํƒ€์ž…์€ Number๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. count์˜ value๋Š” 0์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ด๊ณณ์— ๋“ค์–ด๊ฐˆ ์ˆซ์ž๊ฐ€ ์กฐํšŸ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •์„ ๋งˆ์น˜๋ฉด Create item์„ ๋ˆŒ๋Ÿฌ ์•„์ดํ…œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

AWS Lambda

์„œ๋ฒ„ ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ๊ฑฑ์ • ์—†์ด ์ฝ”๋“œ ์‹คํ–‰

AWS Lambda๋Š” ์ด๋ฒคํŠธ ์ค‘์‹ฌ์˜ ์„œ๋ฒ„๋ฆฌ์Šค(Serverless) ์ปดํ“จํŒ… ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฆฌ์Šค๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์„œ๋ฒ„๊ฐ€ ์—†์ด ์‹คํ–‰๋จ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์„œ๋ฒ„๊ฐ€ ์—†์ด๋„ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” ์„œ๋ฒ„์— ๋Œ€ํ•œ ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š๊ณ  ์˜จ์ „ํžˆ ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์„œ๋ฒ„๋ฆฌ์Šค๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๋ณธ ๋„์ „ ๊ณผ์ œ๋Š” ์ด๋Ÿฌํ•œ Lambda๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Dynamo DB์— ์ €์žฅ๋œ ๋ฐฉ๋ฌธ์ž ์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์ด๋ ฅ์„œ์— ์ ‘๊ทผํ•˜๋ฉด API Gateway์—์„œ ์ƒ์„ฑํ•œ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์ด๋ฅผ ํŠธ๋ฆฌ๊ฑฐ๋กœํ•˜์—ฌ Lambda function์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰๋œ Lambda๋Š” Dynamo DB์—์„œ ์กฐํšŸ์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ  ์ด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Lambda ์ƒ์„ฑํ•˜๊ธฐ

Lambda๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•ด Lambda ์ฝ˜์†”๋กœ ์ด๋™ํ•˜๊ณ  Create function์„ ๋ˆŒ๋Ÿฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ™”๋ฉด์—์„œ Function name๊ณผ Runtime์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Runtime์€ ๋ณธ์ธ์ด ์ž์‹ ์žˆ๋Š” ์–ธ์–ด๋ผ๋ฉด ์–ด๋– ํ•œ ์–ธ์–ด๋ฅผ ์„ ํƒํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณธ ์˜ˆ์‹œ์—์„  Python 3.9๋ฅผ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Lambda ๊ธฐ๋ณธ ์ •๋ณด ์„ค์ •

๋‹ค์Œ์œผ๋กœ ๊ถŒํ•œ์„ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น Lambda function์€ Dynamo DB๋ฅผ ๋‹ค๋ฃจ๋ฏ€๋กœ ์ด์™€ ๊ด€๋ จ๋œ ์—ญํ• (Role)์„ ๋ถ€์—ฌํ•ด์•ผํ•˜๋ฉฐ ์šฐ์„ ์€ ๊ธฐ๋ณธ ์—ญํ• ์„ ๋ถ€์—ฌํ•œ ๋’ค, ํ•ด๋‹น ์—ญํ• ์— ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ฐ™์€ ํŽ˜์ด์ง€์˜ Change default execution role์˜ Execution role์—์„œ Create a new role with basic Lambda permissions ํ†ตํ•ด ๊ธฐ๋ณธ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ๊ธฐ๋ณธ ์—ญํ• ์€ ๋กœ๊ทธ์™€ ๊ด€๋ จ๋œ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์—ญํ• ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ™”๋ฉด์—์„œ Configuration์˜ Execution role์—์„œ Edit๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ํ•˜๋‹จ์˜ Existing role์„ ๋ณด๋ฉด View the <Lambda ํ•จ์ˆ˜ ์ด๋ฆ„> role on the IAM console. ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ IAM ์ฝ˜์†”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

Lambda ์—ญํ•  ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋‹ค์Œ ํ™”๋ฉด์˜ Permissions policies์˜ Add permissions๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด Create inline policy๋ฅผ ํ†ตํ•ด ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ •์ฑ…์€ JSON ํฌ๋งท์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ JSON ํฌ๋งท์„ ๋ˆŒ๋Ÿฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค

์œ„ ์ •์ฑ…์„ ์‚ฌ์šฉํ•  Lambda๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ Actions์— ์ตœ์†Œํ•œ์˜ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‹จ์˜ Resource์—์„  ํ•ด๋‹น ์ •์ฑ…์ด ์ž‘๋™ํ•  ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜์—ฌ ์ •์ฑ…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ Account_ID๋Š” ํ™”๋ฉด ์ƒ๋‹จ์˜ IAM_user@๊ณ„์ •๋ช… ํ˜•ํƒœ์˜ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฐ”๋กœ ์ถœ๋ ฅ๋˜๋ฉฐ ์—ฌ๊ธฐ์„œ -๋ฅผ ์ œ์™ธํ•œ 12๊ฐœ์˜ ์—ฐ์†๋œ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

์ดํ›„ Review policy๋ฅผ ๋ˆŒ๋Ÿฌ ๋‹ค์Œ ํ™”๋ฉด์—์„œ ํ•ด๋‹น ์ •์ฑ…์˜ ์ด๋ฆ„์„ ์„ค์ •ํ•˜๊ณ  Create policy๋ฅผ ๋ˆŒ๋Ÿฌ ์ƒ์„ฑํ•˜๊ณ  ์ƒˆ๋กญ๊ฒŒ ๋ฐ”๋€ ์—ญํ• ์„ Lambda function์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ญํ•  ๋ชฉ๋ก์„ ๊ฐฑ์‹ ํ•œ ๋’ค ์ ์šฉํ•  ์—ญํ• ์„ ์„ ํƒํ•˜๊ณ  save๋ฅผ ๋ˆŒ๋Ÿฌ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

AWS API Gateway

๋ชจ๋“  ๊ทœ๋ชจ์˜ API๋ฅผ ์ƒ์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ๋ณดํ˜ธ

API Gateway๋Š” AWS์—์„œ API์˜ ์ƒ์„ฑ, ๋ฐฐํฌ, ๊ด€๋ฆฌ, ๋ชจ๋‹ˆํ„ฐ๋ง ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. RESTful API์™€ WebSocket API๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ๋ณธ ์˜ˆ์‹œ์—์„  API Gateway์—์„œ Lambda function์˜ ํŠธ๋ฆฌ๊ฑฐ ์—ญํ• ์„ ํ•˜๋Š” RESTful API๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. Lambda ์ž์ฒด๋Š” ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ์ด๋Ÿฌํ•œ ์™ธ๋ถ€ ํŠธ๋ฆฌ๊ฑฐ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ ๊ณผ์ •

ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Lambda function ํ•จ์ˆ˜ ํŽ˜์ด์ง€์˜ Add trigger ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ๋กœ ์‚ฌ์šฉ ์„ ํƒ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋Š” ์ƒ๋‹นํžˆ ๋งŽ์ง€๋งŒ ๋ณธ ์˜ˆ์‹œ์—์„  API gateway๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ REST API๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋ฏ€๋กœ ํ•˜๋‹จ์—์„œ REST API๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Security ํ•ญ๋ชฉ์€ ๋ถˆํŠน์ • ๋‹ค์ˆ˜๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ณ„๋‹ค๋ฅธ ์„ค์ •์„ ํ•˜์ง€์•Š๋Š” Open์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

API Gateway์—์„œ ๊ด€๋ฆฌํ•˜๋Š” API๋Š” ์ƒ์„ฑ ํ˜น์€ ์ˆ˜์ • ์ดํ›„ ๊ฐฑ์‹ ๋œ API๋ฅผ ๋ฐฐํฌํ•ด์•ผ ์‚ฌ์šฉ์ž๋“ค์€ ์—…๋ฐ์ดํŠธ ๋œ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ•˜๋‹จ์˜ Deployment stage ํ•ญ๋ชฉ์€ ์ด๋Ÿฌํ•œ ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ์˜ˆ์‹œ์—์„  prod๋กœ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •

ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‹จ์˜ API endpoint๊ฐ€ ์—”๋“œํฌ์ธํŠธ๋กœ ์‚ฌ์šฉ๋  ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.

API ์—”๋“œํฌ์ธํŠธ ์ฃผ์†Œ

์•„์ง์€ Lambda function ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์†Œ๋กœ ์ด๋™ํ•˜๋ฉด ๋‹จ์ˆœํžˆ "Hello from Lambda!" ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” Lambda function ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ ์ž…๋ ฅ๋œ ๊ธฐ๋ณธ ์˜ˆ์‹œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ Dynamo DB์™€ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋„๋ก ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ํŽ˜์ด์ง€์—์„œ Code ํƒญ์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ์˜ˆ์‹œ๋Š” Lambda function ์ƒ์„ฑ ์‹œ ๋Ÿฐํƒ€์ž„์œผ๋กœ Python 3.9๋ฅผ ์„ ํƒํ–ˆ์œผ๋ฏ€๋กœ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ง€๋งŒ ๋ณธ ์˜ˆ์‹œ์—์„  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Lambda ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด Deploy ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Lambda๋ฅผ ๋ฐฐํฌํ•˜๋”๋ผ๋„ ์•„์ง ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์–ด ์ •์ƒ ์‹คํ–‰์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด API Gateway ์˜†์˜ API ์ด๋ฆ„์„ ๋ˆŒ๋Ÿฌ API ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

API ์ƒ์„ธ ์„ค์ •์„ ์œ„ํ•œ ๋ฒ„ํŠผ

๋‹ค์Œ ํ™”๋ฉด์—์„œ Actions -> Create Method ์ˆœ์œผ๋กœ ์ด๋™ํ•˜์—ฌ GET ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์šฐ์ธก์˜ Lambda Function ๋ž€์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•  Lambda ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

GET ๋ฉ”์†Œ๋“œ ์ƒ์„ฑํ•˜๊ธฐ

GET ๋ฉ”์†Œ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ ์ƒํƒœ์—์„œ API ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. API ๋ฐฐํฌ๋Š” Actions์˜ Deploy API์—์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

API ๋ฐฐํฌํ•˜๊ธฐ

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

๋ฉ”์†Œ๋“œ ํ…Œ์ŠคํŠธ

Javascript

์ƒ์„ฑํ•œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์›น ์ด๋ ฅ์„œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ HTML ์ฝ”๋“œ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ์•ฝ๊ฐ„ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ์˜ˆ์‹œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋ช…์€ view_count.js, HTML ํŒŒ์ผ๋ช…์€ index.html์ž…๋‹ˆ๋‹ค.

๋จผ์ € ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

GET ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด JSON ํ˜•ํƒœ๋กœ ์‘๋‹ต์ด ์ถœ๋ ฅ๋˜๋ฏ€๋กœ ์ด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด response.json์„ ์‚ฌ์šฉํ•˜๊ณ , ์‹ค์ œ ์กฐํšŒ์ˆ˜ ๋ถ€๋ถ„์€ body์— ์ถœ๋ ฅ๋˜๋ฏ€๋กœ ํ•ด๋‹น ๊ฐ’์„ HTML์˜ views๋กœ ๋„˜๊น๋‹ˆ๋‹ค.

HTML ์ฝ”๋“œ์—์„  view_count.js์—์„œ ๋ฐ›์€ views๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ์œ„์น˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  HTML์˜ head ์˜์—ญ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์ด ์ ์šฉ๋œ HTML, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ S3 ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•œ ๋’ค ์›น ์ด๋ ฅ์— ์ ‘๊ทผํ•ด๋ด…๋‹ˆ๋‹ค. ์ด๋ ฅ์„œ๋Š” ์ •์ƒ ์ถœ๋ ฅ๋˜์ง€๋งŒ, ์กฐํšŒ์ˆ˜ ๋ถ€๋ถ„์ด ์ž˜ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CORS ์˜ค๋ฅ˜ ๋ฐœ์ƒ

์ด ์ค‘ ๋ˆˆ์—ฌ๊ฒจ๋ด์•ผ ํ•  ๋ถ€๋ถ„์€ 'CORS'์ž…๋‹ˆ๋‹ค. CORS(Cross-Origin Resource Sharing)๋Š” API Gateway์—์„œ ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ ์‹œ์—๋„ ๊ด€๋ จ๋œ ์„ค์ •์ด ์žˆ์—ˆ์œผ๋ฉฐ, S3 ๋ฒ„ํ‚ท ์„ค์ •์—์„œ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ๊ฐ™์€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ˆ˜ํ–‰๋œ ์ž‘์—…์ด ์•„๋‹ˆ๋ผ๋ฉด ์ด๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” SOP(Same-Origin Policy)๊ฐ€ ์ ์šฉ๋˜์–ด์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„  ์™ธ๋ถ€ ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰๋œ ์ž‘์—…์—์„œ CORS ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ณธ ์˜ˆ์‹œ์—์„œ ์ œํ•œ๋˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์€ resume-en.yibyeongyong.com์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ fetch๋ฅผ ์‚ฌ์šฉํ•ด API Gateway ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ถˆ๋ €์„ ๋•Œ, Dynamo DB์˜ ์กฐํšŒ์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ์ œํ•œํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ ฅ์„œ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ฉด Dynamo DB์˜ ์กฐํšŒ์ˆ˜ ๊ฐ’์€ ๊ณ„์† ์ƒ์Šนํ•˜์ง€๋งŒ, ์ด ์ •๋ณด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถœ๋ ฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CORS์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ์„ค๋ช…์€ MDN Web Docs์™€ AWS Documentation์—์„œ ๋‹ค๋ฃจ๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์ƒ์ ์œผ๋กœ ์กฐํšŒ์ˆ˜๊ฐ€ ์ถœ๋ ฅ๋˜๋ ค๋ฉด Lambda function ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  API Gateway์˜ ๋ฉ”์†Œ๋“œ ๋ฐฐํฌ ๊ณผ์ •์—์„œ CORS๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Lambda function ์ฝ”๋“œ์˜ lambda_handler ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•˜๊ณ  ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด Lambda function์—์„œ ์œ„ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์‘๋‹ต ํ—ค๋”์— Access-Control-Allow-Origin ํ•ญ๋ชฉ์„ ์ด๋ ฅ์„œ ์ฃผ์†Œ๋ฅผ ๋‹ด์•„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ํ™•์ธํ•˜๊ณ  ์™ธ๋ถ€ ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰๋œ ์ž‘์—…์ž„์—๋„ ํ•ด๋‹น ์ž‘์—…์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ชจ๋“  ์ฃผ์†Œ๋Š” https://๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž‘์„ฑํ•ด์•ผ๋งŒ ์ •์ƒ์ ์œผ๋กœ CORS๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉ”์†Œ๋“œ ๋ฐฐํฌ ๊ณผ์ •์—์„œ Actions -> Enable CORS๋ฅผ ํ†ตํ•ด CORS๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. Access-Control-Allow-Origin ๋ถ€๋ถ„์€ Lambda function ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ด๋ ฅ์„œ URL์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ https://๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. CORS๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด OPTIONS ๋ฉ”์†Œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋„๋ก API๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

CORS ํ—ˆ์šฉํ•˜๊ธฐ

์ดํ›„ ๋” ์ด์ƒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์กฐํšŒ์ˆ˜๊ฐ€ ์ •์ƒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์กฐํšŒ์ˆ˜ ์ •์ƒ ์ถœ๋ ฅ.png

๋งบ์Œ๋ง

์ง€๊ธˆ๊นŒ์ง€ AWS Dynamo DB, Lambda, API Gateway ๊ทธ๋ฆฌ๊ณ  Javascript๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ด๋ ฅ์„œ์— ๋„ฃ์„ ์กฐํšŒ์ˆ˜ ์นด์šดํŠธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋ก , ์ฒ˜์Œ ์ด ๋„์ „ ๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•  ๋• ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์ด๋‹ˆ ๊ธˆ๋ฐฉ ๋๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฑฐ๋กœ ์ƒ๊ฐํ–ˆ์œผ๋‚˜, ๋ชจ๋“  ๋ถ€๋ถ„์„ AWS ๋ฆฌ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๊ฐ๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๊ณ , ์˜ค๋ฅ˜๋„ ์ž์ฃผ ๋ฐœ์ƒํ•ด ๋งŽ์€ ์–ด๋ ค์›€์„ ๋А๊ผˆ๋˜ ๋„์ „ ๊ณผ์ œ์˜€์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์žฅ์—์„  AWS CloudFormation๊ณผ SAM์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ˜์†”์„ ๊ฑฐ์น˜์ง€์•Š๊ณ  ์ฝ”๋“œ๋งŒ์œผ๋กœ AWS ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐํ•ด๋ณผ ์ 

  1. API Gateway์˜ ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ ๋ถ€๋ถ„์—์„œ ์ฒ˜์Œ์—” ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ •์ƒ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ GET ๋ฉ”์†Œ๋“œ๋ฅผ ํ•œ๋ฒˆ ์ƒ์„ฑํ•œ ํ›„ ๋‹ค์‹œ ์‚ญ์ œํ•˜๋”๋ผ๋„ body๋ถ€๋ถ„์€ ์ •์ƒ์ ์œผ๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

  2. Lambda function์˜ ํ˜ธ์ถœ ํšŸ์ˆ˜์— ์ œํ•œ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์กฐํšŒ์ˆ˜ ์ •๋ณด๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ƒ์Šนํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋น„์šฉ ๋˜ํ•œ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”?

Last updated