AWS ์‹œ์ž‘ํ•˜๊ธฐ - ๊ธฐ๋ณธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•

2022. 4. 3. 18:06ใ†Amazon Web Service

https://aws.amazon.com/ko/getting-started/hands-on/build-web-app-s3-lambda-api-gateway-dynamodb/

 

AWS์—์„œ ๊ธฐ๋ณธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•

์•„๋ž˜์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์ด ์ž์Šต์„œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค์™€ ๊ทธ ์—ฐ๊ฒฐ ๋ฐฉ์‹์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ๋ณด๋“ฏ์ด ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ AWS Amplify, Amazon API Gateway, AWS Lambda ๋ฐ Amazon DynamoDB๋ฅผ ์‚ฌ

aws.amazon.com

์ „์ฒด์ ์ธ ์•„ํ‚คํ…์ฒ˜

 

1. ๊ธฐ๋ณธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•

โ˜‘๏ธ ์š”์•ฝ: AWS Amplify ์ฝ˜์†”์„ ํ†ตํ•ด ์›น ์•ฑ์„ ์œ„ํ•œ ์ •์  ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ

๐Ÿซฃ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์šฉ์–ด ์ •๋ฆฌ

๋”๋ณด๊ธฐ

์ •์  ์›น๊ณผ ๋™์  ์›น์˜ ์ฐจ์ด

์ •์  ์›น ์‚ฌ์ดํŠธ: ์ด๋ฏธ ๊ธฐ์กด์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” html ๋ฌธ์„œ๋ฅผ ๋ณ€๊ฒฝ ์—†์ด ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ค€๋‹ค.

example

<!DOCTYPE html>
<html>
<head>
    <title>test page</title>
</head>
<body>
    <h3>Test page</h3><hr>
    <p>Hello, new page!</p>
</body>
</html>

๋™์  ์›น ์‚ฌ์ดํŠธ: ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„ ํ•ญ๋ชฉ๋“ค์„ ์ ์šฉํ•œ html ๋ฌธ์„œ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

์ดํ•ดํ•˜๊ธฐ ์ข‹์€ ๋ธ”๋กœ๊ทธ ๊ธ€

<๋™์  ์›น ์‚ฌ์ดํŠธ ์ข…๋ฅ˜>
- Client Side Rendering(CSR):
ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ HTML์„ ์™„์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•. ์„œ๋ฒ„๋Š” json ํŒŒ์ผ๋งŒ ์ „์†ก. ๋ด‡ ํฌ๋กค๋Ÿฌ๋“ค์ด JS์„ ์ฝ์ง€ ๋ชปํ•ด์„œ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ.

- Server Side Rendering(SSR):
์„œ๋ฒ„ ์ชฝ์—์„œ ์ด๋ฏธ ์™„์„ฑ๋œ HTML์„ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ๋ฒ•. ์ƒˆ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ ๊ณ ์นจ.

- CSR + SSR
ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ Ajax ์š”์ฒญ -> ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ์ „์†ก -> HTML ์™„์„ฑ(์ด ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์กฐ๊ธˆ ์•„๋ฆฌ์†กํ•˜๋‹ค)

what is API?

๋™์˜์ƒ + ์„ค๋ช…์ด ๊ฐ™์ด ์žˆ๋Š” ์œ ์šฉํ•œ ๊ธ€

API๋Š” ์›จ์ดํ„ฐ๋‹ค.

