在 Terraform 中创建 google_logging_project_sink 不会将事件推送到 Pub/Sub

Creating google_logging_project_sink in Terraform doesn't push events to Pub/Sub

我想创建一个 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.

非常感谢您的专业知识。

让我在这里回答我自己的问题。 谢谢,@milindu-sanoj-kumarage 的提示。

当我们创建日志接收器时,它会提供一个绑定到它的服务帐户。

如果您将 unique_writer_identity 标记为 true,它将看起来像 [GENERATED_ID_1]@[GENERATED_ID_2].iam.gserviceaccount.com,如果设置为 false,它将是 serviceAccount:cloud-logs@system.gserviceaccount.com

如果您还没有添加到您的项目中,这些是全局(驻留在您的项目之外)SA。

您需要将此服务帐户添加(派生)到您的 GCP 项目中并授予写入目标的权限。

  • 转到 IAM 和管理部分中的 IAM --> 单击“添加”按钮。
  • 新成员文本框中,键入cloud-logs@system.gserviceaccount.com
  • Select 您需要添加的角色。在这种情况下是 Pub/Sub > Pub/Sub 发布者。
  • 添加条件以仅允许给定的 Pub/Sub(可选)
  • 点击保存

更新: 如果您的组织限制添加 cloud-logs@system.gserviceaccount.com,您应该在您的 terraform 中包含 unique_writer_identity = true,然后添加在 IAM window 中生成的唯一 IAM。您可以从日志记录部分的 Cloud Sink(日志路由器)window 中提取此 IAM。

现在,接收器有权将事件推送到 Pub/Sub。因此,无论何时它在日志中得到过滤文本,它都会将其推送到给定的 Pub/Sub 主题。