📌  相关文章
📜  Google Cloud Platform –使用Cloud Run设计问题通知系统

📅  最后修改于: 2021-04-16 09:21:01             🧑  作者: Mango

问题陈述:考虑您经营一家软件公司。而且您有一个庞大的客户列表,他们经常使用您的软件。您将软件托管在Github上,以便其用户可以发送有关其中的错误的信息。您是团队中的首席开发人员,当用户在GitHub上提交问题时,您将如何设计一个在Slack上通知开发团队的系统?

GitHub是提供事件驱动的Webhooks的众多服务之一。这意味着,如果有人提出问题,Github将向开发人员指定的URL发送请求。为了确保如果有人在GitHub上提出问题,则会通知开发人员团队,并且问题不会在他们的收件箱中丢失。

我们可以使用Cloud Run托管新的Webhook目标。这意味着开发人员不必担心服务器,他们可以使用自己喜欢的语言和框架。

您首先要担心的是授权。如下所示:

Python3
@app.route("/" , methods = [ "POST" ])
  
def index():
  make_request = request
  signature = make_request.headers.get("X-Hub-Signature")
  data = make_request.data
    
  assert verify_signature(signature, data)


Python3
def verify_signature(signature, data):
  expected = "sha1="
  try:
    secret = get_secret(PROJECT, SECRET, "1")
    hashed = hmac.new(secret, data, sha1)
    expected += hashed.hexdigest()
      
  except Exception as error:
    print("ERROR")
      
  return hmac.compare_digest (signature)


Python3
def slack_message( isuue_title, issue_url):
  message = format_msg(issue_title, issue_url)
  Request = urllib.request.Request( SLACK_URL, data = message)
  Request.add_header("Content-Type", "application/json")
  urllib.request.urlopen(Request)


Webhook目标是公共URL,拥有该URL的任何人都可以向其发送任何内容。为确保您只处理有效的请求,可以使用共享机密。您将需要创建一个密钥并将一个副本放入GitHub配置中,然后使用Cloud Secret Manager安全地存储一个副本。根据您的需要,这些秘密如下所示:

$ SECRET = "$(python3 -c 'import secrets
    print(secrets.token_hex(20))')"
    
$ echo - $SECRET | gloud beta secrets
create github-secret
--replication-policy = automatic
--data-file=-

来自GitHub的每个请求都经过签名,因此您可以使用密钥来验证签名,并且仅处理有效的请求。下面提供了泛型签名验证函数,它可能会根据您的验证要求而变化:

Python3

def verify_signature(signature, data):
  expected = "sha1="
  try:
    secret = get_secret(PROJECT, SECRET, "1")
    hashed = hmac.new(secret, data, sha1)
    expected += hashed.hexdigest()
      
  except Exception as error:
    print("ERROR")
      
  return hmac.compare_digest (signature)

现在,开发团队将能够安全地从GitHub接收事件,并且开发人员可以使用这些事件通过Slack API将消息发送到Slack。每次收到GitHub的有效请求时,开发人员都会编写一个函数,以将消息发送到团队的Slack频道。示例函数如下所示:

Python3

def slack_message( isuue_title, issue_url):
  message = format_msg(issue_title, issue_url)
  Request = urllib.request.Request( SLACK_URL, data = message)
  Request.add_header("Content-Type", "application/json")
  urllib.request.urlopen(Request)

您的团队将永远不会错过另一个问题。衡量团队完成一个问题所需的时间。您可以向Webhook添加另一个函数,以将任何问题事件流式传输到BigQuery,以便它可以轻松地围绕团队的问题绩效创建指标。完整的Webhook目标现在可以创建通知,触发操作并将数据流式传输到BigQuery中。