본문 바로가기

aws

AWS EICE (EC2 Instance Connect Endpoint) 연동

개요

실무상 대부분의 AWS RDS와 같은 인스턴스는 Private Subnet에 존재하고 퍼블릭 액세스를 허용하지 않는다.

 

단순히 테스트를 위한 제일 쉬운 방법으로는 퍼블릭 엑세스를 열어 보안그룹을 통해 IP 대역으로 접근통제를 걸 수 있겠지만 퍼블릭 액세스는 프로덕션 레벨에서는 결코 좋은 방법이 아니다.

 

개발자가 AWS RDS 의 액세스 권한이 퍼블릭이 아닌 프라이빗을 유지한 상태로 접근할 수 있는 방법이 없을까?

 

이에 대한 몇가지 방법이 있는데 이번 포스팅은 AWS EICE (EC2 Instance Connect Endpoint)에 알아보고자 한다.

 

 

 

EC2 Instance Connect Endpoint 구성도

 

EICE는 사용자가 프라이빗 서브넷에 있는 인스턴스에 연결할 수 있도록 터널 기능을 한다.

 

따라서 EICE 를 사용함에 있어서 다음과 같은 장점이 있다.

  • VPC에 인터넷 게이트웨이가 없어도 인스턴스에 연결할 수 있다.
  • 인스턴스에 퍼블릭 IPv4 주소가 없어도 인스턴스에 연결할 수 있다.
  • IAM 정책을 사용자에게 부여함으로써 액세스 제어를 할 수 있다.
  • 인스턴스에 연결하려는 모든 로그들은 CloudTrail 를 통해 확인할 수 있다.

 

구현

해당 구현은 이미 AWS RDS 가 구현되어 있다는 가정하에 진행된다.
MySQL RDS 기준으로 테스트 구현 진행했음.MySQL 의 기본포트는 3306이다.
EICE를 적용하기 위해서는 기본 포트가 변경이 되어야 하기에 3389로 변경함.

 

위의 구성도를 기반으로 구현하기 위해서는 몇 가지 필요한 조건들이 있다.

  • EICE에 대한 보안그룹
  • RDS에 대한 보안그룹
  • RDS의 기본 포트 변경
  • EICE 접근을 위한 IAM 정책 생성 및 권한 부여

EICE 보안 그룹 생성

EICE 보안 그룹은 사용자로부터 들어온 트래픽을 Private Subnet에 있는 RDS 로 전달하는 역할을 한다.

따라서 아웃바운드 규칙으로 Pivate Subnet 에 있는 RDS의 인스턴스의 보안 그룹으로 구성해야 한다.

 

아래의 이미지는 RDS 의 포트인 3389로 설정하여 RDS 보안 그룹에 전달되도록 아웃바운드 규칙을 추가한 모습이다.

생성할 EICE 의 보안그룹 생성

 

RDS에 대한 보안그룹 설정

EICE의 보안그룹 아웃바운드 규칙이 완료되었다면 이제는 RDS 보안그룹의 인바운드 규칙을 변경해야 한다.

인바운드 규칙으로 포트 범위를 3389로 지정한 뒤 EICE의 보안그룹을 소스 정보로 지정한다.

RDS 보안그룹 설정

엔드포인트 생성

보안그룹 설정이 끝났으면 엔드포인트를 생성해야 한다.

메뉴이동 - VPC - Virtual Private Cloud - 엔드포인트 - 엔드포인트 생성

 

EICE 생성

 

서비스 범주

- EC2 인스턴스 연결 엔드포인트 선택

 

VPC

- EICE를 생성할 VPC 

- EICE는 VPC 당 1개밖에 할당할 수 없다.

 

보안 그룹

- 앞에서 생성한 EICE의 보안그룹 선택

 

서브넷

- EICE를 통해 접근할 프라이빗 서브넷 선택

- 여기서는 RDS 가 위치한 프라이빗 서브넷

 

 

IAM 정책 생성 및 권한 부여

EICE의 생성이 완료되었으면 EICE를 사용할 정책을 사용자에게 부여해야 한다.

먼저 아래의 IAM 정책 코드를 복사하여 정책을 생성 한 뒤 사용자 또는 그룹에게 해당 정책을 배포한다.

<<region-code>>, <<account-key>>, <<eice-id>> 은 소유하고 있는 정보에 대해 맞춰줄 것
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Resource": "arn:aws:ec2:<<region-code>>:<<account-key>>:instance-connect-endpoint/<<eice-id>>"
        }
    ]
}

 

위에서 생성한 IAM 정책을&nbsp; DBAccessGroup 에 배포한 모습

 

엔드포인트 연결

사용자 또는 사용자 그룹에게 IAM 정책이 적용되었다면 엔드포인트에 연결할 수 있다.

사전 조건
1. AWS CLI 가 설치되어 있어야 함.
2. aws configure를 통해 위에서 생성한 IAM 정책이 적용된 사용자의 정보가 설정되어 있어야 함.

 

aws ec2-instance-connect open-tunnel \
--instance-connect-endpoint-id <<엔드포인트 ID>> \
--private-ip-address <<아이피주소>> \
--local-port <<Local PC 의 포트>> \
--remote-port <<AWS에 연결할 포트>>

 

 

만약 위의 명령어에서 local-port를 3306으로 설정했다면 아래와 같은 메시지가 나와야 정상이다.

Listening for connections on port 3306.

 

연결 확인

엔드포인트 연결이 확인되었다면 RDS Tool로 접속하여 실제로 접근이 가능한지 확인해 보자.

이때는 RDS의 엔드포인트 DNS 정보를 넣는 게 아닌 localhost 넣어야 한다.

 

 

 

마무리

작업을 진행하면서 생각보다 간편하고 사용자 기준으로 접근 통제가 가능하다는 점으로 매력적으로 다가왔다.

그러나 예상되는 몇 가지 문제점들이 존재한다.

 

1. 포트 사용이 제한적이다. 22 (SSH) 또는 3389 (RDP) 포트 사용이 가능하다. 실제 운영시 데이터베이스 포트를 22 또는 3389 로 바꾸는 것은 문제가 있다.

2. 여러 개의 RDS를 운용한다고 가정하면 엔드포인트 연결을 여러 번 해야 된다는 점에서 상당한 불편함이 예상된다.

3. 사용자에게 정책을 부여한 뒤 접근하는 방식이기에 사용자의 액세스 키 발급이 불가피하다. 그러므로 액세스키의 대한 관리 이슈가 예상된다.

 

서비스의 규모가 커지고 접근해야 될 인스턴스가 많아진다면 다른 방안을 고려해보아야 할 것이다.

'aws' 카테고리의 다른 글

EC2 Instance 에 Cloud Watch Agent 설치  (0) 2024.03.18