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 の両方を有効にする必要があります。
Console
gcloud
Network Services API を有効にします。
gcloud services enable networkservices.googleapis.com
Certificate Manager API を有効にします。
gcloud services enable certificatemanager.googleapis.com
サービスの有効化と無効化の詳細については、Service Usage のドキュメントをご覧ください。
構成の例
次のリソースリストは、代表的な Media CDN 構成を示しています。
An
EdgeCacheOrigin
:- オブジェクトが Cloud Storage にない場合(HTTP 404 など)、または 5xx エラーが発生した場合、代替送信元(AWS S3)に対してキャッシュ取得を再試行する Cloud Storage ベースの送信元を取得します。
1 つの
EdgeCacheKeyset
。これには次のものが含まれます。- 署名付きリクエストの検証に使用する 2 つの Ed25519 公開鍵。
- この構成例では、鍵を毎月ローテーションし、本番環境で 2 つの鍵を保持できます。
次の 2 つのルートを持つ 1 つの
EdgeCacheService
- Cloud Storage 送信元に関連付けられたマニフェストのルートで、短いキャッシュ TTL を設定します。
- 署名付きリクエストによって保護され、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 Console
- インポートされた YAML ファイルまたは JSON ファイル
- API を直接
Google Cloud Console を使用する
Google Cloud コンソールで Media CDN を構成する方法については、quickstartをご覧ください。
構成のインポートとエクスポートを行う
gcloud CLI を使用すると、YAML ファイルまたは JSON ファイルから構成をエクスポートおよびインポートして、継続的デリバリー システムとの統合を有効にできます。また、infrastructure-as-code ツールを使用してインポートすることもできます。構成を複製したり、本番環境を更新する前にステージング環境で分離されたサービスをテストしたり、構成のスナップショットをバージョン管理にしたりできます。
出力専用フィールドはインポートされず、構成をインポートする際に暗黙的に除外されます。特に、以下の点に注意してください。
- 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