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

Pra*_*ris 6 logging google-cloud-platform google-cloud-pubsub terraform stackdriver

我想创建一个日志接收器来侦听 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.\""
}
Run Code Online (Sandbox Code Playgroud)

地形版本 = 0.13.3

这将在没有任何错误的情况下部署。但是,不会将任何事件推送到 Pub/Sub 主题。

但是,当我手动(从 Cloud Web 控制台)创建接收器时,它会将消息推送到(相同的)Pub/Sub 主题。

这是两个接收器的两个屏幕截图。

在此处输入图片说明 在此处输入图片说明

注意:更改它们两个上的unique_writer_identity参数(truefalse)不会改变其行为。我们在创建手动接收器时使用unique_writer_identityas true,这就是它具有全局服务帐户的原因。但是true在 Terraform 中将此设置为不会将消息推送到 Pub/Sub。

非常感谢您的专业知识。

Pra*_*ris 5

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

当我们创建Log Sink时,它会提供一个与其绑定的服务帐户。

如果您已标记unique_writer_identitytrue,则它将看起来像,如果设置为 ,则它将[GENERATED_ID_1]@[GENERATED_ID_2].iam.gserviceaccount.com是。serviceAccount:cloud-logs@system.gserviceaccount.comfalse

如果您尚未将这些 SA 添加到您的项目中,那么这些 SA 是全局的(位于您的项目之外)。

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

  • 转至 IAM 和管理部分中的 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 主题。