๐Ÿ”ฅ TIL - Day 40

Kim Dae Hyunยท2021๋…„ 10์›” 28์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
48/93

๐Ÿ“Œ ์„œ๋ฒ„๋ฆฌ์Šค ?

์„œ๋ฒ„๋ฆฌ์Šค... ๋“ค์–ด๋Š” ๋ดค์ง€๋งŒ ๋”ฐ๋กœ ์ฐพ์•„๋ณธ ์ ์€ ์—†์—ˆ๋‹ค.
์ด๋ฆ„๋งŒ ๋“ค์—ˆ์„ ๋•Œ๋Š” ์„œ๋ฒ„๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜?? ์•„ํ‚คํ…์ณ?? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
(์ด๊ฑฐ ์•„๋‹ˆ๋‹ค.)

์„œ๋ฒ„๋ฆฌ์Šค๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
์„œ๋ฒ„๋Š” ์–ด๋”˜๊ฐ€์— ์žˆ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ ์„œ๋ฒ„์—์„œ ์‹คํ–‰์‹œํ‚ฌ ์ฝ”๋“œ๋งŒ ์˜ฌ๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

AWS๋Š” ์ด๋Ÿฐ ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ„ํ•ด ๋Œ€ํ‘œ์ ์œผ๋กœ Lambda๋ฅผ ์ง€์›ํ•œ๋‹ค.
Lambda๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„๋ฆฌ์Šค๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณด์ž.


๐Ÿ“Œ Lambda ํ•จ์ˆ˜ ์ƒ์„ฑ

ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ต์…˜์„ ์ง€์›ํ•œ๋‹ค. ์ฒ˜์Œ์ด๋‹ˆ๊นŒ ์ƒˆ๋กœ์ž‘์„ฑ ์˜ต์…˜์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
๋‹ค์Œ์œผ๋กœ ํ•จ์ˆ˜์ด๋ฆ„๊ณผ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ํ™˜๊ฒฝ์„ ์„ ํƒํ•œ๋‹ค.
๋‚˜๋Š” Flask ๊ธฐ๋ฐ˜ API๋ฅผ Lambda์—์„œ ๋Œ๋ ค์•ผ ํ•˜๋ฏ€๋กœ ํŒŒ์ด์ฌ ํ™˜๊ฒฝ์„ ์„ ํƒํ–ˆ๋‹ค.

์ƒ์„ฑํ•˜๋ฉด ์ฝ”๋“œํŽธ์ง‘๊ธฐ์— ํŒŒ์ด์ฌ ์˜ˆ์ œ์ฝ”๋“œ๊ฐ€ ๋ณด์ธ๋‹ค.


๋‚ด๊ฐ€ ํ•  ๊ฒƒ์€ Lambda์— Flask API๋ฅผ ์˜ฌ๋ฆฌ๊ณ  ํ•ด๋‹น API์— ์ ‘๊ทผํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.
API๋Š” ์–ด๋–ป๊ฒŒ๋“  ์˜ฌ๋ฆฌ๋ฉด ๋  ๊ฒƒ ๊ฐ™๊ณ  ์–ด๋””๋กœ ๋ฌด์Šจ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€๊ฐ€ ๋ฌธ์ œ๋‹ค.

Lambda๋Š” ๋”ฐ๋กœ ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ ์—”ํŠธํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—”ํŠธํฌ์ธํŠธ๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค. ์—”ํŠธํฌ์ธํŠธ์˜ ์—ญํ• ์€ API Gateway๊ฐ€ ์ˆ˜ํ–‰ํ•œ๋‹ค.

API Gateway๋Š” ํŠธ๋ฆฌ๊ฑฐ์—์„œ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค. Lambda ํ•จ์ˆ˜๋ฅผ ๋ฐœ๋™? ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์กฐ๊ฑด์ด ์žˆ๋Š”๋ฐ ๊ทธ ์ค‘ API Gateway์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŠธ๋ฆฌ๊ฑฐ๋กœ ๋“ฑ๋ก๋  API Gateway๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์œ ํ˜•์€ REST API๋กœ ํ•ด์คฌ๊ณ  ๋”ฐ๋กœ ์—”ํŠธํฌ์ธํŠธ ์ ‘๊ทผ์‹œ ๋ณด์•ˆ์„ค์ •์€ ํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค.

์ƒ์„ฑํ•˜๋ฉด API Gateway์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด์ œ ํ•ด๋‹น ์—”๋“œํฌ์ธํŠธ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์•ž์„œ ์˜ˆ์‹œ๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค.
์˜ˆ์ œ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด json์œผ๋กœ ์ƒํƒœ์ฝ”๋“œ์™€ Hello from Lambda! ๋ฅผ ๋ฆฌํ„ดํ•˜๋ฏ€๋กœ ์—”ํŠธํฌ์ธํŠธ๋กœ ์ ‘๊ทผํ•˜๋ฉด Hello from Lambda!๊ฐ€ ๋ณด์—ฌ์•ผ ํ•œ๋‹ค.

