如何在不公开Cloud Storage存储桶的前提下对接Google Cloud CDN?
你可以通过绑定负载均衡服务账号的IAM权限实现,逻辑和AWS CloudFront的Origin Access Control(OAC)类似,具体步骤如下:
核心配置步骤
移除存储桶的公开权限
先确保你的Cloud Storage存储桶没有给allUsers配置任何读取权限,避免存储桶被公开访问。配置带Cloud CDN的HTTP(S)负载均衡器
创建HTTP(S)负载均衡器,后端服务选择Cloud Storage类型并关联你的目标存储桶,同时启用Cloud CDN功能。找到负载均衡器的服务账号
负载均衡器默认使用专属服务账号:service-[你的项目编号]@cloud-lb-sa.iam.gserviceaccount.com,你可以在GCP控制台的负载均衡器详情页或通过gcloud projects get-iam-policy [项目ID]命令确认。为服务账号授予存储桶访问权限
给上述服务账号添加Cloud Storage的roles/storage.objectViewer角色,使其能读取存储桶内的对象:- 命令行方式:
gcloud storage buckets add-iam-policy-binding gs://[你的存储桶名称] \ --member="serviceAccount:service-[项目编号]@cloud-lb-sa.iam.gserviceaccount.com" \ --role="roles/storage.objectViewer" - 控制台方式:在存储桶的IAM管理页面,添加该服务账号并选择「存储对象查看者」角色。
- 命令行方式:
验证配置
通过负载均衡器的域名访问存储桶内的对象,确认能正常加载;直接访问存储桶的原始URL(如storage.googleapis.com/[存储桶名称]/xxx)会被拒绝,说明权限仅对Cloud CDN开放。
补充说明
官方文档中使用allUsers是为了快速演示配置,属于测试级方案。上述基于服务账号的配置是生产环境推荐的安全方案,确保只有Cloud CDN能通过负载均衡访问存储桶,避免存储桶直接暴露。
内容的提问来源于stack exchange,提问作者Jaehyun Baek

