[업데이트] EC2 Instance Connect Endpoint를 사용하여 퍼블릭 IP 주소 없이도 SSH/RDP 연결이 가능합니다.

2023.06.28

안녕하세요, 클래스메소드의 서은우 입니다.

이번 re:infore 2023 을 통해 EC2 Instance Connect Endpoint(EIC Endpoint) 가 새롭게 공개되었습니다. EIC 엔드포인트는 퍼블릭 IP 주소 없이도 SSH 및 RDP 연결을 가능하게 해주는 기능입니다.

기존의 방식으로는 Private Subnet에 위치한(퍼블릭 IP 주소가 없는) EC2 인스턴스에 접속하기 위해서 배스천 호스트나 Systems Manager Session Manager를 사용해야 했는데요. 이를 사용하기 위해선 관련 리소스를 생성하고 관리하는 등의 추가 작업과 비용이 발생하는 단점이 있었습니다.

하지만 이제는 EIC Endpoint를 사용하여 인스턴스의 프라이빗 IP 주소로도 SSH / RDP 접속이 가능하게 되었습니다.

EIC Endpoint에 대해

출처: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Connect-using-EC2-Instance-Connect-Endpoint.html

EIC 엔드포인트의 아키텍처는 다음과 같습니다.

무료

서비스 이용에 있어 가격은 정말 중요한 사항 중 하나인데요, EIC 엔드포인트는 무료입니다(데이터 전송 요금은 부과).

배스천 호스트나 SSM 엔드포인트를 이용할 경우 사용 리소스에 대한 요금이 발생하기 때문에, 무료로 이용 가능하다는 점은 EIC 엔드포인트의 가장 큰 장점이 아닐까 생각됩니다.

IAM 권한

EIC 엔드포인트를 생성, 삭제 하기 위해서는 다음과 같은 액션에 대한 IAM 권한이 필요합니다.

  • ec2:CreateInstanceConnectEndpoint
  • ec2:DeleteInstanceConnectEndpoint
  • ec2:CreateNetworkInterface
  • ec2:CreateTags
  • iam:CreateServiceLinkedRole

EIC 엔드포인트를 사용하기 위해서는 다음과 같은 액션에 대한 IAM 권한이 필요합니다.

  • ec2-instance-connect:OpenTunnel

할당량(quotas)

생성 가능한 EIC 엔드포인트 수는 다음과 같습니다.

  • AWS 계정당 5개
  • VPC당 1개
  • 서브넷당 1개

VPC당 1개의 EIC 엔드포인트를 생성할 수 있기 때문에, EIC 엔드포인트가 위치한 AZ에 장애가 발생할 경우에는 서비스 사용에 문제가 생길 수 있는 점은 주의해야할 점인 것 같습니다.

직접 해보기

CLI를 이용하여 EIC Endpoint를 생성, 리눅스 인스턴스에 접속 하도록 하겠습니다.

콘솔 화면에서 EIC Endpoint를 생성하는 방법은 아래의 블로그를 참고해 주세요.

사전 준비

CLI 버전 업데이트

구버전의 CLI의 경우 EIC Endpoint 명령어를 지원하지 않기 때문에, CLI를 최신 버전으로 업데이트 해주세요.

보안 그룹 설정

EIC Endpoint에 할당할 보안 그룹과 접속 대상 EC2 인스턴스의 보안 그룹 설정을 확인해 주세요.

  • EIC Endpoint의 보안그룹
    • 인바운드 룰: 22(SSH), 3389(RDP) 포트의 트래픽
    • 아웃바운드 룰: 대상 인스턴스로 향하는 트래픽
  • 대상 EC2 인스턴스의 보안그룹
    • 인바운드 룰: EIC Endpoint의 보안그룹에서의 트래픽
    • 아웃바운드 룰: EIC Endpoint의 관하여 설정이 필요한 것은 딱히 없음

CLI로 EIC Endpoint를 생성

# EIC Endpoint 생성
aws ec2 create-instance-connect-endpoint --subnet-id 서브넷_id --security-group-id 보안그룹_id

{
    "InstanceConnectEndpoint": {
        "OwnerId": "xxxxxxxxxxxx",
        "InstanceConnectEndpointId": "eice-xxxxxxxxxxx",
        "InstanceConnectEndpointArn": "arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxx:instance-connect-endpoint/eice-xxxxxxxxxxx",
        "State": "create-in-progress",
        "StateMessage": "",
        "NetworkInterfaceIds": [],
        "VpcId": "vpc-xxxxxxx",
        "CreatedAt": "2023-xx-xxTxx:xx:xx+00:00",
        "SubnetId": "서브넷_id",
        "PreserveClientIp": false,
        "SecurityGroupIds": [
            "sg-보안그룹_id"
        ],
        "Tags": []
    },
    "ClientToken": "xxxxxxxxxx"
}
# 생성되어 있는 EIC Endpoint를 확인
aws ec2 describe-instance-connect-endpoints

CLI로 접속 해보기

OpenSSH 클라이언트나 open-tunnel을 사용하여 EIC Endpoint를 통해 인스턴스에 접속할 수 있습니다.

OpenSSH 클라이언트 명령어를 사용

OpenSSH 클라이언트를 통해 인스턴스 ID만을 사용하여 SSH 클라이언트로 EC2 인스턴스에 연결할 수 있습니다.

EC2 Instance Connect는 기본적으로 Public IPv4 -> Private IPv4 -> IPv6 순으로 연결을 시도하며 다음과 같은 연결 유형을 지정할 수 있습니다.

  • auto: 연결 유형을 지정하지 않은 경우, Public IPv4 -> Private IPv4 -> IPv6 순서로 연결을 시도
  • direct: Public IPv4 -> IPv6 -> Private IPv4 순서로 연결을 시도
  • eice: 항상 Private IPv4를 사용하여 연결

open-tunnel 명령어를 사용

OpenSSH와 open-tunnel 명령어를 함께 사용하여 단일 연결만 허용하거나 open-tunnel 명령어만 사용하여 다중 연결을 허용할 수 있습니다.

접속 테스트

# ssh 명령어 - Private IPv4를 사용한 연결 
aws ec2-instance-connect ssh --instance-id [인스턴스 id] --connection-type eice

# ssh + open-tunnel 명령어 - 단일 연결
ssh -i [키페어.pem] ec2-user@인스턴스 id \
    -o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id [인스턴스 id]'

# open-tunnel 명령어 - 다중 연결
aws ec2-instance-connect open-tunnel --instance-id [인스턴스 id] --local-port [포트번호]