์ด์ œ API Gateway์˜ ์—”๋“œํฌ์ธํŠธ ํ†ตํ•ด Lambda ํ•จ์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.


๐Ÿ“Œ Lambda ํ•จ์ˆ˜์—์„œ RDS ์—ฐ๋™

API๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™๋˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํ‰๋ฒ”ํ•˜๊ณ  ๋นˆ๋ฒˆํ•œ ์ผ์ด๋‹ค.
๋•Œ๋ฌธ์— Lambda์—์„œ API๋ฅผ ๋Œ๋ฆด ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ DB๋ฅผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค.

์šฐ์„  ์—ฐ๋™์— ์•ž์„œ RDS๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค. DB์—”์ง„์€ MySQL์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

RDS ์ƒ์„ฑ์‹œ ์ฃผ์˜ํ•  ๊ฒƒ

  • ํผ๋ธ”๋ฆญ ์—‘์„ธ์Šค ํ’€์–ด๋‘๊ธฐ (ํ…Œ์ŠคํŠธ๋‹ˆ๊นŒ ~~)
  • ๋ณด์•ˆ๊ทธ๋ฃน ์ƒ์„ฑํ•˜๊ธฐ (3306 ์ธ๋ฐ”์šด๋“œ ์—ด์–ด์ฃผ๊ธฐ)

ํŒŒ์ด์ฐธ์„ ํด๋ผ์ด์–ธํŠธ ํˆด๋กœ ์ด์šฉํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์Šคํ‚ค๋งˆ, ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ฑํ•œ๋‹ค.

[ ์Šคํ‚ค๋งˆ ์ƒ์„ฑ ]
create schema test_schema DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

[ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ]
create table board (
    id int auto_increment,
    title vatchar(100) null,
    content text null,
    constraint board_id primary key (id)
);

์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธ API ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
DB ์ปค๋„ฅ์…˜์„ ๋ฐ›์•„์˜ค๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ title๊ณผ content๋ฅผ DB์— ์ €์žฅํ•˜๋Š” API์ด๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ Lambda์˜ ์ฝ”๋“œํŽธ์ง‘๊ธฐ์— ์˜ฎ๊ฒจ์ค˜๋„ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
์ง€๊ธˆ ์šฐ๋ฆฌ ์ฝ”๋“œ๋Š” DB์—ฐ๊ฒฐ์„ ์œ„ํ•ด pymysql ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ Lambda์—๋Š” ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํ•จ๊ป˜ ์˜ฌ๋ ค์ค˜์•ผ ํ•œ๋‹ค.

์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์ด S3์— ์žˆ๋Š” ํŒŒ์ผ์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ๊ณผ zip ํŒŒ์ผ์„ ์˜ฌ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์••์ถ•ํ•ด์„œ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ํ•ด๋ณด์ž.

import json
import pymysql

def db_ops():
    try:
        connection = pymysql.connect(
            host='RDSํ˜ธ์ŠคํŠธ',
            user='ID',
            password='PW',
            db='DB์ด๋ฆ„',
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor
        )

    except pymysql.MySQLError as e:
        print("connection error!!")
        return e

    print("connection ok!!")
    return connection


def lambda_handler(event, context):
    body = json.loads(event['body'])
    conn = db_ops()
    cursor = conn.cursor()
    cursor.execute("insert into board(title, content) value('" + body['title'] + "', '" + body['content'] + "')")
    conn.commit()

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "success",
        }),
    }

๋ณดํ†ต์˜ ๊ฒฝ์šฐ ๊ฐ€์ƒํ™˜๊ฒฝ(venv)์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ๋”ฐ๋กœ ํด๋”๋ฅผ ์ง€์ •ํ•ด์„œ ์„ค์น˜ํ•ด ์ค„ ๊ฒƒ์ด๋‹ค.

๋ฃจํŠธํด๋”์— ๋‘๊ณ  ์ „์ฒด๋ฅผ ์••์ถ•ํ•ด๋ฒ„๋ฆฌ๋ฉด Lambda์— ์—…๋กœ๋“œ์‹œ ์šฉ๋Ÿ‰์ด ๋„ˆ๋ฌด ํฌ๋‹ค๋Š” ์—๋Ÿฌ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฏธ ํŒŒ์ด์ฌ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ์€ Lambda์— ๊ตฌ์ถ•๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์‹คํ–‰์ฝ”๋“œ๋งŒ ์˜ฌ๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

pip install --target ./test pymysql

ํด๋”๊ฐ€ ํ•˜๋‚˜ ์ƒ์„ฑ๋˜๊ณ  ์•ˆ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋์„ ๊ฒƒ์ด๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œํŒŒ์ผ๋„ ์ด ํด๋” ์•ˆ์œผ๋กœ ์ด๋™ํ•ด์ค€๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

