[AWS] RDS: RDS Proxy


RDS ํ”„๋ก์‹œ๋Š” ๋ง ๊ทธ๋Œ€๋กœ RDS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ํ”„๋ก์‹œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์„œ๋น„์Šค๋‹ค.
Aurora์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

2019๋…„์— ๋‚˜์˜จ๊ฑฐ๋ผ์„œ ๊ฝค ๊ทผ๋ž˜์— ๋‚˜์˜จ ์„œ๋น„์Šค์ธ๋ฐ, ๋‚˜์˜ฌ ๋•Œ๋Š” ๋‚˜๋ฆ„ ๊ฐ๊ด‘์„ ๋ฐ›์•˜๋‹ค๊ณ  ํ•œ๋‹ค.

์ด๊ฒŒ ์™œ ํ•„์š”ํ–ˆ๋˜ ๊ฑธ๊นŒ?

์ƒ๊ฐํ•ด๋ณด์ž.

์•„๋งˆ์กด์—์„œ ์ œ๊ณตํ•˜๋Š” AWS Lambda ๊ฐ™์€ ์„œ๋ฒ„๋ฆฌ์Šค ์„œ๋น„์Šค๋‚˜, PHP ๊ฐ™์€ ๋‹จ์ˆœ๋ฌด์‹ํ•œ ํŽ˜์ด์ง€ํ˜• ํ™˜๊ฒฝ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋‹ค ๋ณด๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ปค๋„ฅ์…˜์„ ์ง€์†์ ์œผ๋กœ ๋“ค๊ณ  ์žˆ์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๊ทธ๋•Œ๊ทธ๋•Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋‚˜์”ฉ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ, ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๋‹น ์ปค๋„ฅ์…˜์„ ๋“ค๊ณ  ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฒŒ ์™œ ๋ฌธ์ œ๊ฐ€ ๋˜๋А๋ƒ?

๊ธฐ๋ณธ์ ์œผ๋กœ RDB๋“ค์€ ์ปค๋„ฅ์…˜์— ๋Œ€ํ•œ ํ•œ๊ณ„์น˜๋ฅผ ๋‘๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์„ค์ •ํ•˜๊ธฐ์— ๋”ฐ๋ผ์„œ ๊ฝค ๋งŽ์ด ๋Š˜๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ทธ๋ž˜๋„ ๋Œ€์ฒด๋กœ 1000-20000๊ฐœ ์‚ฌ์ด๊ฐ€ ์ ์ •์„ ์ด๋‹ค.

์š”์ฒญ์ด ๋ฏธ์นœ๋“ฏ์ด ๋“ค์–ด์™€์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ปค๋„ฅ์…˜์„ ํ•˜๋‚˜์”ฉ ๋‹ค ๋“ค๊ณ  ์žˆ์œผ๋ฉด, ์ปค๋„ฅ์…˜์ด ํ•œ๊ณ„์น˜์— ๋„๋‹ฌํ•ด์„œ ๋” ์ด์ƒ์˜ ์ปค๋„ฅ์…˜ ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
๊ทธ๋ ‡๋‹ค. ๊ธฐ์กด์— ์ปค๋„ฅ์…˜์„ ๋ฌผ๊ณ  ์žˆ๋˜ ๋†ˆ์ด ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ƒˆ๋กœ ๋“ค์–ด์˜ค๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์ปค๋„ฅ์…˜์„ ๋ฐ›์ง€ ๋ชปํ•˜๊ณ  ๋ป—๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ php์— ์ปค๋„ฅ์…˜ํ’€๋„ ๋‹ฌ์ง€ ์•Š์€ ์•ผ๋งค์‹ ์‚ฌ์ดํŠธ๋“ค์„ ๋ณด๋ฉด, connection max์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ์„œ๋ฒ„๊ฐ€ ํ„ฐ์ง€๋Š” ์ผ์ด ์ข…์ข… ๋ณด์ธ๋‹ค.

์ด๊ฑด ์ค‘๊ฐ„์— ์ปค๋„ฅ์…˜ํ’€์ด๋‚˜ ํ”„๋ก์‹œ๋งŒ ํ•˜๋‚˜ ๋‹ฌ์•„๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
RDS ํ”„๋ก์‹œ๋Š” ๊ทธ๋Ÿฐ๊ฑธ ๊ด€๋ฆฌํ˜•์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์š”๊ธˆ์€ ์•„๋ž˜ ์š”๊ธˆํ‘œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.
https://aws.amazon.com/ko/rds/proxy/pricing/
์ €๋ ดํ•˜์ง„ ์•Š๋‹ค.

์ด์ œ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.





ํ”„๋ก์‹œ ์ƒ์„ฑ

RDS ํƒญ์— ๋“ค์–ด๊ฐ€์„œ ์•„๋ž˜์˜ ํ”„๋ก์‹œ๋กœ ์ด๋™, ํ”„๋ก์‹œ ์ƒ์„ฑ์„ ํด๋ฆญํ•ด์„œ ์ƒ์„ฑ์ฐฝ์„ ๋„์šด๋‹ค.

์ƒ์„ฑ ์ฐฝ์— ๋“ค์–ด๊ฐ€๋ฉด ์—ฐ๋™ํ•  ์—”์ง„ ์ข…๋ฅ˜๋ฅผ ๋จผ์ € ๊ณ ๋ฅด๊ณ 

