개요
Node.js에서 RedShift를 연결하는 방법을 소개합니다.
Amazon RedShift란?
Node.js에서 RedShift 연결하기
Private Subnet의 RedShift에 연결하기
Amazon RedShift란?
Amazon RedShift는 PostgreSQL을 확장해서 만들어진 데이터베이스입니다. — [Ref]
RDS for PostgreSQL에 접속 가능한 SDK라면 특별한 차이점이 없는 한
Amazon RedShift에도 접속이 가능할 것입니다.
Node.js에서 RedShift 연결하기
Connect RedShift in Node.js를 검색하면 node-redshift 라이브러리를 추천합니다. — [Ref 1], [Ref 2]
하지만 해당 라이브러리는 7년 전 이후로 업데이트 되지 않고 있습니다.
또한 dmanjunath/node-redshift 내부 코드를 보면 pg를 쓰고 있습니다. — [Ref]
여기서 pg는 PostgreSQL에 접속이 가능한 Node.js SDK 중 하나입니다. — [Ref]
아래의 코드를 실행하면 성공적인 연결이 되는 것을 볼 수 있습니다.
import pg from 'pg;
async function connectPgClient() {
const pgClient = new pg.Client({
host: "RedShift Endpoint"
port: 5439 // RedShift Default Port
user: "RedShift Username"
password: "RedShift Password"
database: "RedShift Table"
ssl: true
});
await pgClient.connect();
}
Private Subnet의 RedShift에 연결하기
일반적으로 프로덕션에서는 Private Subnet*에 DB Cluster를 배포합니다.
Private Subnet*은 인터넷을 통한 퍼블릭 엑세스가 되지 않는 서브넷을 의미합니다.
따라서 Public Subnet*에 배포된 Bastion Host를 통해서 RedShift Cluster에 접근하여야 합니다. — [Ref 1], [Ref 2], [Ref 3]
Bastion Host*는 퍼블릭 엑세스가 되는 서브넷에 배포된 EC2 Instance를 “경유”하여 Private Subnet의 대상에게 가기 위해서 사용하는 것을 의미합니다.
RedShift Cluster Endpoint를 /etc/hosts에 등록해야합니다.
sudo vi /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
127.0.0.1 <RedShift Endpoint*>
이후 터미널을 열어서 ssh -L을 실행 후, 해당 창을 유지해야합니다.
ssh -L <Local Port*>:<RedShift Endpoint*>:<RedShift Port*> -i <Bastion Host PEM> <Bastion Host User*>@<Bastion Host Public IPv4*>
Local Port* 또한 되도록이면 5439 포트를 유지하도록 합시다.
ssh -i 5439:sample-redshift-cluster.abcdefghijkl.ap-northeast-2.redshift.amazonaws.com:5439 -i example.pem ec2-user@1.1.1.1
단 부득이하게 5439가 아닌 포트, 예를 들어 6430으로 변경했다면 어플리케이션 코드를 일부 변경해야 합니다.
import pg from 'pg;
async function connectPgClient() {
const pgClient = new pg.Client({
host: "RedShift Endpoint"
port: 6430 // RedShift Default Port
user: "RedShift Username"
password: "RedShift Password"
database: "RedShift Table"
ssl: true
});
await pgClient.connect();
}