<aside> 💡 클라우드 인스턴스의 컴퓨팅 파워가 로컬의 컴퓨터보다 좋지 않은 관계로 위의 전체 프로세스를 처리하는데 시간이 다소 소요 될 것이라 판단하였다. 따라서 SSH 터널링을 이용해서 대부분의 계산은 로컬 컴퓨터에서 실행하여 쿼리 요청을 통해 업데이트를 하는 방법을 사용하였다.
</aside>
현재 인스턴스는 private subnet에 숨겨있기 때문에 접속을 위해서는 bastion 서버에 접속하여 bastion 서버의 private ip로 데이터 베이스에 접속할 수 있다.
----------------------------------------------------------------------
|
-------------+ | +----------+ +---------
LOCAL | | | REMOTE | | PRIVATE
CLIENT | <== SSH ========> | SERVER | <== local ==> | SERVER
-------------+ | +----------+ +---------
|
FIREWALL (only port 22 is open)
----------------------------------------------------------------------
SSH 터널링이란 위와 같은 상황에서 중간단계 리모트 서버를 매개로 로컬의 주소를 통해서 프라이빗 영역에 숨겨져 있는 인스턴스에 접속하는 방법을 말한다.
패키지 설치
pip install sshtunnel
tunnel 객체 생성
from sshtunnel import SSHTunnelForwarder
tunnel = SSHTunnelForwarder(ssh_address_or_host=(SSH_HOST, SSH_PORT),
ssh_username=SSH_USER,
ssh_pkey=SSH_KEY_PATH,
remote_bind_address=(DB_HOST, DB_PORT),
local_bind_address=("localhost", DB_PORT))
ssh_address_of_host | ssh로 접속할 인스턴스의 호스트와 포트(22 or 2222) |
---|---|
ssh_username | 리모트 인스턴스 유저 |
ssh_pkey | 리모트 인스턴스 접속을 위한 pem 키의 경로 |
remote_bind_address | 접속을 통해서 연결할 타겟 호스트와 포트 |
local_bind_address | 리모트 타겟 호스트와 매핑될 로컬 주소 |
SSH와 관련된 정보는 ~/.ssh/config
에 위치한 연결 정보를 보고 변수를 바인딩 해주면 된다.
터널 연결 확인 및 DB 연결
터널 열결/끊기: 터널의 경우 start()
와 stop()
메서드를 이용해서 연결을 하거나 끊을 수 있다. → context manager를 사용하면 보다 편리하게 관리 가능
다음과 같이 터널링 포트를 확인할 수 있다.
tunnel.local_bind_port
DB 연결의 경우 리모트 타겟 호스트와 매핑된 로컬의 주소와 포트를 사용해야 한다.
import psycopg2
conn = psycopg2.connect(host="localhost",
dbname=DB_NAME,
user=DB_USER,
password=DB_PASSWD,
port=DB_PORT)
호스트를 제외하고는 나머지 정보는 실제값을 넣어주야 한다.
context manager(with
)를 사용하면 보다 편리하게 연결을 관리할 수 있다. 특히 connection에서 cursor를 가져온 경우 transaction을 실행하기 때문에 반드시 close()
를 하는 것이 필요하다.
from contextlib import closing
파이썬에서 기본적으로 제공하는 closing
함수를 이용하면 객체 내에 정해진 close()
메서드를 컨텍스트 매니저 블럭이 끈나는 시점에서 호출하기 때문에 안전하게 종료를 할 수 있다.
with closing(conn.cursor()) as cursor:
...
# conn.close()