1

我有几个视频内容,通过我的 Django Google App Engine 应用程序通过我的 Google Cloud Storage 共享,这些视频内容带有与到期时间相关的签名 url 机制。

def get_signed_url(self, entity):
    blob = bucket.get_blob(entity.url)
    logging.info(entity.url)
    expiration_time = timezone.now() + timedelta(minutes=120)
    signed_url = blob.generate_signed_url(expiration_time)
    logging.info(signed_url)

    return signed_url

尽管已在 [此处][1] 中解释了 GCS 和 Google Cloud CDN 的可能使用关系,但这是否适用于通过 Google Cloud Storage 流式传输视频内容(MP4 或带有 MP4 的 MPEG-DASH),因为它被提到具有隐式 CDN 本身。

如果使用 Google CDN 是广播在线视频内容的一种更明智的方式,那么实现这一目标的最佳策略是什么,我如何在当前的 Google Cloud Storage 实施之上使用 Google Cloud CDN?

4

2 回答 2

9

尽管 Google Cloud Storage 利用了 CDN 基础架构的“部分”,但它只是一个便利层,无法控制缓存密钥、失效,并且需要公共存储桶(与签名 URL 不一致)或每个对象的 Cache-Control 元数据要设置。

从存储桶中导出大量数据(例如 HLS/DASH 视频)的成本也相当高——对于北美来说,基于数量,它的成本在 0.12 美元到 0.08 美元之间。北美出口的云 CDN 范围从 0.08 美元到 0.02 美元(按 PB 计算)。

您还应该查看 Cloud CDN 中的签名 URL 和签名 Cookie支持,它可以让您保护您的视频片段免遭基于每个用户的未经授权的访问 - 类似于 GCS 签名 URL。

TL;DR: GCS 及其缓存模式非常方便,适用于小流量,但如果您打算提供几百 GB(更不用说更多),请在前面设置 HTTPS 负载均衡器 + 云 CDN bucket 将为您提供更多的灵活性并降低成本。

(我是 Cloud CDN 的 PM,如果有帮助的话!)

于 2020-05-23T18:48:48.700 回答
3

要回答您的问题,即我如何在您的 django 上的Google Cloud Storage 的当前实施之上使用 Google Cloud CDN 。您可以在下面使用django- storages

requirements.txt(版本是截至今天的最新版本:05-31-2020

...
django-storages==1.19.1
google-cloud-storage==1.28.1

示例/示例/settings.py

...
...
SB_SA_FILE = os.environ.get('STORAGE_BUCKETS_FILE',
                            'storageBucketsBackendServiceKey.json')
STATICFILES_STORAGE = 'example.lib.storages.GoogleStaticFilesStorage'  # static
DEFAULT_FILE_STORAGE = 'example.lib.storages.GoogleMediaFilesStorage'  # media
GS_AUTO_CREATE_BUCKET = True
GS_DEFAULT_ACL = 'publicRead'
GS_CREDENTIALS = service_account.Credentials.from_service_account_file(
    f'/usr/src/app/{SB_SA_FILE}'
)
GS_BUCKET_NAME = os.environ.get('GS_BUCKET_NAME')
CDN_HOSTNAME = os.environ.get('CDN_HOSTNAME', '')

示例/示例/lib/storages.py

from django.conf import settings
from storages.backends.gcloud import GoogleCloudStorage



class GoogleMediaFilesStorage(GoogleCloudStorage):

    def _save(self, name, content):
        name = f'{settings.MEDIA_URL[1:]}{name}'
        return super()._save(name, content)

    def url(self, name):
        """
        @brief      for implementation of CDN using image field url
        @return     Dynamic return of CDN or local URL
        """
        if settings.CDN_HOSTNAME:
            url = f'{settings.CDN_HOSTNAME}/{name}'
            return url
        return super().url(name)


class GoogleStaticFilesStorage(GoogleCloudStorage):
    def url(self, name):
        name = f'static/{name}'
        if settings.CDN_HOSTNAME:
            url = f'{settings.CDN_HOSTNAME}/{name}'
            return url
        return super().url(name)

最后,您需要使用CDN_HOSTNAME环境变量运行 django 应用程序。环境变量的值CDN_HOSTNAME必须是您的 Google Cloud Global Load Balancer 中映射的域,您所需的 Cloud Storage 设置为后端存储桶

于 2020-05-30T05:58:34.313 回答