Post

AWS Amplify

๐Ÿงญ Hitchhikers - AWS Architecture


๐ŸŒŸ 1. ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์š”์•ฝ

์•ฑ ๊ธฐ๋Šฅ:

  • ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ (์ธ์ฆ)
  • ์ผ์ • ๋“ฑ๋ก / ๋ณด๊ธฐ
  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„
  • ์œ ์ € ๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ
  • ๋งต ์—ฐ๋™
  • ์•Œ๋ฆผ ๊ธฐ๋Šฅ

๐Ÿš€ 2. ์‚ฌ์šฉํ•˜๋Š” AWS ์„œ๋น„์Šค (Amplify ๊ธฐ๋ฐ˜)

๊ธฐ๋ŠฅAWS์„œ๋น„์ŠคAmplify๋ชจ๋“ˆ
์ธ์ฆCognitoamplify add auth
๋ฐ์ดํ„ฐ์ €์žฅDynamoDBamplify add storage
๋ฐฑ์—”๋“œ๋กœ์งLambdaamplify add function
API ์—ฐ๋™API gatewayamplify add api
์ง€๋„ ๊ธฐ๋ŠฅAWS Location Service + MapLibreamplify add geo
ํŒŒ์ผ ์—…๋กœ๋“œS3amplify add storage
ํ˜ธ์ŠคํŒ…Amplify hostingamplify add hosting

๐Ÿ” 3. ์ธ์ฆ: Amplify + Cognito

โœ… ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

amplify add auth

โ€ข ์ด๋ฉ”์ผ ๊ธฐ๋ฐ˜ ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ

โ€ข Cognito User Pool ์ž๋™ ์ƒ์„ฑ

โ€ข ํ”„๋ก ํŠธ์—”๋“œ์— Auth ๋ชจ๋“ˆ๋กœ ๋ฐ”๋กœ ์—ฐ๋™ ๊ฐ€๋Šฅ

โœ… ํ”„๋ก ํŠธ ์ฝ”๋“œ ์˜ˆ์‹œ

1
2
3
4
5
6
7
8
9
import { Auth } from 'aws-amplify';

await Auth.signUp({
  username: 'gsl@example.com',
  password: 'Password123!',
  attributes: { email: 'gsl@example.com' }
});

await Auth.signIn('gsl@example.com', 'Password123!');

โœ… ์œ ์ € ๊ด€๋ฆฌ๋Š” ์–ด๋””์„œ?

โ€ข AWS Cognito ์ฝ˜์†” (๋˜๋Š” Admin API)์—์„œ ์œ ์ € ์กฐํšŒ/์‚ญ์ œ/๊ทธ๋ฃน ๊ด€๋ฆฌ


๐Ÿ› ๏ธ 4. ์ผ์ • ๋“ฑ๋ก/์œ ์ € ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: Lambda + DynamoDB ์—ฐ๋™

โœ… ์ „์ฒด ํ๋ฆ„

1
2
3
4
5
6
7
React/Vue App
   โ†“
API Gateway (REST)
   โ†“
Lambda Function
   โ†“
DynamoDB

โœ… Step-by-step ๊ตฌ์„ฑ

๐Ÿ“Œ 1) Lambda ํ•จ์ˆ˜ ์ถ”๊ฐ€

amplify add function

โ€ข ์˜ˆ: createScheduleFn

โ€ข Node.js ๊ธฐ๋ฐ˜ Lambda ์ƒ์„ฑ

โ€ข DynamoDB ์ ‘๊ทผ ๊ถŒํ•œ ๋ถ€์—ฌ (Yes)

๐Ÿ“Œ 2) DynamoDB ํ…Œ์ด๋ธ” ์ƒ์„ฑ

amplify add storage

โ€ข NoSQL (DynamoDB) ์„ ํƒ

โ€ข ์˜ˆ: ScheduleTable

โ€ข Partition Key: scheduleId

โ€ข IAM ๊ถŒํ•œ ์„ค์ • (Lambda์—์„œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ํ—ˆ์šฉ)