๋‚˜๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ, ๋ ˆ์Šคํ† ๋ž‘์˜ ์†๋‹˜์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฉ”๋‰ด๋ฅผ ๊ณ ๋ฅผ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์†๋‹˜๋“ค์€ ์ง์ ‘ ์ผ์–ด๋‚˜์„œ ์ฃผ๋ฐฉ์— ์ฃผ๋ฌธ์„ ์ ‘์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ฃผ๋ฐฉ์—์„œ ์Œ์‹์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์—†๋‹ค. ๋‚ด๊ฐ€ ๊ฒฝ์Ÿ์‚ฌ ๋ ˆ์Šคํ† ๋ž‘์˜ ์‰ํ”„๋ผ๋ฉด ํ•ด๋‹น ์ฃผ๋ฐฉ์—์„œ ๋ ˆ์‹œํ”ผ๋ฅผ ํ›”์น  ์ˆ˜๋„ ์žˆ๊ณ , ์ผ๋ฐ˜์ธ์ด๋”๋ผ๋„ ๊ดœํžˆ ์ฃผ๋ฐฉ์—์„œ ์–ด๋ฌผ์ฉก๊ฑฐ๋ฆฌ๋ฉฐ ๋ฐฉํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.(๋‚˜๋Š” ์ฃผ๋ฐฉ์˜ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฅด๋‹ˆ๊นŒ!)

์ด๋•Œ ์šฐ๋ฆฌ๋Š” ์›จ์ดํ„ฐ๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์šฐ๋ฆฌ๋Š” ํŽธ์•ˆํžˆ ์•‰์•„์„œ ์ฃผ๋ฌธ์„ ํ•˜๊ณ , ์›จ์ดํ„ฐ๋Š” ๋ฐ›์€ ์ฃผ๋ฌธ์„ ์ฃผ๋ฐฉ์œผ๋กœ ๊ฐ€์ ธ๊ฐ„๋‹ค. ์Œ์‹์ด ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ์Œ์‹์„ ์šฐ๋ฆฌ์—๊ฒŒ ๋‹ค์‹œ ๊ฐ€์ ธ๋‹ค์ค€๋‹ค.

์ฆ‰, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ๋‹ค ์ž๊ธฐ ์ž๋ฆฌ์—์„œ ๊ฐ€๋งŒํžˆ ์žˆ๊ณ , ์›จ์ดํ„ฐ๋ผ๋Š” 'API'๋งŒ ์šฐ๋ฆฌ ๋‘˜ ์‚ฌ์ด๋ฅผ ์™”๋‹ค ๊ฐ”๋‹ค ํ•˜๋ฉฐ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ ์•„๊นŒ๋„ ๋งํ–ˆ๋“ฏ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฒฝ์Ÿ์‚ฌ ๋ ˆ์Šคํ† ๋ž‘ ์‰ํ”„๋ผ์„œ ์ฃผ๋ฐฉ์— ๋“ค์–ด์™€ ๋ ˆ์‹œํ”ผ๋ฅผ ํ›”์ณ๊ฐ€๊ณ  ์‹ถ์–ดํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋”๋”์šฑ API๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค. ์ •๋ง๋กœ ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ! ๊ทธ๊ฒƒ์€ API๋ฅผ ํ†ตํ•ด ์ •๋ณด(์šฐ๋ฆฌ์˜ ์˜ˆ์‹œ์—์„œ๋Š” ์Œ์‹)์„ ์ „๋‹ฌํ•˜๋Š” ํšŒ์‚ฌ ์ž…์žฅ์—์„œ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๋‹ค.

๊ทธ๋ž˜์„œ API๊ฐ€ ์ด๋ ‡๊ฒŒ ์œ ๋ช…, ์œ ๋งํ•œ ๊ฒƒ์ด๋‹ค!

 

1) index.html ์ƒ์„ฑ ๋’ค์— HTML ํŒŒ์ผ์„ ์••์ถ•ํ•ด ZIPํŒŒ์ผ๋กœ ๋งŒ๋“ค๊ธฐ

 

2) Amplify ์ฝ˜์†” ๋กœ๊ทธ์ธ

 

3) Amplify Hosting - ์›น ์•ฑ ํ˜ธ์ŠคํŒ… ์‹œ์ž‘ํ•˜๊ธฐ

