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์ด๋ผ ๋ถ๋ฆ
๋๋ค. ํ
์ด๋ธ ๋ชฉ๋ก์์ ํ
์ด๋ธ ์ด๋ฆ์ ๋๋ฌ ์ด๋ํฉ๋๋ค.

์ดํ ํ๋ฉด์์ Actions -> Create item์์ผ๋ก ์ด๋ํ์ฌ ์์ดํ
์ ์์ฑํฉ๋๋ค. ๋ค์ ํ๋ฉด์์ ํ
์ด๋ธ ์์ฑ์ ์ค์ ํ Partition key์ธ stats ๋ณด์ด๊ณ ์ดํ ๊ฐ์ ์ถ๊ฐํ ์ ์๋๋ก ํ๋ฉด์ด ๊ตฌ์ฑ๋์ด์์ต๋๋ค. ์ด๋ ฅ์ ๋ฐฉ๋ฌธ์๋ฅผ ๊ธฐ๋กํด์ผํ๋ฏ๋ก ๋ค์ ์์์ฒ๋ผ ๊ฐ์ ๋ฃ์ด ์์ดํ
์ ์์ฑํฉ๋๋ค.

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 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 ์ฝ์๋ก ์ด๋ํฉ๋๋ค.

๋ค์ ํ๋ฉด์ 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๊ฐ ์๋ํฌ์ธํธ๋ก ์ฌ์ฉ๋ ์ฃผ์์
๋๋ค.

์์ง์ Lambda function ๋ด์ฉ์ ์์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ฃผ์๋ก ์ด๋ํ๋ฉด ๋จ์ํ "Hello from Lambda!" ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ์ด๋ Lambda function ์์ฑ ์ ์๋์ผ๋ก ์ ๋ ฅ๋ ๊ธฐ๋ณธ ์์ ์ฝ๋๊ฐ ์คํ๋ ๊ฒ์ ๋๋ค. ํด๋น ์ฝ๋๋ฅผ ์์ ํ์ฌ Dynamo DB์ ์ํธ์์ฉ ํ๋๋ก ๋ง๋ค๊ฒ ์ต๋๋ค.
๊ฐ์ ํ์ด์ง์์ Code ํญ์ผ๋ก ์ด๋ํ๋ฉด ์ฝ๋๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ๋ณธ ์์๋ Lambda function ์์ฑ ์ ๋ฐํ์์ผ๋ก Python 3.9๋ฅผ ์ ํํ์ผ๋ฏ๋ก ํ์ด์ฌ ์ฝ๋๋ก ์์ฑํ๊ฒ ์ต๋๋ค. ์ฌ๋ฌ ๊ตฌํ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ๋ณธ ์์์์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค.
Lambda ์ฝ๋๋ฅผ ์์ฑํ๋ฉด Deploy ๋ฒํผ์ ๋๋ฌ ๋ฐฐํฌ๋ฅผ ์ํํฉ๋๋ค. Lambda๋ฅผ ๋ฐฐํฌํ๋๋ผ๋ ์์ง ๋ฉ์๋๊ฐ ์์ด ์ ์ ์คํ์ด ๋์ง ์์ต๋๋ค. ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด API Gateway ์์ API ์ด๋ฆ์ ๋๋ฌ API ์ค์ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.

๋ค์ ํ๋ฉด์์ Actions -> Create Method ์์ผ๋ก ์ด๋ํ์ฌ GET ๋ฉ์๋๋ฅผ ์์ฑํฉ๋๋ค. ์ดํ ์ฐ์ธก์ Lambda Function ๋์ ๋ฉ์๋๋ฅผ ์์ฑํ Lambda ํจ์ ์ด๋ฆ์ ์์ฑํฉ๋๋ค.

GET ๋ฉ์๋๊ฐ ์์ฑ๋ ์ํ์์ API ๋ฐฐํฌ๋ฅผ ์ํํฉ๋๋ค. API ๋ฐฐํฌ๋ Actions์ Deploy 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(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๋ฅผ ๋ฐฐํฌํฉ๋๋ค.

์ดํ ๋ ์ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ณ ์กฐํ์๊ฐ ์ ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค

๋งบ์๋ง
์ง๊ธ๊น์ง AWS Dynamo DB, Lambda, API Gateway ๊ทธ๋ฆฌ๊ณ Javascript๋ฅผ ํ์ฉํ์ฌ ์ด๋ ฅ์์ ๋ฃ์ ์กฐํ์ ์นด์ดํธ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก , ์ฒ์ ์ด ๋์ ๊ณผ์ ๋ฅผ ์์ํ ๋ ๋งค์ฐ ๊ฐ๋จํ ๊ธฐ๋ฅ์ด๋ ๊ธ๋ฐฉ ๋๋ผ ์ ์์ ๊ฑฐ๋ก ์๊ฐํ์ผ๋, ๋ชจ๋ ๋ถ๋ถ์ AWS ๋ฆฌ์์ค๋ฅผ ํ์ฉํ์ฌ ๊ตฌํํ๋ ๊ฒ์ด ์๊ฐ๋ณด๋ค ์๊ฐ์ด ๋ง์ด ์์๋๊ณ , ์ค๋ฅ๋ ์์ฃผ ๋ฐ์ํด ๋ง์ ์ด๋ ค์์ ๋๊ผ๋ ๋์ ๊ณผ์ ์์ต๋๋ค.
๋ค์ ์ฅ์์ AWS CloudFormation๊ณผ SAM์ ํ์ฉํ์ฌ ์ฝ์์ ๊ฑฐ์น์ง์๊ณ ์ฝ๋๋ง์ผ๋ก AWS ๋ฆฌ์์ค๋ฅผ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
์๊ฐํด๋ณผ ์
API Gateway์ ๋ฉ์๋ ์์ฑ ๋ถ๋ถ์์ ์ฒ์์ ๋ฉ์๋๊ฐ ์์ผ๋ฉด ์ ์์๋ํ์ง ์์์ง๋ง
GET๋ฉ์๋๋ฅผ ํ๋ฒ ์์ฑํ ํ ๋ค์ ์ญ์ ํ๋๋ผ๋body๋ถ๋ถ์ ์ ์์ ์ผ๋ก ๋ฆฌํดํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ์์ด ๋ฐ์ํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น์?Lambda function์ ํธ์ถ ํ์์ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ ์ ์์ ์ธ ์ฌ์ฉ์์ ์ํด ์กฐํ์ ์ ๋ณด๊ฐ ๋น์ ์์ ์ผ๋ก ์์นํ ์ ์์ผ๋ฉฐ ๋น์ฉ ๋ํ ๊ณผ๋ํ๊ฒ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ด ์์๊น์?
Last updated