콘텐츠 전송 네트워크
Rust 프로그래밍 언어 사용자는 다양한 방식으로 프로젝트의 인프라와 상호작용합니다. 사용자는 프로젝트 웹사이트와 문서에 접속하고, 크레이트 인덱스를 조회하며, Rust 릴리스와 크레이트를 내려받습니다. 이러한 리소스는 Rust 프로젝트가 호스팅하며 콘텐츠 전송 네트워크(CDN)를 통해 제공됩니다.
이 문서에서는 CDN을 사용하는 이유와 용도, 그리고 CDN을 어떻게 구성했는지를 설명합니다.
목표
인프라에서 CDN을 사용하는 목표는 다음 세 가지입니다:
- 더 저렴한 요금과 캐싱을 통해 아웃바운드 트래픽 비용을 절감합니다
- 오리진 서버의 부하를 줄여 컴퓨팅 자원을 절약합니다
- 일부 리소스의 레거시 URL을 재작성할 수단을 제공합니다
비용 절감
오픈 소스 프로젝트로서 우리는 인프라 비용에 매우 신경을 써야 합니다. 아웃바운드 트래픽은 월별 청구서에서 단연 가장 비싼 항목 중 하나이며, Rust의 인기가 높아질수록 계속 증가할 항목입니다.
클라우드 제공업체는 일반적으로 서비스에 따라 아웃바운드 트래픽에 서로 다른 요금을 부과합니다. 예를 들어, Amazon S3에서 데이터를 직접 제공하는 것이 같은 데이터를 Amazon CloudFront 배포를 통해 제공하는 것보다 비쌉니다. 이러한 이유로 현재는 캐싱과 같은 CDN의 다른 기능을 활용할 수 없는 서비스에도 기본적으로 CDN을 사용합니다.
인프라
프로젝트 리소스의 대부분은 AWS에 호스팅됩니다. 정적 콘텐츠는 Amazon S3에 저장되고, 동적 콘텐츠는 서버에서 로드됩니다. 두 유형의 콘텐츠 모두 Amazon CloudFront와 Fastly CDN을 통해 제공됩니다.
사용자가 리소스에 접근할 때, 예를 들어 크레이트를 내려받으려 할 때, 사용자는 CDN을 통해 해당 리소스에 접근합니다. 각 배포는 도메인 이름을 구성 및 백엔드(오리진이라고 함)에 매핑합니다. 예를 들어, static.crates.io에서 크레이트를 내려받으면 S3 버킷에서 크레이트를 가져온 뒤 이후 요청에 대비해 캐시하는 배포를 거치게 됩니다.
┌──► S3 (static content)
│
User ───────► CDN ────┤
│
└──► Server (dynamic content)
배포
배포는 여러 개가 있으며, 모두 rust-lang/simpleinfra 저장소에서 구성됩니다. 그러나 사용량은 배포마다 매우 고르지 않습니다. 다음 배포들은 트래픽과 생태계에 대한 중요도 양쪽 측면에서 프로젝트에 가장 중요한 배포입니다.
Rust 릴리스
사용자가 Rust를 설치하거나 업데이트할 때마다 미리 컴파일된 바이너리를 static.rust-lang.org에서 내려받습니다. CI/CD 파이프라인에서 Rust를 설치할 때도 마찬가지이며, 이 때문에 이 배포의 트래픽 양이 단연 가장 많습니다.
Rust 바이너리는 정적이며 Amazon S3에 저장되고, 그곳에서 CDN을 통해 제공됩니다. 릴리스 채널 매니페스트에 대해 지원되는 공개 레이아웃은 릴리스 채널 레이아웃에 문서화되어 있습니다.
static.rust-lang.org의 배포에는 AWS Lambda 함수에서 실행되는 사용자 지정 라우터가 있습니다. 이 라우터는 릴리스의 파일 목록을 조회하는 기능을 제공하며, rustup.sh의 레거시 URL을 재작성합니다.
Rust 릴리스의 캐시는 매일 밤(nightly) 무효화됩니다.
크레이트
Rust 릴리스와 마찬가지로, 크레이트도 static.crates.io에서 정적 콘텐츠로 제공됩니다. 우리 인프라에서 두 번째로 큰 배포이기는 하지만, 릴리스 배포보다는 훨씬 작습니다.
크레이트는 정적이며 Amazon S3에 저장되고, CloudFront 배포를 통해 제공됩니다.