์ด์ œ test ํด๋”์˜ ํŒŒ์ผ๋“ค์„ ์••์ถ•ํ•œ๋‹ค.
test ํด๋”๋กœ ์ด๋™ํ•ด์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

zip -r test.zip ./*

-r: ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ ์••์ถ•

์••์ถ•์„ ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํด๋” ์•ˆ์— ์••์ถ•๋ณธ์ด ์ƒ์„ฑ๋œ๋‹ค.

์ด์ œ ์ด ์••์ถ•ํŒŒ์ผ์„ Lambda์— ์—…๋กœ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•˜๋ฉด ๋œ๋‹ค.

์—…๋กœ๋“œ๊ฐ€ ๋์œผ๋ฉด ์ด์ œ ํฌ์ŠคํŠธ๋งจ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž
๊ฒฐ๊ณผ๋Š” success !!

์ •๋ง ์„ฑ๊ณต์ด๋ผ๋ฉด DB์— ๊ฐ’์ด ์‚ฝ์ž…๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

GoooooooooooD



2์ฐจ ํ”„๋กœ์ ํŠธ์—์„œ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋กœ์ปฌ์—์„œ๋Š” ์ž˜ ๋˜๋‹ค๊ฐ€ EB์— ๋ฐฐํฌํ•˜๋ฉด ๋ง์ฝ์„ ๋ถ€๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ตฌ๊ธ€๋ง๊ณผ ํŠœํ„ฐ๋‹˜์˜ ๋„์›€์œผ๋กœ EB๋Š” ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์™œ?

EB๋Š” ๋™์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์กฐ์ •ํ•˜๋Š”๋ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋Š˜์–ด๋‚ฌ์„ ๋•Œ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ• ๊นŒ?? ๋‹ต์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ด๊ฒŒ ์ด์œ ๋‹ค .. ๋ฌผ๋ก  ๋ฐฉ๋ฒ•์€ ์žˆ๊ฒ ์ง€๋งŒ ๋ฐฉ๋ฒ•์— ๋ถˆ๊ณผํ•  ๋ฟ ์ตœ์„ ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๋•Œ ํŠœํ„ฐ๋‹˜์ด ๊ทธ๋Ÿฐ๊ฑฐ๋Š” Lambda์— ์˜ฌ๋ ค์„œ ๊ด€๋ฆฌํ•˜๋ฉด ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค. ๊ทธ๋•Œ๋Š” ํ”„๋กœ์ ํŠธ ๊ธฐํ•œ์„ ๋งž์ถ”๋Š” ๊ฒŒ ๊ธ‰ํ•ด์„œ ๊ทธ๋ƒฅ EC2์— ์˜ฌ๋ ค์„œ ์ง์ ‘ ๊ด€๋ฆฌํ–ˆ์ง€๋งŒ ์ด๋ฒˆ์— Lambda๋ฅผ ๋ฐฐ์šฐ๋‹ˆ ๋ฌด์Šจ ๋ง์ธ์ง€ ์กฐ๊ธˆ ์•Œ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

Lambda๋Š” ์š”์ฒญ์ด ์žˆ์„ ๋•Œ๋งŒ ๋น„์šฉ์ด ๋ถ€๊ณผ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋งค์ผ? ๋งค์ฃผ? ๋งค๋‹ฌ ์ด๋ ‡๊ฒŒ ์‹คํ–‰๋˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ์— ์•„์ฃผ ์ ํ•ฉํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. Lambda์—์„œ ์กฐ๊ธˆ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”๊ฒŒ ๋™์‹œ์„ฑ ๋ฌธ์ œ? ์ธ ๊ฒƒ ๊ฐ™์€๋ฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ์–˜๊ธฐ๋‹ˆ๊นŒ ์ด๋ฒˆ์— ๊ผญ Lambda๋กœ ์Šค์ผ€์ค„๋Ÿฌ ๋ถ€๋ถ„์€ ์˜ฎ๊ฒจ์•ผ๊ฒ ๋‹ค.


๋‹ค ์ข‹์€๋ฐ ๊ทธ๋งŒ ๊ฐ€์ ธ๊ฐ€ ใ… ใ…  ํฌ๋ ˆ๋”ง ์ข€ ์ค˜์š” ..๐Ÿ˜ญ
AWS๊ฐ€ ๊ฐ€์ ธ๊ฐ€๋Š” ๋ˆ์€ ๋’ค์— 0์ด ๋‘ ๊ฐœ์ฏค ๋” ๋ถ™๋Š” ๋Š๋‚Œ์ด๋‹ค..๐Ÿฅบ

profile
์ข€ ๋” ์ฒœ์ฒœํžˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง

0๊ฐœ์˜ ๋Œ“๊ธ€