콘텐츠 전송 네트워크
Rust 프로그래밍 언어 사용자는 다양한 방식으로 프로젝트의 인프라와 상호작용합니다. 이들은 프로젝트의 웹사이트와 문서에 접근하고, 크레이트 인덱스를 조회하며, Rust 릴리스와 크레이트를 다운로드합니다. 이러한 리소스는 Rust 프로젝트가 호스팅하며 콘텐츠 전송 네트워크 (CDN)를 통해 제공됩니다.
이 문서는 우리가 CDN을 사용하는 이유, 무엇에 사용하는지, 그리고 어떻게 설정했는지를 설명합니다.
목표
우리가 인프라에서 CDN을 사용하는 목표는 세 가지입니다:
- 더 저렴한 요금제와 캐싱을 통해 아웃바운드 트래픽 비용을 절감합니다
- 오리진 서버의 부하를 줄여 컴퓨팅 자원을 절약합니다
- 일부 리소스에 대한 레거시 URL을 재작성할 수 있는 방법을 제공합니다
비용 절감
오픈소스 프로젝트로서, 우리는 인프라 비용에 매우 신경을 써야 합니다. 아웃바운드 트래픽은 단연 월간 청구서에서 가장 비용이 많이 드는 항목 중 하나이며, Rust가 더 인기를 얻을수록 계속 증가할 항목입니다.
클라우드 제공업체는 일반적으로 서비스에 따라 아웃바운드 트래픽에 서로 다른 요금을 부과합니다. 예를 들어, Amazon S3에서 데이터를 직접 제공하는 것은 Amazon CloudFront 배포를 통해 동일한 데이터를 제공하는 것보다 더 비쌉니다. 이것이 우리가 캐싱과 같은 CDN의 다른 기능을 활용할 수 없는 서비스에서도 이제 기본적으로 CDN을 사용하는 이유입니다.
인프라
프로젝트 리소스 대부분은 AWS에서 호스팅됩니다. 정적 콘텐츠는 Amazon S3에 저장되는 반면, 동적 콘텐츠는 서버에서 로드됩니다. 두 유형의 콘텐츠 모두 CDN인 Amazon CloudFront와 Fastly를 통해 제공됩니다.
사용자가 리소스에 접근할 때, 예를 들어 크레이트를 다운로드하려고 할 때, 이들은 CDN을 통해 리소스에 접근하게 됩니다. 서로 다른 distribution은 도메인 이름을 구성 및 백엔드(origin이라고 함)에 매핑합니다. 예를 들어, static.crates.io에서 크레이트를 다운로드하는 것은 S3 버킷에서 크레이트를 가져온 다음 향후 요청을 위해 캐싱하는 distribution을 거칩니다.
┌──► S3 (static content)
│
User ───────► CDN ────┤
│
└──► Server (dynamic content)
Distributions
많은 배포판이 있으며, 이들은 모두 rust-lang/simpleinfra 저장소에 설정되어 있습니다. 하지만 이들의 사용량은 매우 고르지 않게 분포되어 있습니다. 다음 distribution들은 트래픽 양과 생태계에 대한 중요성 양 측면에서 프로젝트에 가장 중요한 것들입니다.
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 배포를 통해 제공됩니다.