인스턴스에 EIP(Elastic IP)

도은호·2025년 9월 23일

terraform

목록 보기
18/32

1) EIP란?

  • EIP(Elastic IP) = AWS가 제공하는 고정(Static) 공인 IPv4 주소 한 개.
    인스턴스(정확히는 ENI: 네트워크 인터페이스)의 프라이빗 IP에 1:1로 매핑해 외부에서 접속할 수 있게 함. 필요하면 다른 인스턴스로 재할당(리맵) 가능해서 장애 시 빠른 IP 승계에 좋아요. (AWS 문서)
  • 인터넷 통신 전제: 퍼블릭 서브넷(IGW 경로) + SG/NACL 허용이 있어야 외부↔내부 통신이 돼요. EIP만 붙였다고 인터넷이 열리는 건 아님. (AWS 문서)

언제 쓰나?

  • 고정 IP가 꼭 필요(고정 방화벽 허용목록, 온프레미스 연동 등)
  • 퍼블릭 IP가 멈춤/시작에도 안 바뀌길 원할 때
  • 인스턴스 교체 시 같은 IP를 재사용하고 싶을 때

2) Terraform 예제: EC2에 EIP 붙이기(서울 리전 기준)

versions.tf

terraform {
  required_version = "~> 1.9"
  required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } }
}
provider "aws" { region = "ap-northeast-2" }

main.tf

# (예시) 보안그룹: 22/80 열기
resource "aws_security_group" "web" {
  name   = "web-sg"
  vpc_id = var.vpc_id
  ingress { from_port=22 to_port=22 protocol="tcp" cidr_blocks=["0.0.0.0/0"] }
  ingress { from_port=80 to_port=80 protocol="tcp" cidr_blocks=["0.0.0.0/0"] }
  egress  { from_port=0  to_port=0  protocol="-1"  cidr_blocks=["0.0.0.0/0"] }
}

# EC2 (퍼블릭 서브넷에 생성)
resource "aws_instance" "web" {
  ami                         = data.aws_ssm_parameter.al2023.value
  instance_type               = "t3.micro"
  subnet_id                   = var.public_subnet_id  # IGW 경로 있는 서브넷
  vpc_security_group_ids      = [aws_security_group.web.id]
  associate_public_ip_address = false                 # 임시 퍼블릭 IP는 끔 (EIP만 쓸 거라서)
  tags = { Name = "web-with-eip" }
}

# 1) EIP "할당"(Allocation) - 리전에 공인 IPv4 확보
resource "aws_eip" "web" {
  domain = "vpc" # 반드시 VPC
  tags   = { Name = "web-eip" }
}

# 2) EIP "연결"(Association) - 인스턴스(혹은 ENI)에 매핑
resource "aws_eip_association" "web" {
  allocation_id = aws_eip.web.id
  instance_id   = aws_instance.web.id
  # 대신 network_interface_id를 써서 특정 ENI/프라이빗 IP에 연결할 수도 있음
}

output "eip" { value = aws_eip.web.public_ip }

data&vars.tf (예시 AMI/입력)

data "aws_ssm_parameter" "al2023" {
  name = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64"
}
variable "vpc_id"            { type = string }
variable "public_subnet_id"  { type = string }

참고: aws_eipinstance 인자를 직접 쓰는 방법도 있지만, 분리된 aws_eip_association 리소스를 권장(명확한 의도/변경 추적). (AWS 문서)


3) 실행 & 확인

terraform init
terraform plan -out=plan.bin
terraform apply plan.bin
terraform output eip
# 브라우저/CLI로 확인
curl http://$(terraform output -raw eip)

추가 확인(AWS CLI):

aws ec2 describe-addresses --public-ips $(terraform output -raw eip)

SSH 접속(예: Amazon Linux)

ssh ec2-user@$(terraform output -raw eip)

통신 안 되면: 서브넷 라우트(0.0.0.0/0 → IGW), SG/NACL 규칙을 우선 점검하세요. (AWS 문서)


4) 흔한 실수/체크리스트

  • 퍼블릭 서브넷인가? (라우트테이블이 IGW를 가리킴) (AWS 문서)
  • SG 인바운드/아웃바운드, NACL 허용? (22/80 등 필요한 포트) (AWS 문서)
  • 같은 리전의 EIP를 같은 리전 인스턴스에 연결했는가
  • ENI 다중 프라이빗 IP 사용 시, 어느 IP에 매핑할지 명확히(ENI + Private IP 지정) (AWS 문서)
  • 임시 퍼블릭 IP와 중복 사용하지 않기(associate_public_ip_address=false 추천)

5) 비용/제한(2024~)

  • 공인 IPv4(EIP 포함) 과금: 2024-02-01부터 모든 Public IPv4$0.005/시간 과금(일부 Free Tier 예외). 할당만 해도, 혹은 붙여서 써도 과금됨. 비용 최적화 필요. (Amazon Web Services, Inc.)
  • 기본 할당량: 리전당 5개(증설 요청 가능). NAT GW 등도 EIP를 소모하니 총량 관리하기. (AWS 문서)

6) EIP vs NAT 게이트웨이 헷갈림 주의

  • EIP: 인스턴스(또는 ENI/NLB 등)에 붙여서 인바운드/아웃바운드 인터넷 IP를 고정.
  • NAT GW: 프라이빗 서브넷 → 인터넷 아웃바운드 프록시(퍼블릭 서브넷+EIP 필요). 목적이 다름. (AWS 문서)

요약

EIP 할당은 “리전에 고정 공인 IP 예약”이고, **연결(Association)**은 그 IP를 인스턴스/ENI에 매핑하는 것.
인터넷 접근엔 퍼블릭 서브넷+IGW+보안 규칙이 필수, 2024년부터는 공인 IPv4 자체가 과금되니 꼭 필요한 곳에만 쓰자. (AWS 문서)

profile
`•.¸¸.•´´¯`••._.• 🎀 𝒸𝓇𝒶𝓏𝓎 𝓅𝓈𝓎𝒸𝒽💞𝓅𝒶𝓉𝒽 🎀 •._.••`¯´´•.¸¸.•`

0개의 댓글