为 Cloud Storage 存储分区启用 IAP

本文档介绍如何使用 Cloud Run 和 Identity-Aware Proxy 从 Cloud Storage 提供安全的静态内容。

借助 Cloud Run,您可以托管一个 Web 服务器,该服务器可从私有 Cloud Storage 存储桶传送静态内容。添加 IAP 有助于保护 Cloud Run 服务,防止未经授权的访问,同时避免在内容更改时重新构建容器映像。

Cloud Storage 静态网站托管服务仅提供公开内容,并且需要向 allUsers 授予读取权限。如果您的组织使用禁止公开访问网域限制共享等政策来限制公开存储分区,则无法使用内置的 Cloud Storage 静态网站托管功能。您可以将存储桶设为私有,在 Cloud Run 上部署 NGINX Web 服务器并将存储桶装载为卷,然后使用 IAP 控制对 Cloud Run 服务的访问权限。

准备工作

如需完成本文档中的说明,您需要满足以下条件:

  • 启用了结算功能的 Google Cloud 项目。 前往 Google Cloud 控制台
  • 包含静态文件(例如 index.html、CSS 和图片)的私有 Cloud Storage 存储桶。确保相应存储桶不是公开的。
  • 已安装 Google Cloud CLI

授予对 Cloud Storage 存储桶的访问权限

Cloud Run 需要获得从您的私有 Cloud Storage 存储桶读取文件的权限。您必须向 Cloud Run 服务身份授予存储桶的 Storage Object Viewer (roles/storage.objectViewer) 角色。

我们建议您为 Cloud Run 服务使用用户代管式服务账号,而不是默认的 Compute Engine 服务账号。

  1. 创建一个服务账号作为服务身份:

    gcloud iam service-accounts create RUN_SERVICE_ACCOUNT \
        --description="Service account for Cloud Run serving Cloud Storage" \
        --display-name="Cloud Run Cloud Storage Reader"
    
  2. 向服务账号授予存储桶的 Storage Object Viewer (roles/storage.objectViewer) 角色:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member="serviceAccount:RUN_SERVICE_ACCOUNT@PROJECT_ID." \
        --role="roles/storage.objectViewer"
    

部署 Cloud Run 服务

将 NGINX Web 服务器部署到 Cloud Run 并装载 Cloud Storage 存储桶。您必须使用第二代执行环境才能支持卷装载。

如需装载存储桶,请使用卷标志部署服务:

gcloud run deploy SERVICE_NAME \
    --image=nginx \
    --port=80 \
    --execution-environment=gen2 \
    --service-account=RUN_SERVICE_ACCOUNT@PROJECT_ID. \
    --add-volume=name=static,type=cloud-storage,bucket=BUCKET_NAME,readonly=true \
    --add-volume-mount=volume=static,mount-path=/usr/share/nginx/html \
    --no-allow-unauthenticated

替换以下内容:

  • SERVICE_NAME:Cloud Run 服务的名称
  • RUN_SERVICE_ACCOUNT:您在上一步中创建的服务账号
  • PROJECT_ID:您的 Google Cloud 项目 ID
  • BUCKET_NAME:Cloud Storage 存储桶的名称

存储桶已装载到 /usr/share/nginx/html,这是 NGINX 查找静态资源的默认目录。这意味着,您存储桶中的文件会直接映射到服务的根路径。例如,存储在 gs://BUCKET_NAME/index.html 中的文件可在 https://SERVICE_URL/index.html 中访问。

如需验证部署,请检查该服务是否会阻止未经身份验证的访问,并在未提供凭据的情况下返回 403 Forbidden 状态:

curl -I SERVICE_URL

或者,您也可以先测试容器是否能正确呈现专用 Cloud Storage 存储桶中的文件,然后再配置 IAP 访问权限。为此,请运行以下命令,使用您的开发者凭据发送经过身份验证的请求:

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

SERVICE_URL 替换为您的 Cloud Run 服务的网址。

启用 IAP

部署 Cloud Run 服务后,您可以启用 IAP 来保护该服务。

我们建议您直接在 Cloud Run 服务上启用 IAP。如需了解相关说明,请参阅为 Cloud Run 配置 IAP

或者,如果您在 Cloud Run 服务前面使用外部 HTTPS 负载均衡器,则可以在后端服务上启用 IAP。如需查看相关说明,请参阅通过后端服务或负载均衡器启用 IAP

缓存和性能

使用 Cloud Storage 卷挂载时,Cloud Run 读取的每个文件都会转换为 Cloud Storage API 调用。为了最大限度地减少延迟时间和 API 费用,您可以在 Web 服务器中配置缓存(例如,使用 NGINX 缓存指令),也可以配置 Cloud Storage FUSE 装载选项

如果您使用的是外部 HTTPS 负载均衡器,还可以在后端服务上启用 Cloud CDN。IAP 与同一后端服务上的 Cloud CDN 不兼容,因此如果您需要同时使用这两项服务,可能需要相应地调整架构。

限制

从 Cloud Storage 卷装载点读取文件可能比访问本地文件系统慢。为了缩短读取延迟时间,请配置缓存。

其他使用场景

您还可以将 Cloud Storage 卷装载用于其他场景:

  • 事件驱动型函数:函数直接从文件系统读取上传的文件。
  • 生成式 AI 应用:应用使用标准文件系统读取操作从 Cloud Storage 存储桶加载向量数据库(例如 Chroma)。

替代方案:装载 NFS 卷

如果您的文件存储在 Filestore 或自托管 NFS 服务器上,您可以将 NFS 卷装载到 Cloud Run 服务,而不是 Cloud Storage 存储分区。如需了解详情,请参阅装载 NFS 卷