Intro

 

AWS VPC Private Subnet에 인스턴스를 위치시켰다면, 외부 인터넷 환경에서 접속은 불가능하다. Bastion Host를 사용해서 Public Subet에 위치한 인스턴스를 활용해서 터널링을 이용하는 것이 일반적이다. 하지만 Bastion Host로 사용하는 인스턴스 관리뿐만 아니라, 별도의 비용이 들기 때문에 항상 고민했었다. 그러던 와중에 EC2 Instance Connect를 발견했다. VPC 엔드포인트 서비스의 일종으로, 관리도 필요 없고 비용도 따로 없다. 적용법과 활용 방안에 대해서 소개하려 한다. 

 

(사전 준비로 Internet Gateway, NAT Gateway, VPC는 생성해야 한다.)

 

EC2 Instance Connect 원리

 

EC2 Instance Connect의 동작 원리는 다음과 같다.

 

1. EC2 Instance Connect Service를 통한 EC2 Instance Connect에 접근

2. EC2 Instance Connect를 통해서 인스턴스에 접근

 

 

모식도는 위와 같다. Bastion Host를 생성하지 않고, 접근하다는 점에서 매우 좋고, IAM을 통해서 사용자에 대한 접근을 방지할 수 있으므로 보안성도 더 뛰어나다고 생각한다. 

 

EC2 Instance Connect 적용하기

 

생성 방법은 매우 간단하다. VPC -> 엔드 포인트 탭으로 이동해서 생성하기 하면 된다. 다음과 같이 진행하면 된다. (그림은 참고용)

 

 

 

1. 이름 설정 (편한 대로)

2. EC2 인스턴스 연결 엔드포인트

3. VPC 선택

4. 보안 그룹 선택

5. 서브넷 선택

 

끝이다. 1,2,3은 별다른 설명은 필요없지만, 보안 그룹과 서브넷 선택인 4,5는 생각할 부분이 있다.

 

서브넷 설정은 자유롭게 진행해도 된다. 하지만 보안 그룹과 관련이 있으므로 선택한 서브넷을 기억해야 한다. 

 

원리를 설명할 때 모식도를 보면 EC2 인스턴스 엔드포인트를 서브넷에 위치시켜 동작한다. 그렇기에 인스턴스의 인바운드 규칙을 서브넷 IP들에 대해서 허용을 해줘야 한다. 예를 살펴보자.

 

1. Subnet 10.0.4.0/24에 EC2 인스턴스 엔드포인트 생성

2. Instance 10.0.5.0/24 서브넷에 위치

 

사용자는 외부에서 접근하게 되는데, EC2 인스턴스 엔드포인트의 위치는 10.0.4.0/24에 위치하며, 인스턴스는 10.0.5.0/24에 위치하므로 접근하기 위해서는 10.0.4.0/24의 인바운드 규칙을 열어줘야 접근 가능하다.

 

위의 부분만 주의하면 쉽게 사용할 수 있다.

 

전부다 설정하고 나서, 아래의 명령어를 사용하면 된다.

(AWS CLI가 예전 버전인 경우 send-ssh-public-key인자가 필요하다고 에러가 발생하는데, AWS CLI 버전을 업데이트 하자.)

aws ec2-instance-connect ssh --instance-id {instance-id}

 

 

그렇다면 다음과 같이 접속된 것을 볼 수 있다.

 

 

 

추가적인 내용

 

위의 방법과 유사하게 RDS도 접근할 수 있다. 명령어는 아래와 같다.

aws ec2-instance-connect open-tunnel --instance-connect-endpoint-id eice-0d29970XXXXXXXXX 
\ --private-ip-address database-1.XXXXXXXXXXXX.ap-northeast-2.rds.amazonaws.com 
\ --local-port 3306 --remote-port 3389

 

Bastion Host처럼 터널링을 활용해서 RDS에 접근하는 방법이다. 문제는 2023/06월 업데이트 이후로 ec2-instance-connect 내부에서 remote-port를 3389와 22로 제한을 뒀다. 일반적으로 Mysql 포트인 3306을 사용할 수 없어서, 파라미터 그룹을 이용해서 RDS의 포트를 변경해야 한다. 유지보수 관점에서 봤을 때 애플리케이션이 RDS를 가리키는 포트도 전부 바꿔야 해서 좋은 방법인 거 같지는 않다. 기호에 따라서 사용할 사람들은 사용하면 될 거 같다.