在 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 参数(truefalse)不会改变其行为。我们在创建手动接收器时使用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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Terraform 中创建存档文件?

如何在 Terraform 中创建 SSH 密钥?

重用配置在 Terraform 中创建类似的资源

如何在 terraform 中创建地图

在 Terraform 中创建 S3 存储桶通知时出错

在 Terraform 中,如何在包含的模块中引用根模块中创建的组件