Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Slackでスタンプを押すとBackLogに起票する仕組みを作る__1_.pdf

Hitoki
February 01, 2023
550

 Slackでスタンプを押すとBackLogに起票する仕組みを作る__1_.pdf

Hitoki

February 01, 2023
Tweet

Transcript

  1. 自己紹介 • 名前 ◦ 馬淵 仁輝(まぶち ひとき) • 所属 ◦ 2022/10/1 入社 ◦

    Eng4G SREUnit • 前職 ◦ スマホゲー運営 ◦ BE領域が主(6年) ◦ 約5タイトル ◦ インフラ保守等の他領域も担当
  2. アジェンダ • 自己紹介 • テーマについて • 構成図イメージ • AWS側でやること •

    BackLog側でやること • Slack側でやること • 注意すること • まとめ
  3. AWS側ですること • AWS Lambdaの用意(15分) ◦ Slackのメッセージを取得する関数 ◦ BackLogにチケットを起票する関数 ◦ 発火した時に上2つをいい感じに動かす関数

    ◦ (必須ではない)Slackにメッセージを投下する関数 import json import urllib.request import requests ・インポートするライブラリ
  4. AWS側ですること • AWS Lambdaの用意 ◦ Slackのメッセージを取得する関数のサンプルコード def get_slack_message(channel_id, ts): token

    = "slackから取得するトークン " SLACK_URL = "https://slack.com/api/conversations.replies" payload = { "channel": channel_id, "ts": ts } headersAuth = { 'Authorization': 'Bearer '+ str(token), } response = requests.get(SLACK_URL, headers=headersAuth, params=payload) json_data = response.json() msgs = json_data["messages"][0] text = msgs["text"] archives_url = "https://******.slack.com/archives/" + channel_id + "/p" + ts result = {"text":text, "archives_url":archives_url} return result
  5. AWS側ですること • AWS Lambdaの用意 ◦ BackLogにチケットを起票する関数のサンプルコード def add_issue(text,archives_url): API_KEY =

    "backlogのAPIトークン" PROJECT_ID="11111111" PRIORITY_ID = "3" ISSUE_TYPE_ID = "000000" payload={ 'projectId': PROJECT_ID, 'issueTypeId': ISSUE_TYPE_ID, 'priorityId': PRIORITY_ID, 'summary': archives_url, 'description': text } params = { 'apiKey': API_KEY, } r = requests.post("https://xxxxxx.backlog.jp/api/v2/issues", params=params, data=payload) r.raise_for_status()
  6. AWS側ですること • AWS Lambdaの用意 ◦ 発火した時に他関数をいい感じに動かす関数のサンプルコード def lambda_handler(event, context): event_json

    = json.dumps(event, ensure_ascii=False) event_dict = json.loads(event_json) try: body_dict = json.loads(event_dict["body"]) reaction = body_dict["event"]["reaction"] channel = body_dict["event"]["item"]["channel"] ts = body_dict["event"]["item"]["ts"] slack_message = get_slack_message(channel,ts) if(reaction=="リアクションの ID"): add_issue(slack_message["text"],slack_message["archives_url"]) result = post_slack("reaction added : "+ reaction, event, context) return { 'statusCode': 200, 'body': reaction, } except KeyError: print("body message from slack is not found.")
  7. AWS側ですること • AWS Lambdaの用意 ◦ Slackにメッセージを投下する関数のサンプルコード def post_slack(argStr, event, context):

    message = argStr send_data = { "text": message } send_text = json.dumps(send_data) request = urllib.request.Request( "https://hooks.slack.com/services/xxxxxx/yyyyy/zzzzz", data=send_text.encode('utf-8') ) with urllib.request.urlopen(request) as response: slack_message = response.read() return send_text