다른 배포 환경을 Fly.io에 연결하기 (Bridge your other deployments)
Fly.io의 프라이빗 네트워크와 기존 외부 서버를 WireGuard를 통해 연결하는 방법을 알려드려요. AWS 같은 클라우드 서비스나 온프레미스 장비를 Fly.io 앱과 안전하게 이어주면, 서비스를 점진적으로 Fly.io로 이전하거나 반대로 Fly.io 앱에서 외부 서비스에 접근할 수 있어요.
출처: 문서
본문
개요 (Overview)
때로는 Fly.io에서 프로덕션 환경을 문제없이 그대로 재현할 수 있어요. 하지만 어떤 경우에는 항목을 점진적으로 옮겨야 할 때도 있어요. Fly.io는 같은 조직에 속한 앱끼리 기본적으로 프라이빗 네트워킹을 제공하지만, 기존의 외부 서버를 이 프라이빗 네트워크에 쉽게 연결할 수도 있어요. 이렇게 하면 프라이빗 네트워크를 활용해 서비스를 점진적으로 이전할 수 있어요.
예를 들어 AWS에 기존 서비스가 있거나 RDS로 접근해야 하는 데이터베이스가 있다고 해 보죠. 그 AWS 인스턴스를 이용해 Fly Machines에서 그 외부 서비스로 트래픽을 전환할 수 있어요. 반대로 AWS나 노트북, 또는 여러분이 가진 다른 셀프 호스팅 서버에서 Fly 앱(Ollama 인스턴스 같은)에 접근할 수도 있어요. 아니면 지원 팀용 도구를 만들면서 온프레미스에 있는 특정 데이터베이스에 접근해야 할 수도 있겠죠.
Fly.io 프라이빗 네트워크는 내부적으로 WireGuard를 사용해요. 다른 컴퓨터를 이 네트워크에 연결할 때도 WireGuard로 연결하게 돼요. 많은 사람들이 여러 이유로 WireGuard를 쓰지만, 가장 주된 용도는 이와 같은 "사이트 투 사이트(site-to-site)" VPN이에요. 이 방식은 모든 트래픽을 Fly.io의 게이트웨이 서버를 통해 라우팅하지는 않지만, 어디서든 프라이빗 네트워크에 내부적으로 접근할 수 있게 해줘요.
네트워크들을 이어 붙이기 (Weaving the networks together)
대상 서버에 WireGuard가 설치되어 있는지 확인하세요. 설치 페이지에 자세한 내용이 있지만, Ubuntu 서버라면 다음만 하면 돼요:
sudo apt -y install wireguard
그게 끝나면 이제 바로 출발할 수 있어요!
노트북에서 fly wireguard create로 대상 서버의 설정을 만드세요. 다음 정보가 필요해요:
- 해당 서버를 가입시킬 조직(
personal이나 회사 이름 같은 것). - 피어(peer)를 만들 리전: 대상 컴퓨터와 가장 가까운 리전을 선택하세요.
- 어느 리전이 가장 가까운지 정말 모르겠다면, 시도해 볼 만한 마법 같은 명령이 있어요:
curl -Iso /dev/null -w '%header{fly-request-id}' https://fly.io | cut -d- -f2.
- 어느 리전이 가장 가까운지 정말 모르겠다면, 시도해 볼 만한 마법 같은 명령이 있어요:
- Fly 네트워크에서 그 컴퓨터에 사용할 이름(예: 호스트네임).
- 생성된 WireGuard 설정을 저장할 경로. 예를 들어
~/fly0.conf로 하면 홈 디렉토리에fly0.conf로 저장돼요.
예를 들어 personal 조직에 phantoon이라는 서버용 피어를 만든다고 해 볼게요. 저는 오타와에 살아서 가장 가까운 데이터센터는 yyz예요. 제 피어를 만들 명령은 이런 모양일 거예요:
fly wireguard create personal yyz phantoon ~/fly0.conf
fly0.conf 파일에는 WireGuard가 터널을 설정하는 데 필요한 모든 설정이 들어 있어요:
- 노드의 프라이빗 키
- 노드가 사용해야 할 로컬 IPv6 주소
- 프라이빗 네트워크용 DNS 서버
- WireGuard 게이트웨이의 주소, IP 대역, 공개 키
fly0.conf를 대상 컴퓨터의 /etc/wireguard로 복사하세요:
scp ~/fly0.conf root@phantoon.local:/etc/wireguard/fly0.conf
그런 다음 컴퓨터에(아마 SSH로) 접속해 부팅 시 WireGuard가 시작되도록 활성화하세요:
ssh root@phantoon.local
systemctl enable --now wg-quick@fly0.service
이렇게 하면 fly0라는 인터페이스가 생성돼요:
$ ip addr show fly0
4: fly0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet6 fdaa:0:641b:a7b:9285:0:a:1b02/120 scope global
valid_lft forever preferred_lft forever
이제 Machines API 서버 _api.internal에 ping을 시도해 보세요:
$ ping _api.internal -c 4
PING _api.internal (fdaa:0:641b::3) 56 data bytes
64 bytes from fdaa:0:641b::3: icmp_seq=1 ttl=64 time=10.4 ms
64 bytes from fdaa:0:641b::3: icmp_seq=2 ttl=64 time=39.2 ms
64 bytes from fdaa:0:641b::3: icmp_seq=3 ttl=64 time=83.7 ms
64 bytes from fdaa:0:641b::3: icmp_seq=4 ttl=64 time=123 ms
이것은 조직 내 앱과 Machines의 .internal 주소를 성공적으로 조회할 수 있다는 뜻이에요. 축하해요, 이제 연결됐어요!
프라이빗 네트워크 밖의 워크로드 접근하기 (Accessing workloads outside of your private network)
프라이빗 네트워크 밖의 워크로드(시크릿 저장소 같은 것)에 접근하려면 DNS 이름 peername._peer.internal을 사용하세요. 예를 들어 Fly 앱에서 phantoon 노드에 접근하려면 phantoon._peer.internal에 연결하면 돼요:
$ ping phantoon._peer.internal
PING phantoon._peer.internal (fdaa:0:641b:a7b:9285:0:a:1b02) 56 data bytes
64 bytes from phantoon._peer.internal (fdaa:0:641b:a7b:9285:0:a:1b02): icmp_seq=1 ttl=62 time=24.4 ms
64 bytes from phantoon._peer.internal (fdaa:0:641b:a7b:9285:0:a:1b02): icmp_seq=2 ttl=62 time=37.6 ms
64 bytes from phantoon._peer.internal (fdaa:0:641b:a7b:9285:0:a:1b02): icmp_seq=3 ttl=62 time=85.4 ms
64 bytes from phantoon._peer.internal (fdaa:0:641b:a7b:9285:0:a:1b02): icmp_seq=4 ttl=62 time=197 ms
숙제 (Homework)
ping이 동작하면 시작하기에 충분하지만, 이걸로 진짜 뭘 할 수 있는지 보고 싶다면 선택적인 숙제가 몇 가지 있어요:
- 같은 흐름으로 노트북/워크스테이션을 프라이빗 네트워크에 연결해 보세요 (Windows나 macOS를 쓴다면 GUI WireGuard 앱을 설치해야 할 수도 있어요).
- 앱의 9195 포트에 Prometheus 메트릭을 노출한 다음 노트북에서
curl yourapp.internal:9195/metrics로 현재 메트릭을 가져와 보세요. - 노트북에 Postgres를 어떻게든 설치해 보세요. 그리고 WireGuard를 통해 노트북에 있는 그 Postgres 데이터베이스에 연결하도록 앱을 구성해 보세요.
- 프라이빗 네트워크에 다른 컴퓨터 몇 대를 연결해 보세요. 그중 한 대에 Minecraft 서버를 설치하고 함께 플레이해 보세요.
힌트: 방화벽에서 프라이빗 네트워크 주소를 허용해야 할 수도 있어요. 사용 중인 방화벽 도구의 문서를 확인하고 fly0에서 오는 트래픽을 "내부(internal)" 인터페이스인 것처럼 허용하세요.
관련 자료 (Related Reading)
- WireGuard로 프라이빗 네트워크에 연결하기 노트북이나 외부 서버를 WireGuard를 통해 Fly.io 프라이빗 네트워크에 연결하는 방법을 보여주는 가이드.
- 프라이빗 네트워킹 Fly의 내부 IPv6 메시(6PN) 개요, 앱끼리 프라이빗하게 통신하는 방식, WireGuard 기반 터널이 어떻게 통합되는지.
- 커스텀 프라이빗 네트워크 조직 내에서 별도의 프라이빗 네트워크를 만들어 테넌트, 앱, 서비스를 격리하는 방법 — 외부 인프라를 연결할 때 유용해요.