본문 바로가기
삵
Amazon Web Services

AWS 퍼블릭 IPv4 과금 줄이기

고고구마엔사이다·2026년 10월 23일·조회 0

얼마 전 월별 청구서를 살펴보다 'Public IPv4 Address'라는 항목이 꾸준히 올라와 있는 걸 발견했다. 2024년 2월부터 퍼블릭 IPv4 주소에 시간당 요금이 붙기 시작한 뒤로, 예전 습관대로 인스턴스마다 퍼블릭 IP를 달아 두면 쌓이는 비용이다. 금액 자체는 작지만 계정과 리전이 늘수록 무시하기 어려운 고정비가 된다. 이번 글에서는 이 항목을 줄이는 실무 순서를 정리한다.

결론부터 말하자면, 퍼블릭 IPv4는 쓰든 안 쓰든 개당 시간당 0.005달러가 붙으므로 주소 개수를 최소화하는 게 핵심이다. 미사용 EIP를 회수하고, SSH 접속은 SSM 세션 매니저로 바꾸고, 아웃바운드는 NAT 게이트웨이나 IPv6로 모으면 인스턴스 개별 퍼블릭 IP를 없앨 수 있다. 전체 사용량은 VPC IPAM의 Public IP Insights로 감사한다.

1. 퍼블릭 IPv4 과금 구조

2024년 2월 1일부터 AWS는 퍼블릭 IPv4 주소 하나당 시간당 0.005달러를 청구한다. 이 요금은 자원에 붙어 쓰이는 주소(In-use)와 할당만 해 두고 노는 주소(Idle)에 똑같이 적용된다. EC2 인스턴스에 자동으로 붙는 퍼블릭 IP, Elastic IP(EIP), 서비스가 관리하는 주소가 모두 대상이다. BYOIP(직접 가져온 IP 대역)는 예외다.

0.005달러를 한 달(730시간)로 환산하면 주소 하나당 약 3.65달러다. 열 개면 월 36.5달러 수준이고, 개발/운영 계정과 여러 리전에 흩어져 있으면 금방 커진다.

청구서에서는 다음 두 Usage Type으로 잡힌다.

  • PublicIPv4:InUseAddress - 자원에 연결돼 실제로 쓰이는 퍼블릭 IPv4
  • PublicIPv4:IdleAddress - 할당만 되고 연결되지 않은 유휴 퍼블릭 IPv4

과거에는 EIP가 인스턴스에 붙어 있으면 무료, 할당만 해 두고 안 쓰면 유료였다. 지금은 붙어 있어도 과금되므로 "EIP를 떼어 두면 공짜"라는 옛 감각은 더 이상 맞지 않는다.

2. 먼저 어디서 새는지 측정한다

줄이기 전에 현재 어떤 주소가 비용을 내고 있는지 확인한다. Cost Explorer를 USAGE_TYPE 차원으로 묶어 보면 위 두 Usage Type이 그대로 드러난다.

aws ce get-cost-and-usage \
  --time-period Start=2026-09-01,End=2026-10-01 \
  --granularity MONTHLY \
  --metrics UnblendedCost UsageQuantity \
  --group-by Type=DIMENSION,Key=USAGE_TYPE \
  --filter '{"Dimensions":{"Key":"USAGE_TYPE","Values":["PublicIPv4:InUseAddress","PublicIPv4:IdleAddress"]}}'

여기서 한 번 걸린다. Cost Explorer의 USAGE_TYPE 값은 리전 접두어가 붙는다. 예를 들어 서울 리전은 APN2-PublicIPv4:InUseAddress, 버지니아 북부는 USE1-PublicIPv4:InUseAddress 식이다. 접두어 없는 값으로 필터하면 결과가 비어 나올 수 있다. 접두어를 모를 때는 필터를 빼고 USAGE_TYPE으로만 그룹핑한 뒤, 출력에서 PublicIPv4가 들어간 행을 찾는 쪽이 확실하다.

aws ce get-cost-and-usage \
  --time-period Start=2026-09-01,End=2026-10-01 \
  --granularity MONTHLY \
  --metrics UnblendedCost \
  --group-by Type=DIMENSION,Key=USAGE_TYPE \
  --output text | grep -i publicipv4

금액은 환경마다 다르지만, 이 명령으로 In-use와 Idle이 각각 얼마씩 나오는지 윤곽을 잡을 수 있다. Idle 쪽 금액이 크면 미사용 EIP부터 정리하면 되고, In-use 쪽이 크면 인스턴스 퍼블릭 IP를 줄이는 작업이 효과가 크다.

3. 미사용 EIP 회수

가장 먼저 손대는 건 연결 안 된 EIP다. 할당만 해 두고 어디에도 붙지 않은 주소는 순수 낭비다. 연결되지 않은 EIP는 AssociationId가 비어 있으므로 다음처럼 뽑는다.

