들어가며
AWS에서 RDS 혹은 다른 형태의 DataSource(ElastiCache, ElasticSearch 등)를 사용할 때에는, 보안상 보통 Public 접근을 차단하기 위해 Private Subnet 내부에서 생성한다. 이렇게 생성된 자원은 EC2 인스턴스 위에서 동작하는 애플리케이션 혹은 다른 매니지드 서비스를 이용해서 접근하여 쉽게 사용이 가능하다.
하지만 상용 서비스를 운영하게 되면, 개발자 로컬 PC에서 이런 Private Subnet에 위치한 DataSource 자원에 접근이 필요할 때가 있다. Private Subnet에 위치한 자원은 평범한 방법으로는 접속할 수가 없고, 일반적으로는 IP 포트포워딩을 이용하여서 동일한 VPC에 위치한 Public Subnet에서 Proxy EC2 인스턴스를 하나 띄워서 해결할 수 있다.
# EC2 Remote 포트 포워딩 설정
# 192.168.0.100:6502 로 들어오는 패킷을 192.168.122.121:8080 으로 nat forwarding
iptables -t nat -I PREROUTING -p tcp -d 192.168.0.100 --dport 6502 -j DNAT --to-destination 192.168.122.121:8080
하지만 AWS에서 “클러스터 형태”로 생성한 DataSource 자원의 경우 고정 IP를 가지지 않는다. DNS만 고정된 형태로, IP는 특정 상황에 따라 유동적으로 변하게 되므로 위와 같은 방법으로 DNS에서 IP를 획득하여 사용한다고 하더라도 시간이 흐른 어느 순간부터는 IP가 변경되어서 더 이상 접속이 불가능한 상황에 마주치게 된다.
그러므로 클러스터 모드의 경우에는 DNS 주소를 이용하여서 연결하는 방법이 필요한데, 이것을 가능하게 해주는 것이 AWS SSM(AWS Session Manager)이다.
준비
AWS SSM을 사용하여 포트포워딩을 하는 경우 아래와 같은 자원이 필요할 예정
AWS
- EC2가 사용할 IAM 역할
- SSM Agent(3.1.1374.0 버전 이상)가 설치된 EC2
로컬 PC
- AWS CLI + configure 설정
- AWS Session Manager Plugin 설치
작업
아래 순서대로 진행하면 된다.
1. IAM 역할 생성
EC2 인스턴스에서 사용할 IAM 역할을 생성한다.
IAM 역할은 반드시 아래의 정책을 포함해야 한다.
- AmazonSSMManagedInstanceCore
2. EC2 생성
EC2의 경우 모든것을 기본값으로 선택하되, 아래의 것들만 선택한다.
- AMI: Amazon Linux2
- Subnet: 연결할 RDS 혹은 DataSource와 동일한 VPC (Private, Public Subnet 상관 없다)
- Public IP 자동 할당 활성화
- IAM 인스턴스 프로파일(역할) 지정: 위에서 생성한 IAM 역할
인스턴스 타입의 경우, t계열을 선택해서 생성해도 상관 없다.
보안그룹도 특별한 Rule 이 필요 없으므로, Inbound, Outbound 모두 기본값으로 생성
EC2 생성 완료 시, 인스턴스 접속 후 설치된 SSM Agent 버전을 확인한다.
# Agent 버전 확인
yum info amazon-ssm-agent
만약 설치된 버전이 3.1.1374.0 보다 낮을 경우, AWS 가이드 문서를 보면서 설치한다.
3. 로컬 PC에 AWS CLI 설치
로컬 PC에서 aws ssm cli를 실행하므로, AWS 가이드 문서를 보면서 설치한다.
설치가 완료 되면, 액세스키, 시크릿 액세스키를 입력한다.
- 아래 명령어 실행 후, access Key, Secret Access Key 입력
aws configure
- 입력된 credential 정보 확인
aws sts get-caller-identity
4. 로컬 PC에 Session Manager Plugin 설치
SSM 사용시 반드시 필요하다. AWS 가이드 문서를 보면서 설치한다.
실행
위의 작업을 모두 완료했다면, 아래처럼 필요한 정보를 기입 후 CLI를 실행한다.
aws ssm start-session \
--target i-0615324b1b365c9d7 \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":[datasource domain url],"portNumber":[port], "localPortNumber":[port]}'
- 예시
aws ssm start-session \
--target i-0615324b1b455c9de \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["dev-test-v1-redis-0001-001.dev-test-v1-redis.de5g1i.apn2.cache.amazonaws.com"],"portNumber":["6379"], "localPortNumber":["6379"]}'
CLI 실행 중인 상태에서 localhost:6379 로 접속하면, remote host 인 dev-test…:6379 으로 자동 리다이렉트 연결 된다.