4) 'Git ๊ณต๊ธ‰์ž ์—†์ด ๋ฐฐํฌ' -> ์•„๊นŒ ๋งŒ๋“ค์–ด ๋‘” zip ํŒŒ์ผ ์—…๋กœ๋“œ

 

5) ์ฃผ์–ด์ง„ ๋„๋ฉ”์ธ์˜ ๋งํฌ๋กœ ๋“ค์–ด๊ฐ€๋ฉด 'Hello Word'! :D


2. ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜ ์ž‘์„ฑ(AWS Lambda)

โ˜‘๏ธ ์š”์•ฝ: Python์œผ๋กœ Lambdaํ•จ์ˆ˜ ์ž‘์„ฑ ํ›„ ํ…Œ์ŠคํŠธ

๐Ÿซฃ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์šฉ์–ด ์ •๋ฆฌ

๋”๋ณด๊ธฐ

Lambda ํ•จ์ˆ˜์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

Lambda ํ•จ์ˆ˜๋Š” '์˜จ๋””๋งจ๋“œ'๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋‹ค. ์ฆ‰, demand๊ฐ€ ์žˆ์–ด์•ผ ์‹คํ–‰๋œ๋‹ค.

๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” ํ‰์†Œ์—๋Š” ํœด์‹์„ ์ทจํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด, ๊ทธ์ œ์„œ์•ผ ์ผ์–ด๋‚˜์„œ ํ•จ์ˆ˜๊ฐ€ ์ผ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฐ ํŠน์ง•์€ ๋ช…ํ™•ํ•œ ์žฅ๋‹จ์ ์ด ์žˆ๋‹ค.

์žฅ์ ์€ ์š”๊ธˆ์ด ์ ๊ฒŒ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ. ๋ˆ„๊ตฐ๊ฐ€์˜ ์š”์ฒญ์ด ์žˆ์„๋•Œ๋งŒ ์ž‘๋™ํ•˜๋‹ˆ ๊ณ„์†ํ•ด์„œ ์ผœ์ ธ ์žˆ์–ด์•ผ ํ•˜๋Š” EC2 ์ธ์Šคํ„ด์Šค๋“ค๊ณผ ๋‹ค๋ฅด๋‹ค.

๋‹จ์ ์€ ์š”์ฒญ์ด ๋“ค์–ด์™€์•ผ ์ผœ์ง„๋‹ค๋Š” ๊ฒƒ. ๊ณ„์†ํ•ด์„œ ๋Œ€๊ธฐ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ฒŒ ์ผ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ์„œ๋ฒ„์™€ ๋‹ค๋ฅด๊ฒŒ ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” awakeํ•˜๋Š” ์‹œ๊ฐ„๊ณผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์„ ๋”ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— delay๊ฐ€ ์กฐ๊ธˆ ๋” ์žˆ๋‹ค. (ํ•˜์ง€๋งŒ ์—„์ฒญ๋‚œ.. ์„œ๋น„์Šค๊ฐ€ ์•„๋‹Œ ์ด์ƒ ํฌ๊ฒŒ ๋Š๊ปด์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ์ด๊ฑด ์ง์ ‘ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ง€ ์•Š์•„์„œ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๐Ÿ˜…)

1) Lamda ์ฝ˜์†” ๋กœ๊ทธ์ธ -> 'ํ•จ์ˆ˜ ์ƒ์„ฑ'

- ์ƒˆ๋กœ ์ž‘์„ฑ

- ํ•จ์ˆ˜ ์ด๋ฆ„: hello_world_func

- ๋Ÿฐํƒ€์ž„: Python 3.9

- ์•„ํ‚คํ…์ฒ˜: x86_64

๋”๋ณด๊ธฐ

์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋‘ ์ข…๋ฅ˜์ธ ์ด์œ .. ์„ ํƒ ๊ธฐ์ค€?

  • arm64 - AWS Graviton2 ํ”„๋กœ์„ธ์„œ์šฉ 64๋น„ํŠธ ARM ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค.
  • x86_64 - x86 ๊ธฐ๋ฐ˜ ํ”„๋กœ์„ธ์„œ์šฉ 64๋น„ํŠธ x86 ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์•„ํ‚คํ…์ฒ˜๋Š” x86_64์ž…๋‹ˆ๋‹ค.

