IT Python3

【自動化】Python3からRedmineのREST APIを実行してチケットを発行

 

監視サービスとチケット管理サービスの連携は多くの場で使われる手法の一つとなっています。

チケット管理と言えば、古き良き「Redmine」というツールがあることはご存知の方が多いかと思われます。

私はSaaSの監視サービスなども触る機会があるのですが、そこでSaaSからの通知をRestAPI経由でRedmineにチケットで上げたいという話になりました。

じゃあ軽くやってみようと思い「Redmine API チケット発行」とググるもまぁパっと見つからないこと。

というか、公式ドキュメントが分かりづらいといいますか、一応ちゃんと読めばわかるんですが、非常に面倒くさかったです。

こういう調べる為のコストは排斥されるべきです。

開発者はググってコピペをすればすぐに使えるような情報があるべきなのです。
では記事にしていきましょう。

目的

Python3からredmineのAPIを叩いてチケットを発行します。

Python3からRest APIを叩く方法を知らない場合は下記の記事も参考にしてみてください。
【入門】Python3でrequestsを使うための最短構文 - お空きれい

構成

Redmineのチケットを上げるにもお作法があるので、SaaSからポイ投げはできません。

今回はSaaSのWebhookをAWSのAPI Gatewayで受けて Lambda(Python3)に渡し、そこからRedmineに投げます。

今回紹介するコードはあくまでPython部分だけなので、受け取り部分は各自で適当に用意してください。

構文

送られてくる形式例

環境はその場によって変わるのであくまで1例としてjsonでこんな感じの内容が送られて来るとします。

{
  "title": "メモリ不足",
  "severity": "MEDIUM",
  "message": "メモリ不足によりサーバが停止しています"
}

コード

postTicket関数に先程のjsonを引数として入れるイメージです。

import json
import requests

def postTicket(event):
  url = "http://hoge/issues.json" # hoge部分はredmineのアドレス
  headers = {
    'Content-Type': 'application/json',
    "X-Redmine-API-Key": "hoge" # hoge部分はRedmineで発行したAPIKey
  }
# severityによって緊急度を変更
  priority = 1
  if(event["severity"] == "MEDIUM"):
    priority = 3
  payload = {
    "issue": {
      "project_id": 1, # チケットを上げたいRedmineプロジェクトのID
      "subject": str(event["title"]), # チケットタイトル
      "priority_id": priority, # チケットの緊急度
      "description": str(event["message"]) # チケットの説明
    }
  }
  r = requests.post(url,headers=headers,data=json.dumps(payload))
  print(r.status_code)
  print(r.text)
  if(r.status_code == 201):
    return str(r.status_code) + ": チケットを上げました"
  return str(r.status_code) + ": 失敗しました"

まとめ

手動での作業はITを扱うものとしてナンセンス。
そういった考えは非常に重要だと思います。
自動化できるものは極力自動化を。
私はチケット管理はZendeskでやっているので、あまりRedmineは使っていないのですが、この記事に少しでも需要があれば喜ばしい限りです。

-IT, Python3