在 Terraform 中创建 google_logging_project_sink 不会将事件推送到 Pub/Sub
Posted
技术标签:
【中文标题】在 Terraform 中创建 google_logging_project_sink 不会将事件推送到 Pub/Sub【英文标题】:Creating google_logging_project_sink in Terraform doesn't push events to Pub/Sub 【发布时间】:2021-02-25 08:18:03 【问题描述】:我想创建一个 Log Sink 来监听 Stack Driver 中的特定消息并将事件推送到 Cloud Pub/Sub,这将触发 Cloud Function。
这是我的 Terraform 模板的一部分。
resource "google_pubsub_topic" "dataflow_events"
name = join("-", concat(["dataflow-events", var.environment, terraform.workspace]))
resource "google_logging_project_sink" "dataflow_job_completion_sink"
name = join("-", concat(["dataflow-job-completion-sink", var.environment, terraform.workspace]))
destination = "pubsub.googleapis.com/projects/$var.project/topics/$google_pubsub_topic.dataflow_events.name"
filter = "resource.type=dataflow_step AND textPayload=\"Worker pool stopped.\""
Terraform 版本 = 0.13.3
这会在没有任何错误的情况下部署。但是,不会向 Pub/Sub 主题推送任何事件。
但是,当我手动(从 Cloud Web 控制台)创建接收器时,它会将消息推送到(相同的)Pub/Sub 主题。
这是两个接收器的两个屏幕截图。
注意:同时更改unique_writer_identity
参数(true
或false
)不会改变其行为。我们在创建手动接收器时使用unique_writer_identity
作为true
,这就是它具有全局服务帐户的原因。但是在 Terraform 中将此设置为 true
不会将消息推送到 Pub/Sub。
我们非常感谢您的专业知识。
【问题讨论】:
【参考方案1】:让我在这里回答我自己的问题。 谢谢@milindu-sanoj-kumarage 的提示。
当我们创建 Log Sink 时,它会提供一个绑定到它的服务帐户。
如果您将unique_writer_identity
标记为true
,它将看起来像[GENERATED_ID_1]@[GENERATED_ID_2].iam.gserviceaccount.com
,如果它设置为false
,它将是serviceAccount:cloud-logs@system.gserviceaccount.com
。
如果您尚未将这些 SA 添加到您的项目中,这些是全局(位于您的项目之外)SA。
您需要将此服务帐户添加(派生)到您的 GCP 项目中并授予写入目标的权限。
在 IAM & Admin 部分转到 IAM --> 点击添加按钮。 在新成员文本框中,输入cloud-logs@system.gserviceaccount.com
。
选择您需要添加的角色。在这种情况下,它是 Pub/Sub > Pub/Sub Publisher。
添加条件以仅允许给定的 Pub/Sub(可选)
点击保存
更新:
如果您的组织限制添加 cloud-logs@system.gserviceaccount.com
,您的 terraform 中应该有 unique_writer_identity = true
,然后添加在 IAM 窗口中生成的唯一 IAM。您可以从日志部分的 Cloud Sink(日志路由器)窗口中提取此 IAM。
现在,接收器有权将事件推送到 Pub/Sub。因此,每当它在日志中得到过滤文本时,它都会将其推送到给定的 Pub/Sub 主题。
【讨论】:
以上是关于在 Terraform 中创建 google_logging_project_sink 不会将事件推送到 Pub/Sub的主要内容,如果未能解决你的问题,请参考以下文章