arm64 ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋Š” x86 ๊ธฐ๋ฐ˜ CPU์—์„œ ์‹คํ–‰๋˜๋Š” ๋™๋“ฑํ•œ ํ•จ์ˆ˜์— ๋น„ํ•ด GB/s๋‹น ๋น„์šฉ์ด ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ํ•จ์ˆ˜๊ฐ€ x86 ๊ธฐ๋ฐ˜ CPU ๋ช…๋ น ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ ARM ๋ช…๋ น ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ์ข…์†์„ฑ์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜์—ฌ arm64 ์•„ํ‚คํ…์ฒ˜์šฉ ๋ฐฐํฌ ํŒจํ‚ค์ง€๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

-AWS์—์„œ ์Šฌ์ฉ cmd + c cmd + v

 

2) ํ•จ์ˆ˜ ์ฝ”๋“œ ์ž‘์„ฑ

์ž‘์„ฑํ•œ ๋’ค Deploy ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ์ฃผ๊ธฐ

# import the JSON utility package since we will be working with a JSON object
import json
# define the handler function that the Lambda service will use an entry point
def lambda_handler(event, context):
# extract values from the event object we got from the Lambda service
    name = event['firstName'] +' '+ event['lastName']
# return a properly formatted JSON object
    return {
    'statusCode': 200,
    'body': json.dumps('Hello from Lambda, ' + name)
    }

์ฝ”๋“œ์™€ ์ฃผ์„์„ ๋ณด๋ฉด์„œ ์ดํ•ดํ•œ ๋ฐ”๋กœ๋Š”,

lambda_handler๋ผ๋Š” ํ•จ์ˆ˜๋Š” event๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฐ›์„ ๊ฒƒ์ด๊ณ , ์ด event ์—๋Š” firstName์ด๋ผ๋Š” ์ธ์ž์™€ lastName์ด๋ผ๋Š” ์ธ์ž๊ฐ€ ์žˆ์–ด์„œ ํ•ด๋‹น ์ธ์ž์˜ ๊ฐ’์„ name์— ์ €์žฅ.

๊ทธ๋ฆฌ๊ณ  status code 200๊ณผ 'Hello from lambda (name)'์„ json ํ˜•ํƒœ๋กœ ๋ฆฌํ„ด!

 

3) ์ƒˆ๋กœ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜ Test ํ•ด๋ณด๊ธฐ

ํ•ด๋‹น ์ฝ”๋“œ ์œ„์˜ ์ฃผํ™ฉ์ƒ‰ ๋ฒ„ํŠผ 'Test'์„ ๋ˆ„๋ฅด๋ฉด 'ํ…Œ์ŠคํŠธ ์ด๋ฒคํŠธ ๊ตฌ์„ฑ'์ด๋ผ๋Š” ํ™”๋ฉด์ด ๋œฌ๋‹ค

์ด๋ฒคํŠธ ์ด๋ฆ„, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒคํŠธ Json์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์ž…๋ ฅํ•ด์ค€ ๋’ค์— ์ €์žฅ!

์ €์žฅ์„ ์™„๋ฃŒํ•œ ๋’ค์— ํŽ˜์ด์ง€ ์ƒ๋‹จ์—์„œ [์ฝ”๋“œ] ์˜†์— ์žˆ๋Š” [ํ…Œ์ŠคํŠธ]๋กœ ๋„˜์–ด๊ฐ€์„œ ํ…Œ์ŠคํŠธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด

์ด๋Ÿฐ์‹์œผ๋กœ return ๊ฐ’, ์‹œ๊ฐ„, ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์„ ๋ชจ๋‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค


3. ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋ฅผ ์›น ์•ฑ์— ์—ฐ๊ฒฐ

โ˜‘๏ธ ์š”์•ฝ: API Gateway์„ ํ†ตํ•ด API ์ƒ์„ฑ, HTTP ๋ฉ”์„œ๋“œ ์ •์˜, Lambdaํ•จ์ˆ˜ ํŠธ๋ฆฌ๊ฑฐ, Management Console์—์„œ API ํ…Œ์ŠคํŠธ

๐Ÿซฃ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์šฉ์–ด ์ •๋ฆฌ

๋”๋ณด๊ธฐ

what is RESTful API?

(ํ•ญ์ƒ ์ •ํ™•ํ•œ ์ •์˜๋ฅผ ๋ชจ๋ฅด๊ณ  ์ง€๋‚˜๊ฐ„.... ์ด ๊ธฐํšŒ๋ฅผ ํ†ตํ•ด ๋“œ๋””์–ด..)

IBM ์œ ํŠœ๋ธŒ ์˜์ƒ

REST API๋Š” ์ง€์ •๋œ ํ˜•์‹์— ๋งž์ถฐ์„œ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ!

CRUD(Create, Read, Update, Delete)๊ฐ€ REST API์—์„œ๋Š”

Create - POST

Read - GET

Update - PUT

Delete - DELETE

๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋Š” ๊ฒƒ.

๊ฒฐ๊ตญ REST API๋ผ๋Š” ์ง€์ •๋œ ํ˜•์‹ ํ‹€์˜ API์„ ํ†ตํ•ด ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์•„~ ์ด๋Ÿฐ๊ฑธ ์š”์ฒญํ•˜๊ตฌ๋‚˜~ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ณ  API์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์ฒ˜๋Ÿผ

์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋ฉฐ ์›ํ•˜๋Š” ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

1) API Gateway ์ฝ˜์†” -> ์ƒˆ REST API ์ƒ์„ฑ

- REST

- ์ƒˆ API; ์ตœ์ ํ™”๋œ ์—์ง€

2) ์ƒˆ ๋ฆฌ์†Œ์Šค ๋ฐ ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ

- ๋ฆฌ์†Œ์Šค > ์ž‘์—… > ๋ฉ”์„œ๋“œ ์ƒ์„ฑ > ๋“œ๋กญ ๋‹ค์šด์—์„œ POST ์„ ํƒ > Lambda ํ•จ์ˆ˜ ์„ ํƒ(์•„๊นŒ ๋งŒ๋“  ํ•จ์ˆ˜ ์ด๋ฆ„ ๊ธฐ์ž…. hello_world_func)

- ์ž‘์—… > CORS ํ™œ์„ฑํ™” > 'CORS ํ™œ์„ฑํ™” ๋ฐ ๊ธฐ์กด์˜ CORS ํ—ค๋” ๋Œ€์ฒด' ํด๋ฆญ

 

3) API ๋ฐฐํฌ

- ์ž‘์—… > API ๋ฐฐํฌ

- ๋ฐฐํฌ ์Šคํ…Œ์ด์ง€ > ์ƒˆ ์Šคํ…Œ์ด์ง€

- ๋‹จ๊ณ„ ์ด๋ฆ„; dev

- URL ํ˜ธ์ถœ ์˜†์— ์žˆ๋Š” URL ๋ณต์‚ฌํ•˜๊ณ  ์ €์žฅ(์ถ”ํ›„ ๋‹จ๊ณ„์— ํ•„์š”)

4) API ๊ฒ€์ฆ

- ๋ฆฌ์†Œ์Šค > POST ํด๋ฆญ > ๋ฒˆ๊ฐœ ๋ชจ์–‘ ์•„์ด์ฝ˜ ํด๋ฆญ

- ์š”์ฒญ ๋ณธ๋ฌธ์— ๋‚ด์šฉ ๊ธฐ์ž…, ํ…Œ์ŠคํŠธ ์‹คํ–‰

