本文介绍 ClickPipes 为通过 Google Cloud Pub/Sub 进行身份验证并从您的主题中消费数据所需的 GCP IAM 权限,以及如何设置一个恰好授予这些权限的服务账号。
要按照本指南操作,你需要具备:
- 一个处于活跃状态的 ClickHouse Cloud 服务
- 一个 GCP 项目,其中包含你要从中摄取数据的 Pub/Sub topic
- 在该项目中拥有创建服务账号并授予角色所需的 IAM 权限
用于 Pub/Sub 的 ClickPipes 使用 服务账号 JSON 密钥向 GCP 进行身份验证。创建管道时,您需要上传该密钥文件;ClickPipes 会在静态存储时对其加密,并在运行时将其用于:
- 列出并读取您项目中的 topic,
- 创建和删除 ClickPipes 用于消费消息的托管订阅,
- 从该订阅消费消息,以及
- (可选) 从 Schema Registry 读取原生 Pub/Sub schema。
不支持 Workload Identity 或直接粘贴凭据;目前唯一支持的身份验证方法是服务账号 JSON 密钥。
ClickPipes 需要在拥有该 topic 的 GCP 项目中具备以下 IAM 权限。这些权限涵盖管道的完整生命周期:发现 (topic 列表、验证、采样) 、订阅管理、稳定运行时的摄取以及清理。
| 权限 | 用途 |
|---|
pubsub.topics.list | 在发现过程中列出项目中可用的 topic |
pubsub.topics.get | 校验 topic 是否存在并获取 schema 配置 |
pubsub.topics.attachSubscription | 创建针对某个 topic 的订阅时,需要在该 topic 上具备此权限 |
| Permission | Purpose |
|---|
pubsub.subscriptions.create | 创建托管订阅 (clickpipes-{pipeID}) 和临时发现订阅 |
pubsub.subscriptions.get | 健康检查 (每 60 秒一次) 、follower 轮询、订阅验证 |
pubsub.subscriptions.delete | 清理临时发现订阅,并在删除管道时删除托管订阅 |
pubsub.subscriptions.consume | Receive()、Ack()、Nack() 以及按时间戳寻道操作 |
Schema 访问 (可选——仅适用于原生 Avro/Protobuf topic)
| 权限 | 用途 |
|---|
pubsub.schemas.get | 从 Pub/Sub Schema Registry 获取原生 schema 定义 |
| 角色 | 是否足够? | 说明 |
|---|
roles/pubsub.editor | 是 | 涵盖所有必需的权限。可用范围最广。 |
roles/pubsub.subscriber | 否 | 缺少 topics.list、topics.attachSubscription、subscriptions.create、subscriptions.delete 和 schemas.get。 |
roles/pubsub.viewer | 否 | 只读——不支持订阅管理或消费。 |
| 自定义角色 (推荐) | 是 | 使用上述七项核心权限 (以及可选的 schemas.get) 即可实现最小权限访问。 |
为遵循最小权限原则,请创建一个仅包含 ClickPipes 所需权限的自定义角色。
你可以使用 gcloud CLI 执行此操作:
gcloud iam roles create clickpipes.pubsub.ingestion \
--project=YOUR_PROJECT_ID \
--title="ClickPipes Pub/Sub Ingestion" \
--description="Permissions required by ClickHouse ClickPipes to ingest from Pub/Sub" \
--permissions=pubsub.topics.list,pubsub.topics.get,pubsub.topics.attachSubscription,pubsub.subscriptions.create,pubsub.subscriptions.get,pubsub.subscriptions.delete,pubsub.subscriptions.consume \
--stage=GA
或者,在 GCP Console 中,前往 IAM & Admin → Roles → Create role,并添加所需权限中列出的各项权限。
可选权限如果你要从使用原生 Pub/Sub Avro 或 Protobuf schema 的 topic 摄取数据,请将 pubsub.schemas.get 追加到 --permissions 列表中。否则无需添加,以保持角色权限最小化。
如果你不想创建自定义角色,也可以直接授予 roles/pubsub.editor。
为 ClickPipe 创建专用服务账号:
gcloud iam service-accounts create clickpipes-pubsub \
--project=YOUR_PROJECT_ID \
--display-name="ClickPipes Pub/Sub Ingestion"
在项目级别,将你创建的角色 (或 roles/pubsub.editor) 绑定到服务账号:
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member="serviceAccount:clickpipes-pubsub@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
--role="projects/YOUR_PROJECT_ID/roles/clickpipes.pubsub.ingestion"
为服务账号创建一个 JSON 密钥,并下载到本地:
gcloud iam service-accounts keys create clickpipes-pubsub-key.json \
--iam-account=clickpipes-pubsub@YOUR_PROJECT_ID.iam.gserviceaccount.com
您将在创建该管道时,在 ClickPipes UI 中上传此 clickpipes-pubsub-key.json 文件。
请将该密钥作为机密信息处理服务账号密钥可用于访问您的 GCP 项目。请妥善保管该文件,不要将其提交到版本控制系统,并定期轮换。上传后,ClickPipes 会对静态存储中的密钥进行加密。
pubsub.topics.attachSubscription 需要在topic 资源上授予,而不是在订阅上。只授予订阅级权限时,通常会遗漏这一点。
- 如果您的 topic 未使用原生 Pub/Sub schema (Avro 或 Protobuf) ,则不需要
pubsub.schemas.get 权限。
- 托管订阅命名为
clickpipes-{pipeID},ack deadline 为 60 秒,消息保留期为 7 天,并启用了消息排序。
- 临时发现订阅命名为
clickpipes-discovery-{uuid},ack deadline 为 10 秒,保留期为 10 分钟,并设置了 24 小时自动过期的生存时间 (TTL)。
- ClickPipes 将
PermissionDenied 和 Unauthenticated 错误视为不可重试——如果缺少权限,管道会立即失败,而不是无限重试。