VPC Reachability Analyzer로 AWS 네트워크 문제 확인하기

인프라 구성을 하다 보면, 네트워크 설정 때문에 문제를 겪는 일이 많습니다. “Connection timeout"과 같은 네트워크 관련 오류가 갑자기 발생하면, 어디서부터 원인을 찾아야 할 지 막막한데요. AWS를 사용하신다면 네트워크 문제를 겪을 때 VPC Reachability Analyzer라는 서비스를 이용하여 원인을 찾을 수 있습니다. 출발하는 지점부터 도착지까지 어떤 과정으로 트래픽이 도달하는 지 상세하게 확인할 수 있는 서비스입니다. 네트워크 문제가 발생한다면 한 번 사용해 보시기 바랍니다.

VPC Reachability Analyzer

VPC Reachability Analyzer는 2020년에 소개된 기능으로, 소스와 타겟 리소스를 지정하여 내가 의도한 대로 네트워크를 구성하였는지 확인할 수 있습니다. 다만 AWS에 구성한 네트워크 기준으로만 확인할 수 있기 때문에, 애플리케이션 내부에서 트래픽을 차단하는 경우는 감지하지 못합니다. 애플리케이션에서 특정 포트를 차단하는 경우가 있다면 서버 내의 설정을 확인하거나, 애플리케이션 코드를 확인해 보아야 합니다.

가능한 소스와 타겟

Source

  • EC2 인스턴스
  • 인터넷 게이트웨이
  • 네트워크 인터페이스 (ENI)
  • Transit Gateway
  • Transit Gateway Attachments
  • VPC Endpoints
  • VPC Endpoint Services
  • VPC Peering Connection
  • VPN Gateways

Target

  • EC2 인스턴스
  • 인터넷 게이트웨이
  • IP 주소
  • 네트워크 인터페이스 (ENI)
  • Transit Gateway
  • Transit Gateway Attachments
  • VPC Endpoints
  • VPC Endpoint Services
  • VPC Peering Connection
  • VPN Gateways

실제로 분석해 보기

테스트 서버 구성

간단하게 서버 두 대를 만들어 보겠습니다. Terraform이 설치되어 있고, AWS Access Key와 Secret Access Key가 설정되어 있다고 가정해 볼게요.

우선 위 코드를 복사해서 임의의 파일로 저장합니다.

서버의 구성은 다음과 같습니다.

  • Source EC2: 어디에서든 80 포트로 진입이 가능하며, 모든 나가는 트래픽을 허용합니다.
  • Target Available EC2: 어디에서든 80 포트로 진입이 가능하며, 모든 나가는 트래픽을 허용합니다.
  • Target Unavailable EC2: 트래픽이 들어올 수 있는 방법은 없지만, 모든 나가는 트래픽을 허용합니다.

그리고 Terraform으로 서버를 생성해 줍니다.

terraform init
# (출력 결과 생략)
terraform apply -auto-approve
# (출력 결과 생략)

콘솔에 들어가 보면, 아래 스크린샷과 같이 서버 3 대가 생성된 것을 확인할 수 있습니다.

생성된 각 인스턴스의 ID를 메모하는 것을 권장합니다.

테스트 해 보기

콘솔에서 ‘Reachability Analyzer’를 검색해서 실행합니다.

영어 콘솔 기준으로 주황색의 ‘Create and Analyze Path’ 버튼을 누릅니다.

이제 하나씩 테스트 해 보겠습니다.

첫번째 테스트: 성공하는 경우

우선 다음과 같이 입력합니다.

Path Source

  • Source type: Instances (EC2 인스턴스를 의미)
  • Source: EC2 인스턴스 목록에서 source 표시가 있는 인스턴스를 선택
  • ‘Additional packet header configurations at source’ 항목을 펼쳐서 Destination port에 80 입력

Path Destination

  • Destination type: Instances (EC2 인스턴스를 의미)
  • Destination: EC2 인스턴스 목록에서 target_available 표시가 있는 인스턴스를 선택

Protocol: TCP 선택 (기본값)

그리고 아래로 내려가서 Create and analyze path 버튼을 클릭합니다.

화면이 바뀐 후에는 Pending 상태가 되는데, 잠깐 기다리면 아래와 같이 분석이 끝납니다.

조금 더 내려가면 Path details 항목이 나오는데, 어떤 과정을 거쳐서 목적지에 접근 가능한 지 알 수 있습니다.

과정을 정리해 보면, EC2 인스턴스에 연결된 네트워크 인터페이스(ENI) → source 인스턴스의 보안 그룹 → target_available 인스턴스의 보안 그룹 → 타겟 인스턴스에 연결된 네트워크 인터페이스를 거쳐서 타겟 인스턴스와 통신하였음을 알 수 있습니다.

두번째 테스트: 실패하는 경우

이번에는 실패하는 경우를 테스트 해 보도록 하겠습니다. 다시 Reachability Analyzer로 돌아가서 Create and analyze path를 클릭합니다.

다음과 같이 입력합니다. 달라져야 하는 부분은 굵은 글씨로 표시했습니다.

Path Source

  • Source type: Instances (EC2 인스턴스를 의미)
  • Source: EC2 인스턴스 목록에서 source 표시가 있는 인스턴스를 선택
  • ‘Additional packet header configurations at source’ 항목을 펼쳐서 Destination port에 80 입력

Path Destination

  • Destination type: Instances (EC2 인스턴스를 의미)
  • Destination: EC2 인스턴스 목록에서 target_unavailable 표시가 있는 인스턴스를 선택

Protocol: TCP 선택 (기본값)

그리고 아래로 내려가서 Create and analyze path 버튼을 클릭합니다.

조금 기다리면, 아래 스크린샷과 같이 Not reachable로 표시되는 것을 볼 수 있습니다.

어느 지점에서 문제가 발생했는지 알아보고 싶으시다면 아래로 스크롤을 내려봅니다.

위의 스크린샷을 보시면 None of the ingress rules in the following security groups apply 라는 문구를 볼 수 있습니다. 이 인스턴스와 연결된 보안 그룹에는 ingress 규칙을 설정하지 않았는데요. 그렇기 때문에 접속에 실패하는 것이 당연합니다.

리소스 정리하기

모든 테스트가 끝났다면 사용한 리소스를 정리합니다.

terraform destroy -auto-approve
# (출력 결과 생략)
# 아래와 같은 결과가 나왔는지 꼭 확인하세요!
Destroy complete! Resources: 6 destroyed. 

마무리하며

Reachability Analyzer는 정말 편한 기능이지만, 아쉽게도 무료 서비스는 아닙니다. 서울 리전 기준으로 한번 분석을 수행할 때마다 $ 0.1 이 부과됩니다. 앞에서도 말씀드렸지만, 인스턴스 내부에 있는 애플리케이션이 트래픽을 차단하는 경우에는 Reachability Analyzer로 감지하기 어렵다는 단점도 있습니다. 이 부분을 고려하셔서 네트워크 문제를 해결해 보시기를 바라겠습니다.

읽어주셔서 감사합니다.