aws ec2 describe-addresses \
  --query 'Addresses[?AssociationId==`null`].[PublicIp,AllocationId]' \
  --output table
-------------------------------------
|         DescribeAddresses         |
+----------------+------------------+
|  3.35.xxx.xxx  | eipalloc-0a1b... |
|  13.125.xx.xx  | eipalloc-0c2d... |
+----------------+------------------+

정말 안 쓰는 주소인지 확인했으면 반환한다. 반환하면 그 시점부터 과금이 멈춘다.

aws ec2 release-address --allocation-id eipalloc-0a1b...

주의할 점이 하나 있다. 도메인 A 레코드나 방화벽 허용 목록에 그 IP를 박아 둔 경우, 반환하면 그 주소는 풀로 돌아가 남이 받을 수 있다. 외부에서 고정 IP로 참조되던 주소라면 반환 전에 참조 지점을 먼저 정리한다.

4. SSH 대신 SSM 세션 매니저

인스턴스에 퍼블릭 IP를 달아 두는 이유 중 가장 흔한 게 "SSH로 들어가려고"다. 이건 Systems Manager 세션 매니저로 대체할 수 있다. 세션 매니저는 SSM 에이전트가 AWS 엔드포인트로 아웃바운드 연결을 맺어 놓고, 그 통로로 터미널을 열어 주는 기능이다. 인바운드 포트를 열 필요도, 퍼블릭 IP를 붙일 필요도 없다.

필요한 것은 두 가지다. 인스턴스 역할에 AmazonSSMManagedInstanceCore 정책을 붙이고, SSM 에이전트가 동작하면 된다(Amazon Linux 2, Amazon Linux 2023에는 기본 포함).

# 연결 가능한 인스턴스 확인
aws ssm describe-instance-information \
  --query 'InstanceInformationList[].[InstanceId,PingStatus]' --output table

# 세션 시작
aws ssm start-session --target i-0abcd1234ef567890

프라이빗 서브넷에 두고 NAT도 쓰기 싫다면 인터페이스 VPC 엔드포인트 세 개(ssm, ssmmessages, ec2messages)를 만들어 준다. 그러면 인터넷 경로 없이 세션 매니저가 붙는다. 여기서 자주 막히는 지점이 엔드포인트의 보안 그룹인데, 인스턴스 서브넷에서 엔드포인트로 가는 443 인바운드가 허용돼 있어야 PingStatus가 Online으로 뜬다.

5. 아웃바운드는 NAT로 모으기

인스턴스가 밖으로 패키지를 받거나 API를 호출하려고 퍼블릭 IP를 달고 있는 경우가 많다. 이건 NAT 게이트웨이로 모으면 된다. NAT 게이트웨이는 퍼블릭 IPv4 하나를 쓰지만, 그 뒤에 있는 프라이빗 인스턴스 수십 대가 그 주소 하나를 공유해 밖으로 나간다. 주소 개수를 1로 줄이는 셈이다.

프라이빗 서브넷의 라우트 테이블에서 기본 경로를 NAT 게이트웨이로 보낸다.

aws ec2 create-route \
  --route-table-id rtb-0priv... \
  --destination-cidr-block 0.0.0.0/0 \
  --nat-gateway-id nat-0abcd...

다만 NAT 게이트웨이는 퍼블릭 IPv4 요금과 별개로 시간당 요금과 데이터 처리 요금이 붙는다. 인스턴스가 서너 대뿐이고 아웃바운드가 가끔이라면, NAT를 세우는 것보다 S3/ECR 같은 자주 쓰는 대상에 게이트웨이/인터페이스 엔드포인트를 두는 편이 쌀 수 있다. 트래픽이 꾸준하고 인스턴스가 많을 때 NAT가 유리하다.

6. IPv6로 주소 요금 자체를 없애기

IPv6 주소에는 시간당 요금이 없다. 새로 설계하는 VPC라면 듀얼 스택으로 구성해 아웃바운드를 IPv6로 빼면 퍼블릭 IPv4를 아예 안 쓸 수 있다. IPv6 아웃바운드는 송신 전용 인터넷 게이트웨이(egress-only internet gateway)를 통해 내보낸다. 이름 그대로 나가는 연결만 허용하고 밖에서 먼저 들어오는 연결은 막는, IPv6판 NAT 같은 자원이다.

aws ec2 create-egress-only-internet-gateway --vpc-id vpc-0abcd...

aws ec2 create-route \
  --route-table-id rtb-0priv... \
  --destination-ipv6-cidr-block ::/0 \
  --egress-only-internet-gateway-id eigw-0abcd...