{
    "firstName":"Grace",
    "lastName":"Hopper"
}


4. ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

โ˜‘๏ธ ์š”์•ฝ: DynamoDB ํ…Œ์ด๋ธ” ์ƒ์„ฑ, IAM์œผ๋กœ ์—ญํ•  ๋ถ€์—ฌ, AWS SDK๋กœ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ

๐Ÿซฃ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์šฉ์–ด ์ •๋ฆฌ

๋”๋ณด๊ธฐ

Amazon DynamoDB

ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค. ์Šคํ‚ค๋งˆ ์ƒ์„ฑ ํ•„์š” ์—†์Œ.

๊ทœ๋ชจ์— ๊ด€๊ณ„ ์—†์ด ์ผ์ •ํ•œ ์„ฑ๋Šฅ ์ œ๊ณต. ์„œ๋ฒ„ ๊ด€๋ฆฌ ํ•„์š” ์—†์Œ.

API vs SDK(Software Development Kit)

SDK๋Š” ์˜์–ด ๋œป ๊ทธ๋Œ€๋กœ Development Kit์ด๋‹ค. ์ด๊ฒƒ์ €๊ฒƒ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋“ค์ด ํฌํ•จ๋œ ํ‚คํŠธ์ด๋‹ค.

์ฆ‰, API vs SDK๋ณด๋‹ค๋Š” SDK์•ˆ์— API๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— SDK (์—ฌ์ง‘ํ•ฉ) API ๊ฐ€ ๋งž๊ฒ ๋‹ค!

1) DynamoDB ํ…Œ์ด๋ธ” ์ƒ์„ฑ

- ํŒŒํ‹ฐ์…˜ ํ‚ค == ๊ธฐ๋ณธํ‚ค: ID

์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ํ…Œ์ด๋ธ”๋กœ ๋“ค์–ด๊ฐ€์„œ ์ถ”๊ฐ€์ •๋ณด ๋“œ๋ž๋‹ค์šด์—์„œ ARN ๋ณต์‚ฌ

 

2) IAM ์ •์ฑ… ์ƒ์„ฑ & ๋žŒ๋‹ค ํ•จ์ˆ˜์— ์ถ”๊ฐ€

- IAM ์„œ๋น„์Šค๋กœ ์ ‘์†. ์—ญํ• ์— ๋ณด๋ฉด ๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ ํ•จ์ˆ˜์™€ ๋™์ผํ•œ role์ด lamda๊ถŒํ•œ๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์—ฌ๊ธฐ๋กœ ์ ‘์†!

- ์ธ๋ผ์ธ ์ •์ฑ… ์ƒ์„ฑ: ๋งˆ์šฐ์Šค ์ปค์„œ๋กœ ํ‘œ์‹œํ•ด๋‘” ๊ณณ์— ๋ฐฉ๊ธˆ ๋ณต์‚ฌํ•œ ์ž์‹ ์˜ DB ARN์„ ๋„ฃ์–ด์ค€๋‹ค.

 

3) DynamoDB ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋„๋ก Lambda ํ•จ์ˆ˜ ๊ตฌ์„ฑ ์ˆ˜์ •

๋‹ค์‹œ ๋žŒ๋‹ค ํ•จ์ˆ˜๋กœ ๋Œ์•„์™€์„œ ์ฝ”๋“œ ์†Œ์Šค๋ฅผ ์ˆ˜์ •!

- ์—ฌ๊ธฐ์„œ dynamodb.Table("๋ณธ์ธ์˜ํ…Œ์ด๋ธ”์ด๋ฆ„")์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

4) TEST

Deploy ์™„๋ฃŒํ•œ ํ•จ์ˆ˜๋ฅผ Testํ•ด๋ณธ๋‹ค!! ๋žŒ๋‹ค ํŽ˜์ด์ง€์—์„œ Test์„ ์™„๋ฃŒํ•œ ๋’ค์— ๋‹ค์‹œ DynamoDB๋กœ ๋Œ์•„์™€์„œ