๐Ÿ“Œ 3) Lambda ์ฝ”๋“œ ์˜ˆ์‹œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
  const data = JSON.parse(event.body);

  const params = {
    TableName: process.env.STORAGE_SCHEDULETABLE_NAME,
    Item: {
      scheduleId: data.scheduleId,
      userId: data.userId,
      title: data.title,
      date: data.date,
    },
  };

  await docClient.put(params).promise();
  return {
    statusCode: 200,
    body: JSON.stringify({ message: 'Saved!' }),
  };
};

โš ๏ธ ํ™˜๊ฒฝ๋ณ€์ˆ˜ STORAGE_SCHEDULETABLE_NAME๋Š” Amplify๊ฐ€ ์ž๋™ ์„ค์ •

๐Ÿ“Œ 4) API Gateway ์—ฐ๊ฒฐ

amplify add api

  • REST API ์„ ํƒ
  • Lambda ์—ฐ๋™ : createSchedulefn
  • ์—”ํŠธ๋ฆฌํฌ์ธํŠธ : /schedule

๐ŸŒ 5. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ API ํ˜ธ์ถœ

1
2
3
4
5
6
7
8
9
10
import { API } from 'aws-amplify';

await API.post('scheduleAPI', '/schedule', {
  body: {
    scheduleId: '001',
    userId: 'gunsoo',
    title: 'Ride to Toronto',
    date: '2025-04-10'
  }
});

๐Ÿ“ฆ 6. ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์ œ์•ˆ ๋ฐ ์—ฐ๋™ ๋ฐฉ๋ฒ•

๊ธฐ๋Šฅ์„œ๋น„์Šค๊ตฌ์„ฑ๋ฐฉ๋ฒ•
ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—…๋กœ๋“œs3amplify add storage (Content) + Storage.put() ์‚ฌ์šฉ
์ง€๋„ ์—ฐ๋™AWS Location Serviceamplify add geo + MapLibre JS ์—ฐ๋™
ํ‘ธ์‹œ ์•Œ๋ฆผSNS ๋˜๋Š” FCMLambda + Firebase Admin SDK or SNS trigger
๊ถŒํ•œ ๊ตฌ๋ถ„Cognito ๊ทธ๋ฃนamplify update auth โ†’ ๊ทธ๋ฃน ์ƒ์„ฑ โ†’ ์œ ์ € ์—ญํ•  ๋ถ„๋ฆฌ

๐Ÿš€ 7. ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ

์ „์ฒด ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ:

amplify push

์ฝ”๋“œ + ์ธํ”„๋ผ ๋ชจ๋‘ Git์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

โ€ข /amplify/backend/ ์•„๋ž˜์— CloudFormation ๊ธฐ๋ฐ˜ ์„ค์ • ์ž๋™ ์ €์žฅ (IaC)


โœ… ์ตœ์ข… ๊ตฌ์กฐ ์ •๋ฆฌ (๋„์‹)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[React / Vue ์•ฑ]
       โ†“
   Amplify API (REST)
       โ†“
  Lambda Function (๋ฐฑ์—”๋“œ ๋กœ์ง)
       โ†“
   DynamoDB (๋ฐ์ดํ„ฐ ์ €์žฅ)

[Amplify Auth]
  โ†ณ Cognito (์œ ์ € ์ธ์ฆ / ๊ทธ๋ฃน ๊ด€๋ฆฌ)

[Amplify Storage]
  โ†ณ S3 (ํŒŒ์ผ ์—…๋กœ๋“œ)
  โ†ณ DynamoDB (NoSQL ์ €์žฅ์†Œ)

[์ง€๋„ ์—ฐ๋™]
  โ†ณ AWS Location Service (Geo)

[CI/CD]
  โ†ณ Amplify Hosting + GitHub ์—ฐ๋™

๐Ÿ ๊ฒฐ๋ก 

Gunsoo๋‹˜์˜ Hitchhikers ์•ฑ์— AWS Amplify๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด,

โœ… ์ธ์ฆ๋ถ€ํ„ฐ

โœ… ์„œ๋ฒ„๋ฆฌ์Šค ๋ฐฑ์—”๋“œ

โœ… ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ €์žฅ

โœ… ํŒŒ์ผ ๊ด€๋ฆฌ

โœ… ์ง€๋„ ๊ธฐ๋Šฅ

This post is licensed under CC BY 4.0 by the author.