이것이 점프 투 공작소

Session Manager를 이용해 Private DB 접속하기 본문

aws

Session Manager를 이용해 Private DB 접속하기

겅겅겅 2023. 12. 15. 21:11

일반적으로 DB는 Private Subnet 즉 인터넷 엑세스가 불가능한 서브넷에 생성합니다.

하지만 로컬에서 Private Subnet에 있는 DB에 대한 엑세스가 필요하기에

Session Manager와 Bastian Host 이용하여 DB에 접속하는 방법을 정리하려 합니다.

 

EC2 Session Manager 연결

1. EC2 UserData에 스크립트 추가

Bastian Host UserData에 Session Manager 설치 스크립트를 추가합니다.

#!/bin/bash

yum update -y
yun install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
yum install -y amazon-ssm-agent

echo "session required pam_limits.so" >> /etc/pam.d/su
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent

 

2. IAM 권한 및 역할 추가

EC2에 SSM권한이 있는 IAM 역할을 추가합니다.

아래 2가지 ssm, ssmmessages 두 정책이 SSM관련 권한입니다.

  • ssm:* (EC2가 SSM서비스에 엑세스 하기위한 권한)
  • ssmmessages:* (SSM에서 EC2에 요청을 전달하기 위한 권한) 

대표적으로 AWS에서 관리하는 정책인 AmazonEC2RoleforSSM 정책이나 SSM에 필요한 권한이 연결된 Role을 생성해 EC2에 연결합니다.

3. Session Manager 연결 확인

위에 두 조건이 만족되면 Session Manager 연결이 가능합니다.

 

 

로컬CMD(윈도우)에서 Session Manager 접속

1. Session Manager 플러그인을 설치합니다.

Session Manager 설치 프로그램 URL (윈도우, 맥)

https://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/install-plugin-windows.html

 

Windows에 Session Manager 플러그 인 설치 - AWS Systems Manager

최상의 결과를 위해 Windows PowerShell 버전 5 이상을 사용하여 Windows에서 세션을 시작하는 것이 좋습니다. Windows 10의 Command 쉘을 사용할 수도 있습니다. Session Manager 플러그인에서는 PowerShell 및 Command

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/install-plugin-macos-overview.html

 

macOS에 Session Manager 플러그 인 설치 - AWS Systems Manager

플러그인에 Python 2.6.5 이상 또는 Python 3.3 이상이 필요합니다. 기본적으로 설치 스크립트는 시스템 기본 버전의 Python에서 실행됩니다. 대체 버전의 Python을 설치하고 이를 사용하여 Session Manager 플

docs.aws.amazon.com

2. 터널링 명령어 실행

ssm에서 bastian host를 이용한 터널링 명령어

aws ssm start-session --target <bastian-host-id> --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters "{\"host\":[\"private subnet의 DB엔드포인트\"],\"portNumber\":[\"실제 DB포트\"],\"localPortNumber\":[\"로컬에서 사용할 포트\"]}"

 

여러 DB에 대한 터널링을 한번에 실행되도록 저는 bat파일을 만들어 사용했습니다.

아래 bat파일을 실행하게되면 총 3개의 세션 터미널이 열리게됩니다.

@echo off

:: start session
start cmd /c aws ssm start-session --target bastian-host-id --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters "{\"host\":[\"private subnet의 DB1엔드포인트\"],\"portNumber\":[\"3306\"],\"localPortNumber\":[\"13306\"]}"

start cmd /c aws ssm start-session --target bastian-host-id --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters "{\"host\":[\"private subnet의 DB2엔드포인트\"],\"portNumber\":[\"3306\"],\"localPortNumber\":[\"13306\"]}"

start cmd /c aws ssm start-session --target bastian-host-id --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters "{\"host\":[\"private subnet의 DB3엔드포인트\"],\"portNumber\":[\"3306\"],\"localPortNumber\":[\"13306\"]}"

pause

bat 파일 실행 후 화면

SSM 터널링을 이용해 private DB 접속하기

위와 같이 session 터널링 터미널이 열려있는 동안 로컬(인터넷망)에서 bastian host를 통과해 private DB 접속이 가능합니다.

로컬 -> bastian host -> DB로 접속이 진행되기에 host에는 루프백 주소를, 포트는 터널링 포트를 지정해줍니다. 

 

session이 연결된 상태에서 Test Connection을 시도하면 성공합니다.