현실적인 함정은 대상 서비스가 IPv6를 지원해야 한다는 점이다. 접속하려는 외부 API나 패키지 저장소가 IPv6 주소를 안 주면 결국 IPv4 경로가 필요하다. 그래서 완전 전환보다는 IPv6로 갈 수 있는 트래픽은 IPv6로 빼고, 남는 IPv4 트래픽만 NAT로 모으는 혼합 구성이 많다.

7. VPC IPAM으로 사용량 감사

개별 정리가 끝났으면 전체를 한눈에 봐야 한다. VPC IPAM(IP Address Manager)의 Public IP Insights는 조직 안 여러 계정과 여러 리전에 걸친 퍼블릭 IPv4 사용량을 모니터링, 분석, 감사하는 기능이다. 어떤 자원이 어떤 퍼블릭 IPv4를 쓰고 있는지, 그 자원에 어떤 보안 그룹이 붙어 있는지까지 보여 준다. Public IP Insights 자체는 무료다.

콘솔에서 VPC IPAM을 열고 Public IP Insights를 보면 EIP, EC2 퍼블릭 IP, 서비스 관리 주소가 목록으로 나온다. 여기서 연결된 자원이 없는 주소나, 오래 붙어만 있는 주소를 찾아 2절에서 본 Cost Explorer 수치와 맞춰 보면 어디를 더 정리할지 판단이 선다.

공식 설명은 "가시성 제공"까지다. 어떤 주소가 불필요한지 최종 판단은 운영자 몫이므로, Insights가 보여 주는 자원-보안그룹 연결을 보고 직접 결정한다.

8. 주의사항

  • EIP 반환은 되돌릴 수 없다. 외부 참조(DNS, 허용 목록, 파트너 방화벽)를 먼저 정리한 뒤 반환한다.
  • 세션 매니저로 전환한 뒤 퍼블릭 IP 자동 할당을 끄려면, 서브넷의 MapPublicIpOnLaunch를 false로 두거나 인스턴스 시작 시 퍼블릭 IP 미할당으로 띄운다. 이미 떠 있는 인스턴스의 자동 할당 퍼블릭 IP는 중지/시작 때 바뀌므로, 고정이 필요하면 설계를 다시 본다.
  • NAT 게이트웨이와 VPC 인터페이스 엔드포인트는 그 자체로 요금이 있다. 퍼블릭 IPv4 요금만 보고 바꿨다가 더 비싸지지 않도록 2절 수치와 비교한다.
  • IPv6 전환은 대상이 IPv6를 받아 주는지부터 확인한다. 안 되면 IPv4 경로를 남겨야 한다.

자주 묻는 질문

퍼블릭 IPv4 주소는 안 써도 요금이 나오나?

그렇다. 2024년 2월 1일부터 AWS는 자원에 붙어 쓰이는 주소(In-use)와 할당만 해 둔 유휴 주소(Idle)에 똑같이 시간당 0.005달러를 청구한다. 예전처럼 EIP를 인스턴스에 붙여 두면 무료인 규칙은 더 이상 적용되지 않는다.

퍼블릭 IPv4 하나에 월 얼마가 나오나?

시간당 0.005달러이므로 한 달 730시간 기준 주소 하나당 약 3.65달러다. 열 개면 월 36.5달러 수준이다. 계정과 리전이 여러 개로 흩어져 있으면 쌓이는 금액이 커진다.

SSH 접속 때문에 퍼블릭 IP가 필요한데 꼭 붙여야 하나?

아니다. Systems Manager 세션 매니저를 쓰면 인바운드 포트와 퍼블릭 IP 없이 터미널을 열 수 있다. 인스턴스 역할에 AmazonSSMManagedInstanceCore 정책을 붙이고 SSM 에이전트가 동작하면 된다. 프라이빗 서브넷이면 ssm, ssmmessages, ec2messages 인터페이스 엔드포인트를 두면 인터넷 경로 없이 연결된다.

Cost Explorer에서 퍼블릭 IPv4 비용 필터가 빈 결과로 나온다.

USAGE_TYPE 값은 리전 접두어가 붙기 때문이다. 서울은 APN2-PublicIPv4:InUseAddress 식이다. 접두어 없는 값으로 필터하면 안 잡힐 수 있으므로, 필터 없이 USAGE_TYPE으로 그룹핑한 뒤 출력에서 PublicIPv4가 들어간 행을 찾는 게 확실하다.

IPv6로 바꾸면 주소 요금을 완전히 없앨 수 있나?

IPv6 주소에는 시간당 요금이 없어 가능은 하다. 다만 접속하려는 외부 서비스가 IPv6를 지원해야 한다. 지원하지 않는 대상이 있으면 IPv4 경로가 남아야 하므로, IPv6로 갈 수 있는 트래픽만 IPv6로 빼고 나머지는 NAT로 모으는 혼합 구성이 현실적이다.

관련 글

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.