Jira サービスのバックアップをCUI で実行して自動化を考える

2023.08.15

アノテーション インフラチーム所属の髙橋隆太です。

現在社内のいくつかのプロジェクトでは、Jira Cloud のサービスを利用しています。

Jira Service Management 等のサービスはかなり利用されていて、 もし、プロジェクトのデータや課題などが急になくなると困るので、バックアップをとっています。

今までは GUI からバックアップを作成・取得し別のストレージに手動で、バックアップを置いていました。 その作業を CUI を利用することで自動化することができましたので方法を紹介したいと思います。

Jira Cloud サービスのバックアップ についての仕様は以下になります。

  • バックアップの作成は 48時間に1回まで
  • バックアップは 作成後 新しく作成するまでに 14 日間保持される
  • バックアップ についての概要など (Atlassian社 Community より)

まずは 参考に GUI からのバックアップ

GUI は簡単です!!

ログイン後以下をクリックします。

URL は以下になります。

https://<利用中のサイト名>.atlassian.net/secure/admin/CloudExport.jspa

 

遷移したら上記の画面になります。

バックアップの作成が完了したら クラウド バックアップをダウンロード と表示されるのでそこをクリックしダウンロードする。

CUI でバックアップを取る

具体的な方法

今回はbash を利用してバックアップを作成します。

  • 検証環境は Amazon Linux 2023 (amazon/al2023-ami-2023.0.20230517.1-kernel-6.1-x86_64)
  • Jira Cloud サービス の API は基本的に Basic 認証になります
  • 以下の順番で実行します
    1. バックアップを作成します。利用状況により完了まで時間がかかる場合があります(弊社の場合 1時間ほど)
    2. タスク ID を取得することで、1. のバックアップ作成の進行状況や、ファイルID を確認できるようになります
    3. タスク ID を利用して進捗状況を確認します、Success になっていればバックアップの作成は完了しています
    4. タスク ID を利用して、ファイルID を取得します、このID がわかれば、コマンドからダウンロードすることができます
    5. ダウンロードします
  • 実際のコマンドは以下
#0 利用する変数を初期化しておく
EMAIL="test@test.com" #利用するメールアドレスを入れてください
TOKEN="TOKENEXAMPLE" #利用するメールアドレスで発行したトークンを入れてください
INSTANCE="TESTCOMPANY" #利用するサイト名を入れてください
IFS=$'n' array=($(echo -n "${EMAIL}:${TOKEN}" | base64))
AUTH_HEADER="Authorization: Basic ${array[0]} ${array[1]} ${array[2]} ${array[3]}"

#1 バックアップを作成する (cbAttachments":"true" は添付ファイルもバックアップに含めることを示し "exportToCloud":"true"`はバックアップをクラウドにエクスポートすることを示す)
curl -X POST -H "Content-Type: application/json" -H "${AUTH_HEADER}" "https://${INSTANCE}/rest/backup/1/export/runbackup" -d '{"cbAttachments":"true", "exportToCloud":"true"}'

#2 タスクID取得
TaskId=$(curl -X GET -H "${AUTH_HEADER}" "https://${INSTANCE}/rest/backup/1/export/lastTaskId")

#3 進捗状況確認 Success になるまで待つ
status=$(curl -X GET -H "Content-Type: application/json" -H "${AUTH_HEADER}" "https://${INSTANCE}/rest/backup/1/export/getProgress?taskId=${TaskId}" | jq -r '.status' | cut -d= -f2)

#4 完了したらファイルID を取得
fileId=$(curl -X GET -H "Content-Type: application/json" -H "${AUTH_HEADER}" "https://${INSTANCE}/rest/backup/1/export/getProgress?taskId=${TaskId}" | jq -r '.result' | grep -o 'fileId=[^&amp;amp;]*' | cut -d= -f2)

#5 ダウンロード
curl -H "${AUTH_HEADER}" -L -o jira_backup.zip "https://${INSTANCE}/plugins/servlet/export/download/?fileId=${fileId}"

参考ページ

自動化の方法など

CUI でシェルでコマンドがわかったので弊社は現在は以下のように実施して自動化をしています。

  • #1 ~ #4 を Python の AWS Lambda のコードに書き換える
  • #5 を  ECS on fargate で動かし、コマンドの最後に s3 に転送するコマンドを追記する
  • 上記を AWS Step Functions で構成する

まとめ

バックアップを取得するのを自動化できるのは、 GUI で手動で取得していた工数がなくなる点に関しても、万が一 Jira サービスに不具合やデータが消えた時を考えると、 安心で手間もなくなるので自動化できて良かったと思います!

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。