エラー検知からJiraチケット作成まで自動で!CloudWatch+Lambda+Jira+Slackの連携ツール

こんにちは。CCIのJ.YAMAGUCHIです。

今回は以前少し担当したプロダクトでCloudWatch + Lambda + jira + slackを連携して、アプリケーションのエラー検知からjiraチケットを自動で作成するツールを作成した話をしたいと思います。

背景

導入する前はCloudWatch => SNS => ChatBot => slackで仕組みを作ってslackにエラーを通知していましたが、以下課題がありました。

  • どこでエラーが起こったかはわかるが、そこから対象のログを探し出して、調査を開始する際にひと手間かかっていた。
  • slackなので埋もれることもあるので、定期的にCloudWatch insightを使用してエラーログの棚卸しをしていた。(特定文字列で引っ掛けていた)

※slackに飛んできているCloudWatchのアラートの通知

担当プロダクトではプロジェクト管理でjiraを導入していたため、直接エラー内容をjiraチケットで起票できるように構築しました。

本題

今回は下記のような形でCloudWatchでエラーを検知して、jiraチケットを作成する構成で構築してみました。

詳細を書いてみます。

1. CloudWatch => Lambdaの部分

Lambdaのコンソール画面からトリガーを設定します。

担当プロダクトではjson形式でlogを出力しているので、ERRORログを引っ張るようにFilter patternに下記を設定します。

{ $.level = "ERROR" }

※画像のようにトリガーを設定しました。

2. Lambda => Jiraの部分

最終的なアウトプットとして下記のようなチケットを作成するように実装しました。

※タイトルの構成要素:【ログレベル(今回はERROR)/どの環境で起こっているか/どこのソースで起こっているか】ログストリーム名

チケット内容:テーブル形式でログに出力されている内容を記載

Lambda関数を作成し、下記処理の流れで実装しています。
  • トリガーで設定した、CloudWatchlogsから渡ってくるイベントを解析し、対象のロググループからERRORログを抽出する。

 ※Lambdaに渡ってくるイベント情報はbase64でエンコードされているため、下記を参考にデコードしてから情報を加工しました。

  • Jira APIを使用するための、tokenを取得する

 ※tokenを取得する方法は下記3パターンあり、今回はツール目的でもあっためお手軽な「Basic HTTP」を使用しました。

If you are integrating directly with the REST APIs, rather than via an Atlassian Connect add-on, use one of the authentication methods listed below:

  • OAuth 2.0 - This token-based method is the recommended method. It is more flexible and secure than other options.

  • OAuth 1.0a - This is a legacy authentication method and, therefore, isn't recommended. Instead use OAuth 2.0.

  • Basic HTTP - This method is only recommended for tools like scripts or bots. It is easier to implement, but much less secure.

https://developer.atlassian.com/cloud/jira/software/rest/intro/#introduction

tokenの作成方法としてはメールアドレスとJiraから作成できるAPI tokenをbase64でエンコードすることでtokenを作成することができます。

※このような形でtokenは作れます(Node.js)

/**
 * ================================================================================
 * アクセストークン取得
 * ================================================================================
 */
function getAccessToken() {
    const buffer = new Buffer.from(JIRA_EMAIL_ADDRESS + ':' + JIRA_ACCESS_TOKEN);
    return buffer.toString('base64');
}

JiraのAPI tokenに関しては、下記を参考にしながらAPI tokenを発行しました。

https://developer.atlassian.com/cloud/jira/platform/basic-auth-for-rest-apis/

  • Jira APIを使用して、特定の課題エピック配下のチケットの一覧を取得し、タイトルの【】内の文字列で重複チェックを実施(同じ個所で起きていたら同じエラーと定義)

  • タイトルが重複していた場合、

  Slackにエラーが起こったが重複した旨のメッセージを通知

 タイトルが重複していなかった場合、

  Jira APIを使用してチケットを作成

Jira APIは下記ドキュメントを参照し、実装しました。

https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/#about

3. Jira => Slackの部分

こちらはJiraとSlackでそれぞれ設定するだけです(お手軽ですね)

https://support.atlassian.com/ja/jira-software-cloud/docs/use-jira-cloud-for-slack/

https://teamccihq.slack.com/intl/ja-jp/apps/collection/atlassian-for-slack

これで一連の開発&設定は完了です。無事アプリケーションでエラーが発生してから自動的にJiraチケットが作成できるようになりました。

締め

今回の対応でエラー調査にひと手間かかっていたところが、チケットにわかりやすくまとめることができました。

情報にはロググループも載せているため、エラーの前後を見たいときにもすぐに対象のロググループを探すことができます。

この仕組みを作った際は1つのプロダクトに導入していましたが、現在はプロダクトが増えるたびに導入し、4つ導入できているので、結果汎用性高く作れたなと思いました。

※他のプロダクトに導入する際はLambdaの環境変数を変える程度

最後までお読みいただきありがとうございました!!