Media CDN은 콘텐츠 전송, 캐시 오프로드, 원본 보호, 요청 승인, Google Cloud 외부 애플리케이션 부하 분산기, Logging, Monitoring 플랫폼과의 통합을 제공합니다.
Media CDN은 여러 REST API 리소스를 제공합니다.
EdgeCacheService
: 클라이언트 대상 구성(TLS, IP 주소 지정), 라우팅, CDN 구성(캐시 모드, TTL, 서명), 보안 정책을 지원합니다.EdgeCacheOrigin
: HTTP 기반 원본에 대한 원본별 구성을 지원하고 콘텐츠를 사용할 수 없거나 도달할 수 없을 때의 재시도 조건을 지원합니다. 예를 들어 중복된 동영상 패키지 도구 구성의 일부입니다.- (선택사항)
EdgeCacheKeyset
: 인프라/CMS별로 클라이언트 요청이 서명되었는지 검증하기 위해 사용되는 공개 키 집합을 포함합니다.EdgeCacheKeysets
는EdgeCacheService
와 연결되어 있으며 여러 서비스에서 사용할 수 있습니다.
이러한 리소스는 EdgeCacheService
종료 트래픽, 다른 EdgeCacheOrigins
에 대한 라우팅을 보여주는 다음 예시에 표시되어 있습니다.
권한
Media CDN 리소스를 만드는 데 필요한 Identity and Access Management 권한이 있어야 합니다. Media CDN에는 다음과 같은 사전 정의된 IAM 역할이 포함되어 있습니다.
roles/networkservices.edgeCacheAdmin
roles/networkservices.edgeCacheUser
roles/networkservices.edgeCacheViewer
필수 서비스 사용 설정
Media CDN 서비스를 구성하고 배포하려면 프로젝트에 대해 Network Services API와 Certificate Manager API를 모두 사용 설정해야 합니다.
콘솔
gcloud
Network Services API를 사용 설정합니다.
gcloud services enable networkservices.googleapis.com
Certificate Manager API를 사용 설정합니다.
gcloud services enable certificatemanager.googleapis.com
서비스 사용 설정 및 사용 중지에 대한 자세한 내용은 서비스 사용 문서를 참조하세요.
구성 예시
다음 리소스 목록은 대표적인 Media CDN 구성을 설명합니다.
EdgeCacheOrigin
:- 객체가 Cloud Storage에 없거나(예: HTTP 404) 5xx 오류가 발생했을 때 대체 원본(AWS S3)에 대해 캐시 가져오기를 재시도하는 Cloud Storage 기반 원본입니다.
다음을 포함하는 하나의
EdgeCacheKeyset
:- 서명된 요청을 검증하는 데 사용되는 2개의 Ed25519 공개 키
- 구성 예시에서는 매월 키를 순환하여 2개의 키를 프로덕션 상태로 유지할 수 있습니다.
다음을 포함하여 2개의 경로가 있는 하나의
EdgeCacheService
:- 짧은 캐시 TTL과 함께 Cloud Storage 원본과 연결된 매니페스트 경로
- 서명된 요청으로 보호되고, Cloud Storage 원본과 연관되어 있고, 모든 응답을 캐시하도록 구성된 동영상 세그먼트의 경로
IPv4, IPv6, 로깅 사용 설정(기본값), 관리형 SSL 인증서 구성
다음 예시에서는 이 구성에 대한 gcloud
결과를 보여줍니다.
gcloud edge-cache origins describe prod-media-origin
id: "2295067926314745283" creationTimestamp: "2019-11-13T09:53:48.757-08:00" name: "prod-media-origin" description: "" originAddress: "gs://bucket_name/" failoverOrigin: "s3-origin" retryConditions: [HTTP_5XX, NOT_FOUND] originProtocol: HTTP2 timeouts: connectTimeout: 5s maxAttemptsTimeout: 10 responseTimeout: 6s
id: "2295067926314745283" creationTimestamp: "2019-11-13T09:53:48.757-08:00" name: "s3-origin" description: "" originAddress: "media.example.com.s3.amazonaws.com" retryConditions: [HTTP_5XX, NOT_FOUND] originProtocol: HTTP2
gcloud edge-cache keysets describe prod-keyset
id: "2295067926314745283" creationTimestamp: "2019-11-13T09:53:48.757-08:00" name: "prod-keyset" publicKeys: - name: "sept-2020-key" value: "DThVLjhAKm3VYOvLBAwFZ5XbjVyF98Ias8NZU0WEM9w=" - name: "aug-2020-key" value: "3nQa82ScYgDDAxJrKCqumSEg60VNODGR5dGAveJWsw4="
gcloud edge-cache services describe prod-media-service
name: "prod-media-service" edgeSslCertificates: - "media-example-com-cert" - "video-serving-example-com-cert" requireTls: true routing: hostRules: - description: "prod hostnames" hosts: - "media.example.com" - "video-serving.example.net" pathMatcher: "routes" pathMatchers: - name: "routes" routeRules: - priority: 1 description: "prod video segments" origin: "prod-media-origin" matchRules: - pathTemplateMatch: "/**.ts" # HLS segments - pathTemplateMatch: "/**.m4s" # DASH / CMAF segments routeAction: cdnPolicy: cacheMode: "FORCE_CACHE_ALL" clientTtl: 3600s defaultTtl: 86400s signedRequestMode: REQUIRE_SIGNATURES signedRequestKeySet: "prod-keyset" headerAction: responseHeadersToAdd: - headerName: cache-status headerValue: "{cdn_cache_status}" - headerName: proxy-status headerValue: "{proxy_status}" - priority: 2 description: "prod manifest endpoints" origin: "prod-media-origin" matchRules: - pathTemplateMatch: "/**.m3u8" # HLS playlists - pathTemplateMatch: "/**.mpd" # DASH manifests routeAction: urlRewrite: pathPrefixRewrite: "/output/manifests" cdnPolicy: cacheMode: "CACHE_ALL_STATIC" clientTtl: 10s defaultTtl: 30s maxTtl: 120s headerAction: responseHeadersToAdd: - headerName: cache-status headerValue: "{cdn_cache_status}" - headerName: proxy-status headerValue: "{proxy_status}" - priority: 3 # catch all routes should be the lowest priority route description: "catch all route" origin: "prod-media-origin" matchRules: - prefixMatch: / headerAction: responseHeadersToAdd: - headerName: cache-status headerValue: "{cdn_cache_status}" - headerName: proxy-status headerValue: "{proxy_status}"
Media CDN의 구성 옵션
Media CDN을 구성하려면 다음 도구를 사용할 수 있습니다.
- Google Cloud 콘솔
- 가져온 YAML 또는 JSON 파일
- 직접 API
Google Cloud 콘솔 사용
Google Cloud 콘솔에서 Media CDN을 구성하는 방법을 설명하는 내용은 빠른 시작을 참조하세요.
구성 가져오기 및 내보내기
gcloud CLI를 사용하면 YAML 또는 JSON 파일에서 구성 내보내기 및 가져오기를 수행하고 지속적 배포 시스템 또는 코드형 인프라 도구를 사용해서 통합을 지원할 수 있습니다. 구성을 복사하고, 프로덕션 환경을 업데이트하기 전에 스테이징 환경에서 격리된 서비스를 테스트하고, 버전 제어에 구성 스냅샷을 저장할 수 있습니다.
출력 전용 필드는 가져오지 않고 구성을 가져올 때 명시적으로 제외됩니다. 구체적으로는 다음과 같습니다.
- IP 주소는 각 서비스에 전용으로 사용되므로 가져오지 않습니다. 서비스가 IP 주소를 공유할 수 없습니다.
- 리소스의
selfLink
는 리소스 이름을 기반으로 합니다. - 리소스의
id
는 자동으로 생성됩니다.
EdgeCacheOrigin
또는 EdgeCacheKeyset
서비스를 내보내려면 각 리소스에 대해 export
하위 명령어를 사용합니다. 예를 들어 서비스 구성을 내보내려면 다음 안내를 따르세요.
gcloud edge-cache services export SERVICE_NAME \ --destination=my-service.yaml
Exported [projects/my-project/locations/global/edgeCacheServices/SERVICE_NAME] to 'my-service.yaml'.
마찬가지로 새 서비스를 만들거나 기존 서비스를 바로 업데이트하기 위해 기존 서비스 구성을 가져올 수 있습니다.
gcloud edge-cache services import new-staging-service \ --source=my-service.yaml
비동기 API 작업 사용
기본적으로 리소스를 생성, 업데이트, 삭제하는 gcloud
명령어는 작업이 완료될 때까지 대기한 후 작업이 완료된 후(성공 및 실패)에만 결과를 반환합니다. REST API는 기본적으로 비동기적으로 수행됩니다.
일부 경우에는 이러한 요청을 비동기적으로 수행해야 할 수 있습니다. --async
플래그를 제공하면 명령어가 작업 ID를 사용해서 즉시 반환할 수 있습니다. 이 ID를 사용하여 태스크가 성공했는지, 오류를 반환했는지, 어떤 오류 메시지가 반환되었는지 확인할 수 있습니다.
개별 작업(ID별)을 조사하여 오류를 자세히 파악합니다. 예를 들어 logConfig.enable = true
를 설정하지 않고 logConfig.sampleRate
를 구성한 경우 다음 오류 반환을 예상할 수 있습니다.
gcloud edge-cache operations describe operation-1611525680496-5b9ac8fbb7f58-90a7a822-f0c1e8c6
done: true error: message: "Logs sample rate must not be specified without enabling logging." name: projects/my-project/locations/global/operations/operation-1611525680496-5b9ac8fbb7f58-90a7a822-f0c1e8c6
최근 작업, 상태, 완료를 모두 확인하려면 다음 명령어를 실행하면 됩니다.
gcloud edge-cache operations list
END_TIME ID TARGET DONE operation-1611095421009-5b9486244bf21-cc6b5924-628b8e2a True operation-1611096056610-5b94888273fe6-2da85286-8c810f8e True operation-1611095551517-5b9486a0c251e-c2e1bbbb-de4aa8a5 True