ํ…Œ์ด๋ธ”์—์„œ ํ‘œ ํ•ญ๋ชฉ ํƒ์ƒ‰์„ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด ๋ฐฉ๊ธˆ testํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋“ค์–ด๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 


5. ๊ธฐ๋ณธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•

1) index.html ์ฝ”๋“œ ์ˆ˜์ •

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello World</title>
    <!-- Add some CSS to change client UI -->
    <style>
    body {
        background-color: #232F3E;
        }
    label, button {
        color: #FF9900;
        font-family: Arial, Helvetica, sans-serif;
        font-size: 20px;
        margin-left: 40px;
        }
     input {
        color: #232F3E;
        font-family: Arial, Helvetica, sans-serif;
        font-size: 20px;
        margin-left: 20px;
        }
    </style>
    <script>
        // define the callAPI function that takes a first name and last name as parameters
        var callAPI = (firstName,lastName)=>{
            // instantiate a headers object
            var myHeaders = new Headers();
            // add content type header to object
            myHeaders.append("Content-Type", "application/json");
            // using built in JSON utility package turn object to string and store in a variable
            var raw = JSON.stringify({"firstName":firstName,"lastName":lastName});
            // create a JSON object with parameters for API call and store in a variable
            var requestOptions = {
                method: 'POST',
                headers: myHeaders,
                body: raw,
                redirect: 'follow'
            };
            // ์•„๊นŒ 3๋ฒˆ์—์„œ API ์ƒ์„ฑ์‹œ ๋ณต์‚ฌํ•œ URL์„ ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค!!
            fetch("YOUR-API-INVOKE-URL", requestOptions)
            .then(response => response.text())
            .then(result => alert(JSON.parse(result).body))
            .catch(error => console.log('error', error));
        }
    </script>
</head>
<body>
    <form>
        <label>First Name :</label>
        <input type="text" id="fName">
        <label>Last Name :</label>
        <input type="text" id="lName">
        <!-- set button onClick method to call function we defined passing input values as parameters -->
        <button type="button" onclick="callAPI(document.getElementById('fName').value,document.getElementById('lName').value)">Call API</button>
    </form>
</body>
</html>

์ฝ”๋“œ์—์„œ fetch("YOUR-~") ์ด ๋ถ€๋ถ„์— ๋ฌธ์ž์—ด์„ 3๋ฒˆ ๋‹จ๊ณ„์—์„œ ๋ณต์‚ฌํ•ด๋‘๋ผ๊ณ  ํ–ˆ๋˜ ๋งํฌ๋กœ ๊ต์ฒดํ•ด์ค€๋‹ค.

 

์•„๊นŒ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ index.html์„ ์••์ถ•ํ•˜๊ณ , Amplify ์ฝ˜์†”์—์„œ ์ฝ”๋“œ ํŒŒ์ผ์„ ๊ต์ฒดํ•ด ์—…๋กœ๋“œํ•ด์ค€๋‹ค.

 

 

2) ๐Ÿ”ฅ COMPLETE!

๋„๋ฉ”์ธ์— ์ ‘์†ํ•˜๋ฉด ์ด๋Ÿฐ ๋ฉ‹์ง„ ํ™”๋ฉด์ด ๋œฌ๋‹ค!!

์ง์ง์ง

๋‚ด ์ด๋ฆ„์„ ๋„ฃ๊ณ  Call API ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด~

 

DynamoDB์— ๋ฐ”๋กœ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋”ฐ!

 

์ง์ง์งž์ง

 

 

(์ด์ œ ์š”๊ธˆ์ด ๊ฑฑ์ •๋˜๋‹ˆ๊นŒ ์‚ญ์ œํ•˜๋Ÿฌ ๊ฐ€์•ผ์ง€..)