获取 Terraform google_monitoring_notification_channel 资源的 Slack auth_token

Posted

技术标签:

【中文标题】获取 Terraform google_monitoring_notification_channel 资源的 Slack auth_token【英文标题】:Obtain Slack auth_token for Terraform google_monitoring_notification_channel resource 【发布时间】:2019-07-19 22:56:04 【问题描述】:

我希望从 gcloud -> slack 设置一些警报,到目前为止,按照以下说明进行了测试:

https://cloud.google.com/monitoring/support/notification-options?_ga=2.190773474.-879257953.1550134526#slack

但是,理想情况下,我会将这些通知的配置存储在 terraform 脚本中,这样如果需要重新设置,我就无需手动执行步骤。看起来这应该是可能的:https://www.terraform.io/docs/providers/google/r/monitoring_notification_channel.html

我运行了gcloud alpha monitoring channel-descriptors describe projects/<My Project>/notificationChannelDescriptors/slack,它为标签+类型生成以下输出:

labels:
- description: A permanent authentication token provided by Slack. This field is obfuscated
    by returning only a few characters of the key when fetched.
  key: auth_token
- description: The Slack channel to which to post notifications.
  key: channel_name
type: slack

所以,我认为通知通道的 terraform 配置应该是:

resource "google_monitoring_notification_channel" "basic" 
  display_name = "My slack notifications"
  type = "slack"
  labels = 
    auth_token = "????????"
    channel_name = "#notification-channel"
  

但是,我不知道如何获取此脚本的身份验证令牌?我似乎无法从 Slack gcloud 中提取我已经设置的那个,也找不到任何从头开始创建的说明...

注意这不是特定于 Terraform 的问题,因为脚本只是挂接到 google REST API。因此,任何直接使用 API 的人也必须从某个地方获取此 auth_token。必须有一种预期的方式来获取它,或者为什么它在 API 中......?

【问题讨论】:

【参考方案1】:
    访问https://app.google.stackdriver.com/settings/accounts/notifications/slack?project=YOUR_PROJECT_NAME 选择“添加 Slack 频道” 选择“授权 Stackdriver” 选择“安装” 您将被重定向回以下表单的 URL:https://app.google.stackdriver.com/settings/accounts/notifications/slack/add?project=YOUR_PROJECT_NAME&auth_token=AUTH_TOKEN_HERE 保存通知通道(这似乎是完成 oauth 流程所必需的) 从查询字符串中的&auth_token= 参数复制/粘贴身份验证令牌

您最终将获得一个额外的通知通道,即您在控制台中创建的那个,但之后您将能够在 terraform 管理的通知通道中重复使用身份验证令牌。

【讨论】:

包含身份验证令牌的 URL 不再是我们被重定向到的最终 URL。要查找身份验证令牌,请打开浏览器的网络监视器并按照上述步骤操作。在整个过程中发出的请求列表中,您会发现其中一个请求包含身份验证令牌 您可以在之后删除额外的通知通道,令牌将继续工作。 这不再起作用,因为 stackdriver 被合并到监控中。 :( @Rose 您希望将令牌放入 GCP Secret 并在此处引用。与 terraform 中的其他敏感值一样,它不应出现在您的源代码中,但可能最终出现在您的状态文件中。相应地保护状态。 @Mar0ux 它对我有用。记录 oauth 流的网络活动,然后找到 GET 到“slack.com/api/auth.test?token=auth_token”【参考方案2】:

一个技巧是创建您自己的 Slack 应用程序并使用它的 oauth-token。如果你知道怎么做就相当简单。在我自己研究这个问题时,我发现这篇很棒的博客文章解释了它https://bradtho.github.io/technology/gcp-alerting/

或者,您可以设置默认的 Google Cloud Monitoring 集成并在点击“发送测试通知”时检查网络调用。 POST 有效负载包含令牌。

【讨论】:

以上是关于获取 Terraform google_monitoring_notification_channel 资源的 Slack auth_token的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 获取和更新特定字段

Terraform:获取状态锁时出错:ConditionalCheckFailedException

如何在 terraform 中获取 k8s 作业的输出

使用 terraform 创建 lambda 函数时出错获取验证错误

Terraform 获取 api 网关的 ip 地址

如何获取使用 Terraform 部署的功能应用程序中的“功能网址”?