AWS EC2 혹은 RDS 를 사용할 때 가장 편리한 방법은 EIP 를 부여받아 고정 IP 를 할당한 뒤, SSH 등으로 접속해서 직접 제어하는 방법이다. 하지만 이러한 방법은 보안상 취약하기 때문에 DB 와 같이 중요한 데이터가 들어가 있는 자원은 EIP 를 부여하지 않고 사용하게 되는데, 이렇게 될 경우 VPC 내부에서만 액세스가 가능하다 는 문제가 생긴다.
이를 해결하기 위해서는, 아래와 같은 방법이 있다.
- ❌
AWS 에 VPN 서버를 세팅하고 VPN 에 연결해서 작업→ VPN 서버를 따로 관리해야 하는 어려움이 있다. - ❌
AWS Managed VPN Service 를 이용→ 비싸다. - 🌝 AWS SSM + Bastion 서버 + SSH 터널링을 이용
AWS SSM

AWS SSM 은 VPN 을 이용하지 않고도 AWS 자원에 접근할 수 있도록 만들어주는 명령어이다. AWS EC2 인스턴스에 접속하기 위해 보안 그룹에서 22번 포트를 열어줄 필요도 없고, pem 키 파일을 공유할 필요도 없다. 또한 유저 별로 접근 권한 설정도 가능하다.
But…안타깝게도 AWS RDS 에는 ssh 터널링을 통해서만 접근이 가능하기 때문에, Bastion 서버와 pem 키 파일이 필요하다. AWS 더 열일하도록.
Bastion 서버 만들기
1. 보안 그룹 설정하기
AWS 내 자원끼리 통신하기 위해서는 여러 설정이 필요하지만, 만약 default vpc 를 사용한다면 기본적으로 내부 자원끼리 통신하도록 Route Table 이 설정되어 있다.
이와 함께 해당 자원들이 있는 보안 그룹에서 인바운드 설정을 통해 모든 트래픽을 열어줄 수 있다. (물론 특정 프로토콜과 포트만 열어서 사용할 수도 있고, 이후 Bastion 으로 사용하는 EC2 서버를 소스로 지정해 해당 서버에만 접근 가능하도록 설정할 수도 있다.)

2. IAM 역할 만들기
AWS IAM > [역할 만들기] > [AWS 서비스] > [EC2] 클릭

[AmazonSSMManagedInstanceCore] 정책을 연결해 준다.

3. AWS EC2 생성하기
EC2 서버를 생성할 때 IAM 역할에 위에서 만든 역할로 설정해 준다.
AWS SSM 을 이용하여 Bastion 서버에 접속하기
1. AWS CLI 설치
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2-mac.html#cliv2-mac-install-cmd
2. AWS CLI SSM Plugin 설치
3. AWS SSM 을 이용하여 세선 시작
$ aws ssm start-session --target ${Bastion 서버 IP}
4. AWS System Manager > Session Manager 콘솔에 접속해 보면 연결되고 있는걸 확인할 수 있다.
AWS SSM + SSH + Bastion 서버 터널링을 통해 AWS RDS 에 접근하기
1. pem 키 권한 설정
$ sudo chmod 400 ${pem 키 파일 위치}
2. 터널링
1) ~/.ssh/config 작성
# ~/.ssh/config
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
User ssh-user
IdentityFile ${pem 파일 위치}
2) Command
$ ssh -L 127.0.1:3306:${RDS 엔드포인트}:3306 ${Bastion 서버 IP}
3) Full Command
$ ssh -i ${pem 키 파일 위치} ssh-user@${Bastion 서버 IP} -N -L 127.0.0.1:3306:${RDS 엔드포인트}:3306
3. MySQL 접속
$ mysql -u admin -h 127.0.0.1 -P 3306 -p ${RDS 마스터 암호}