๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

AWS

[AWS] API Gateway + Lambda + RDS(MySQL) ์—ฐ๊ฒฐ (2)

์ด์ „ ๊ธ€์— ์ด์–ด Lambda์™€ RDS๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

RDS๋กœ๋Š” MySQL์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

 

RDS

1. ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน ์„ค์ •

 

RDS ์ƒ์„ฑ ํ›„ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ™˜๊ฒฝ ์„ค์ • ์ž‘์—…์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

- ํƒ€์ž„์กด ์„ค์ •

- Character Set

- Max Connection

 

 

RDS > ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน > ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน ์ƒ์„ฑ

 

ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน ํŒจ๋ฐ€๋ฆฌ์—๋Š” RDB ์ƒ์„ฑ ์‹œ ์„ ํƒํ–ˆ๋˜ MySQL ๋ฒ„์ „์„ ์„ ํƒํ•œ๋‹ค.

 

์ƒ์„ฑ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน์„ ํด๋ฆญํ•˜๊ณ  ํŽธ์ง‘์„ ์„ ํƒํ•œ๋‹ค.

 

 

time_zone → Asia/Seoul

 

 

character_set_client, character_set_connection, character_set_database, character_set_filesystem, character_set_results, character_set_server → uft8mb4

 

collation_connection, collation_server  utf8mb4_general_ci

๋”๋ณด๊ธฐ

์ฐธ๊ณ  : utf8mb4์™€ utf8์˜ ์ฐจ์ด

→ ์ด๋ชจ์ง€ ์ €์žฅ ๊ฐ€๋Šฅ ์—ฌ๋ถ€์ด๋‹ค. utf8mb4๋Š” ์ด๋ชจ์ง€๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

max_connection → ๊ธฐ๋ณธ (์ธ์Šคํ„ด์Šค ์‚ฌ์–‘์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ •ํ•ด์ง)

 

 

์ƒ์„ฑํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

 

RDS > ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค > ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค ์„ ํƒ > ์ˆ˜์ • > ์ถ”๊ฐ€ ๊ตฌ์„ฑ

 

DB ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน์„ default.mysql8.0์—์„œ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน์œผ๋กœ ๋ฐ”๊พผ๋‹ค.

 

 

์„œ๋น„์Šค๊ฐ€ ์šด์˜ ์ค‘์ธ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ฆ‰์‹œ ์ ์šฉ์„ ์„ ํƒํ•œ๋‹ค. ์ˆ˜์ • ์™„๋ฃŒ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์žฌ๋ถ€ํŒ…ํ•ด์ค€๋‹ค.

 

 

2. ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ •

 

๋กœ์ปฌ PC ๋ฐ EC2์—์„œ RDS์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด RDS์˜ ๋ณด์•ˆ ๊ทธ๋ฃน์— IP๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค > ์—ฐ๊ฒฐ ๋ฐ ๋ณด์•ˆ > VPC ๋ณด์•ˆ ๊ทธ๋ฃน

 

๋ณด์•ˆ ๊ทธ๋ฃน ์„ ํƒ > ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ ํŽธ์ง‘

์œ ํ˜•์—์„œ MYSQL/Aurora ์„ ํƒ ํ›„ ๋‚ด IP๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

 

 

IAM

IAM > ์—ญํ•  > ์—ญํ•  ์ƒ์„ฑ

 

AWS ์„œ๋น„์Šค, Lambda ์„ ํƒ

 

 

AWSLambdaVPCAccessExecutionRole ๊ถŒํ•œ ์ถ”๊ฐ€ ํ›„ ์ด๋ฆ„ ์ž…๋ ฅํ•˜๊ณ  ์—ญํ•  ์ƒ์„ฑ!

 

 

Lambda

1. Lambda ํ•จ์ˆ˜ ์ž‘์„ฑ

 

๋กœ์ปฌ์—์„œ lambda_function.py ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  zip ํŒŒ์ผ๋กœ ์••์ถ•ํ•ด์„œ ์—…๋กœ๋“œํ•  ๊ฒƒ์ด๋‹ค.

 

lambda_function.py

import sys
import logging
import pymysql
import json
import random


rds_host  = "RDS ์—”๋“œํฌ์ธํŠธ"
user_name = "Master ์‚ฌ์šฉ์ž ์ด๋ฆ„"
password = "Password"
db_name = "์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„"

logger = logging.getLogger()
logger.setLevel(logging.INFO)


try:
    conn = pymysql.connect(host=rds_host, user=user_name, passwd=password, db=db_name, connect_timeout=5)
except pymysql.MySQLError as e:
    logger.error("์—ฐ๊ฒฐ ์‹คํŒจ!")
    logger.error(e)
    sys.exit()

logger.info("์—ฐ๊ฒฐ ์„ฑ๊ณต!")


def lambda_handler(event, context):
    print(event)
    
    randnum = random.randrange(1,123)
    
    userid = "user_test" + str(randnum)
    url = event["body-json"]["url"]

    item_count = 0
    sql_string = f"insert into URLS (userid, url) values('{userid}', '{url}')"
    
    with conn.cursor() as cur:
        cur.execute("create table if not exists URLS ( userid varchar(20) PRIMARY KEY, url varchar(20) NOT NULL)")
        cur.execute(sql_string)
        conn.commit()

    return "Lambda+RDS ์„ฑ๊ณต!"

 

lambda_handler ํ•จ์ˆ˜ ์•ˆ์—์„œ printํ•œ event๋Š” CloudWatch ๋กœ๊ทธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

lambda_function.py ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ pip install --target [dir_name] pymysql --no-user ์ฝ”๋“œ๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅํ•œ๋‹ค.

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํด๋”๋“ค์ด ์ƒ๊ธฐ๋Š”๋ฐ, lambda_function.py ํŒŒ์ผ๊ณผ ํด๋”๋“ค์„ lambda_function.zip์œผ๋กœ ์••์ถ•ํ•œ๋‹ค. ์ด zip ํŒŒ์ผ์„ Lambda์— ์—…๋กœ๋“œํ•œ๋‹ค.

 

 

2. ์—ญํ•  ์ˆ˜์ •

 

๊ธฐ์กด ์—ญํ• ์„ AWSLambdaVPCAccessExecutionRole ๊ถŒํ•œ์ด ์žˆ๋Š” ์—ญํ• ๋กœ ๋ฐ”๊พผ๋‹ค.

 

 

3. VPC ์„ค์ •

 

๊ตฌ์„ฑ > VPC > ํŽธ์ง‘

 

VPC, ์„œ๋ธŒ๋„ท, VPC ๋ณด์•ˆ ๊ทธ๋ฃน์„ RDS์™€ ๋˜‘๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.

 

 

MySQL Workbench

๋กœ์ปฌ์— MySQL Workbench๋ฅผ ์„ค์น˜ํ•˜๊ณ  MySQL Connections์—์„œ RDS์™€ ์—ฐ๊ฒฐํ•œ๋‹ค.

 

 

Connection Name, Hostname(RDS ์—”๋“œํฌ์ธํŠธ), Username(Master ์‚ฌ์šฉ์ž ์ด๋ฆ„), Password(Master ์‚ฌ์šฉ์ž ์•”ํ˜ธ)๋ฅผ ์ž…๋ ฅํ•œ ํ›„ ์ ‘์†ํ•˜๋ฉด AWS์—์„œ RDS ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ์„ค์ •ํ•œ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ณด์ธ๋‹ค.

 

 

ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•ด๋ณด๋ฉด Postman์œผ๋กœ ๋ณด๋‚ธ POST ์š”์ฒญ์ด ์ž˜ ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!