Google 云存储与 Google 云 CDN
Google Cloud Storage vs Google Cloud CDN
我有几个视频内容,我通过我的 Google 云存储通过我的 Django Google App Engine 应用程序与签名 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 因为它本身有一个隐式 CDN。
如果使用 Google CDN 是播放在线视频内容的更明智的方式,实现这一点的最佳策略是什么,我如何在当前的基础上使用 Google Cloud CDN使用 Google 云存储实施 ?
虽然 Google Cloud Storage 利用 "parts" 的 CDN 基础设施,但它只是一个便利层,无法控制缓存键、失效并且需要 public 存储桶 (与签名 URL 不一致),或者要设置每个对象的缓存控制元数据。
从存储桶中导出大量数据(例如 HLS/DASH 视频)也相当昂贵 - 对于北美,根据数据量的不同,费用在 0.12 美元到 0.08 美元之间。北美出口的 Cloud CDN 费用为 0.08 美元 - 0.02 美元(1 PB 后)。
您还应该看看 Cloud CDN 中的 Signed URLs and Signed Cookies 支持,它允许您保护您的视频片段免受基于每个用户的未经授权的访问 - 类似于 GCS 签名 URL。
TL;DR: GCS 及其缓存模式非常方便,适用于小流量,但如果您打算服务几百 GB(更不用说更多), 在bucket前设置一个HTTPS Load Balancer + Cloud CDN 会给你更多的灵活性和更低的成本。
(我是Cloud CDN的PM,如果有帮助的话!)
回答你的问题我如何在你的 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
example/example/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', '')
example/example/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)
最后,您需要 运行 您的 django 应用程序 CDN_HOSTNAME
环境变量。 CDN_HOSTNAME
环境变量的值必须是在您的 Google Cloud Global Load Balancer 中映射的域,您将所需的云存储设置为后端存储桶
我有几个视频内容,我通过我的 Google 云存储通过我的 Django Google App Engine 应用程序与签名 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 因为它本身有一个隐式 CDN。
如果使用 Google CDN 是播放在线视频内容的更明智的方式,实现这一点的最佳策略是什么,我如何在当前的基础上使用 Google Cloud CDN使用 Google 云存储实施 ?
虽然 Google Cloud Storage 利用 "parts" 的 CDN 基础设施,但它只是一个便利层,无法控制缓存键、失效并且需要 public 存储桶 (与签名 URL 不一致),或者要设置每个对象的缓存控制元数据。
从存储桶中导出大量数据(例如 HLS/DASH 视频)也相当昂贵 - 对于北美,根据数据量的不同,费用在 0.12 美元到 0.08 美元之间。北美出口的 Cloud CDN 费用为 0.08 美元 - 0.02 美元(1 PB 后)。
您还应该看看 Cloud CDN 中的 Signed URLs and Signed Cookies 支持,它允许您保护您的视频片段免受基于每个用户的未经授权的访问 - 类似于 GCS 签名 URL。
TL;DR: GCS 及其缓存模式非常方便,适用于小流量,但如果您打算服务几百 GB(更不用说更多), 在bucket前设置一个HTTPS Load Balancer + Cloud CDN 会给你更多的灵活性和更低的成本。
(我是Cloud CDN的PM,如果有帮助的话!)
回答你的问题我如何在你的 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
example/example/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', '')
example/example/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)
最后,您需要 运行 您的 django 应用程序 CDN_HOSTNAME
环境变量。 CDN_HOSTNAME
环境变量的值必须是在您的 Google Cloud Global Load Balancer 中映射的域,您将所需的云存储设置为后端存储桶