이그레스 IP 주소 (Egress IP addresses)
기본적으로 Fly Machines에서 나가는(이그레스) IP는 불안정해서 바뀔 수 있어요. 일부 외부 서비스는 소스 IP를 허용 목록(allowlist)으로 관리하기 때문에 고정 이그레스 IP가 필요할 수 있어요. 이 페이지에서는 앱 범위(app-scoped)와 머신 범위 고정 이그레스 IP의 할당, 관리, 마이그레이션 방법을 설명해요.
출처: 문서
본문
개요 (Overview)
- 기본적으로 Fly Machines에서 나가는(아웃바운드, egress) IP는 불안정하며 바뀔 수 있어요.
fly ips allocate-egress로 앱에 고정 이그레스 IP(IPv4와 IPv6 모두)를 할당할 수 있어요.- 앱 범위 고정 이그레스 IP는 리전 단위로 적용돼요. Machines가 있는 각 리전마다 하나씩 필요해요.
- 고정 이그레스 IP에는 트레이드오프가 있어요. 비용이 더 들고 동시에 실행할 수 있는 Machines 수가 제한돼요.
- 레거시 머신 범위 고정 이그레스 IP도 여전히 사용할 수 있지만, 제한 사항과 괴로운 특성 때문에 더 이상 권장되지 않아요.
이그레스 IP가 왜 중요한가
일부 외부 서비스(API, 데이터베이스, 결제 제공자)는 소스 IP 허용 목록을 요구해요. 고정 이그레스 IP가 없으면 Machine 수명 주기나 인프라 변경으로 인해 Fly Machines의 아웃바운드 IP가 바뀔 수 있어요.
- Machines는 대상에 AAAA 레코드가 있고 애플리케이션이 그것을 선호할 때 IPv6로 이그레스하는 경우가 많아요. 예를 들어
curl은 가능하면 IPv6를 먼저 시도하고 필요하면 IPv4로 폴백해요. Fly가 IPv6를 강제하지는 않지만 많은 앱이 사용 가능할 때 그것을 사용해요. - IPv4 트래픽은 NAT되며 변할 수 있어요. 즉 소스 IP 주소가 호스트에 의해 재작성되고, 어떤 IP를 얻게 될지는 머신이 어디에서 실행되거나 재시작되는지에 따라 달라질 수 있어요.
- 타사 서비스에서 IP를 허용 목록으로 관리한다면 고정 이그레스가 필요해요.
고정 이그레스 IP (앱 범위, App-Scoped)
앱 범위 고정 이그레스 IP는 같은 앱에 속한 리전의 여러 Machines가 공유할 수 있고, Machines가 다시 생성되어도 삭제되지 않아요. 레거시 머신 범위 고정 이그레스 IP보다 이것이 권장돼요.
앱 범위 고정 이그레스 IP 할당
fly ips allocate-egress --app <app-name> -r <region>
이것은 해당 리전의 앱에 IPv4와 IPv6 고정 이그레스 주소 한 쌍을 할당해요.
앱에 Machines가 여러 리전에 있다면 리전마다 최소 1개의 앱 범위 고정 이그레스 IP 주소를 할당해야 해요. Machines는 자기 자신의 리전에 할당된 고정 이그레스 IP만 사용할 수 있어요.
같은 리전에 여러 쌍의 IPv4와 IPv6 고정 이그레스 주소를 할당할 수 있어요. Machines는 해당 리전에서 사용 가능한 모든 고정 이그레스 IP 중에서 한 쌍을 무작위로 선택해요.
조회 및 관리
fly ips list
fly ips release-egress <ip-address>
앱 범위 이그레스 IP는 명시적으로 fly ips release-egress를 실행할 때만 해제돼요. Machine 파괴와 배포를 거쳐도 유지돼요.
청구 (Billing)
각 앱 범위 IPv4 고정 이그레스 주소는 시간 단위로 청구되어 월 $3.60예요. IPv6 주소는 IPv4와 함께 할당되며 별도로 청구되지 않아요.
주의 사항 (Caveats)
- 각 고정 이그레스 IP는 최대 64개의 Machines를 지원할 수 있어요. 한 리전에서 64개보다 많은 Machines가 필요하면 여러 고정 이그레스 IP를 할당해야 해요.
- 앱 범위 고정 이그레스 IP를 사용할 때 Machine은 각 대상 IP 주소에 대해 최대 1024개의 동시 연결을 만들 수 있어요. 총 동시 연결 수에는 제한이 없어요.
대부분의 앱에서 이는 문제가 되지 않을 거라고 생각해요. 하지만 이 제한이 사용 사례에 걸림돌이 된다면 언제든지 저희에게 얘기해 주세요!
- 한 리전에 여러 고정 이그레스 IP가 할당된 경우, 현재 각 머신이 정확히 어떤 IP를 사용할지 지정할 방법이 없어요.
- 이그레스 IP가 Machines에 적용될 때 지연이 있을 수 있어요:
- 새 이그레스 IP를 할당한 직후, 짧은 지연 후 이 리전의 모든 기존 Machines에 적용돼요. 이런 경우 여러 쌍의 고정 이그레스 IP를 할당해도 도움이 되지 않아요.
- 이미 이그레스 IP가 할당된 앱에서 새 Machine을 만들 때, Machine이 이그레스 IP를 사용할 수 있을 때까지 지연이 있을 수 있어요. 이 지연은 Machines가 많거나 블루그린 배포 중에 더 두드러질 수 있어요. 여러 쌍의 고정 이그레스 IP를 할당하면 이 문제를 완화하는 데 도움이 돼요.
flyctl은 Machine 생성, 배포, IP 관리 중에 이러한 제한에 가까워지면 경고를 표시해요.
머신 범위 이그레스 IP와의 상호작용
앱 범위와 머신 범위 이그레스 IP는 함께 사용하도록 의도되지 않았어요.
Machine에 머신 범위 이그레스 IP가 있다면 같은 리전의 앱 범위 이그레스 IP보다 우선해요. 이 동작은 향후 바뀔 수 있어요.
고정 이그레스 IP (머신 범위, Machine-Scoped)
과거에는 앱이 아니라 개별 머신에 정적으로 바인딩되는 머신 범위 이그레스 IP를 지원했어요. 이 기능은 더 이상 사용되지 않으며(deprecated), 새 앱은 모두 앱 범위 고정 이그레스 IP를 사용해야 해요.
하지만 이미 머신 범위 고정 이그레스 IP가 할당되어 있다면 계속 동작하며 조회하고 관리할 수 있어요. 또한 그것을 앱 범위 이그레스 IP로 "승격(promote)"할 수도 있어요.
조회 및 관리
fly machine egress-ip list --app <app-name>
fly machine egress-ip release <machine-id> --app <app-name>
앱 범위 이그레스 IP로 마이그레이션
기존 머신 범위 이그레스 IP의 일부를 "승격"해 앱 범위로 만들어 머신 범위 이그레스 IP에서 앱 범위 이그레스 IP로 마이그레이션할 수 있어요. 이렇게 하면 외부 허용 목록 설정을 변경하지 않고도 앱 범위 이그레스 IP로 전환할 수 있어요.
승격 과정은 대부분 매끄럽지만, 이그레스 IP가 원래 머신에서 제거되어 앱에 재할당되는 동안 짧은 가동 중단 창이 발생할 수 있어요.
fly machine egress-ip promote <machine-id> --app <app-name>
승격된 이그레스 IP는 원래 머신의 리전을 유지해요. 앱에 Machines가 여러 리전에 있다면 각 리전마다 최소 하나를 승격하세요.
더 이상 필요하지 않은 남은 머신 범위 이그레스 IP도 제거해야 해요.
주의 사항 (Caveats)
레거시 고정 이그레스 IP는 앱 단위가 아니라 **머신 단위(per-machine)**이기 때문:
- 머신이 파괴되면 IP가 해제돼요.
- IP는 배포 간에 자동으로 이전되지 않아요.
- 블루그린 배포는 머신(과 그 IP)을 대체해요.
- 배포 시점의 작업(job)은 이그레스 라우팅을 우회할 수 있어요.
- 일부 리전에서는 추가 지연과 연결 문제가 발생할 수 있어요.
머신 범위 고정 이그레스 IP는 머신당 시간 단위로 청구돼요.
모범 사례 (Best Practices)
- 필요한 경우에만 고정 이그레스를 사용하세요.
- 이그레스 IP를 할당한 후 연결을 테스트하세요.
- 배포 중 마이그레이션 동안 실패를 모니터링하세요.