๊ฐ€๋ฆฌํ‚ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€, ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ 100ํผ์„ผํŠธ๋กœ ๋˜์–ด์žˆ๋Š”๋ฐ, 100ํผ์„ผํŠธ๋ฉด ์ปค๋„ฅ์…˜ ํ•œ๊ณ„์น˜์˜ ์ ˆ๋ฐ˜๊นŒ์ง€๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๊ณ , 50ํผ์„ผํŠธ๋ฉด ์ ˆ๋ฐ˜๋งŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ์‹์ด๋‹ค.
๊ทผ๋ฐ 100ํผ์„ผํŠธ๋Š” ์ข€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๊ณ , ํ•„์š”์— ๋”ฐ๋ผ์„œ ์ž˜ ๋งž์ถฐ์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‹œํฌ๋ฆฟ ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด์„œ ๋ณด์•ˆ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ €๊ธฐ์„œ "์ƒˆ ๋ณด์•ˆ ์•”ํ˜ธ ์ƒ์„ฑ"์„ ๋ˆ„๋ฅด๋ฉด ์ƒ์„ฑ์ฐฝ์œผ๋กœ ์ด๋™ํ•˜๋Š”๋ฐ


์ ๋‹นํžˆ ํŒจ์Šค์›Œ๋“œ ์ฑ„์›Œ๋†“๊ณ  ๋งŒ๋“ค์–ด์„œ, ์„ ํƒํ•œ ๋‹ค์Œ์— ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.
์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ํŒจ์Šค์›Œ๋“œ๋Š” ๊ธฐ์กด ์„ค์ •๊ณผ ๋™์ผํ•ด์•ผ ํ•จ์— ์œ ์˜ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  postgresql์˜ "postgres" ๊ฐ™์€ ๊ธฐ๋ณธ ๋งˆ์Šคํ„ฐ ๋ฃจํŠธ ๊ณ„์ •์„ ๋„ฃ์œผ๋ฉด ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์™œ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค.


๊ทธ๋Ÿผ ์ด๋Ÿฐ์‹์œผ๋กœ ํ”„๋ก์‹œ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๊ฒƒ์ด๋‹ค.

ํ”„๋ก์‹œ์— ์„ค์ •๋œ ๋ณด์•ˆ๊ทธ๋ฃน์— ๋“ค์–ด๊ฐ€์„œ

mysql ํฌํŠธ ์—ด๋ ค์žˆ๋‚˜ ํ™•์ธํ•ด๋ณด๊ณ  ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.




ํ”„๋ก์‹œ์˜ ์‚ฌ์šฉ (with Lambda)

RDS ํ”„๋ก์‹œ๋Š” public access๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ๋™์ผํ•œ VPC ๋‚ด์—์„œ๋งŒ ์ง์ ‘ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ทธ๋ž˜์„œ Lambda ๊ฐ™์€ ์„œ๋น„์Šค์—์„œ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ssh๋กœ ์šฐํšŒํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ทผ๋ฐ ์‚ฌ์‹ค Lambda๋ฅผ ์œ„ํ•œ ์„œ๋น„์Šค๋ผ ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด๋ณด์ž.
์ด๋ฆ„์€ ์ทจํ–ฅ๊ป ์ง“๊ณ 

๋จผ์ € EC2 ๊ถŒํ•œ์„ ๋ถ™์—ฌ์ค€๋‹ค. VPC ์—ฐ๊ฒฐ์— ์‚ฌ์šฉ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  VPC ํƒญ์— ๋“ค์–ด๊ฐ€์„œ RDS Proxy์™€ ๋™์ผํ•œ VPC๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ๋งบ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ ˆ์ด์–ด์— ์˜ฌ๋ ค์„œ ๋žŒ๋‹ค์— ์—ฐ๊ฒฐํ•œ๋‹ค.
๋‚˜๋Š” sequelize๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ๋ฐ‘์ž‘์—…์€ ๋Œ€๊ฐ• ๋๋‚œ ๊ฒƒ์ด๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šธ ๊ฒƒ์€ ์—†๋‹ค.
rds proxy ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ŠคํŠธ๋กœ ํ•˜๊ณ , ์‹œํฌ๋ฆฟ ๋งค๋‹ˆ์ €๋กœ ์„ค์ •ํ•œ ์œ ์ €๋„ค์ž„/ํŒจ์Šค์›Œ๋“œ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

const sequelize = require('sequelize');

exports.handler = async (event) => {
    const connection = new sequelize.Sequelize(
        'test', 
        process.env.USER_NAME,
        process.env.PASSWORD,
        {
            dialect: 'mysql', 
            host: process.env.HOST,
            port: 3306,
    });

    const list = await connection.query(`
        select * 
        from test.\`person\` 
    `, {
            type: sequelize.QueryTypes.SELECT,
            logging:false,
        }
    );

    console.log(list);

    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify(list),
    };
    return response;
};

๊ทธ๋Ÿผ ์ž˜ ๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค.



์ฐธ์กฐ
https://stackoverflow.com/questions/63278572/cant-connect-to-rds-postgresql-db-instance-through-an-rds-proxy
https://aws.amazon.com/ko/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/