Jira 이슈 생성 연동

이번 글에서는 Atlassian Jira 연동 예제를 통해 로그프레소에서 REST API를 어떻게 호출하는지 알아봅니다.

Atlassian Jira API 레퍼런스는 Jira에 이슈를 생성하려면 POST 엔드포인트와 본문 데이터를 어떻게 전송해야 하는지 설명하고 있습니다. curl 예제에서 필수적인 부분만 정리하면 아래와 같습니다.

curl --request POST \
  --url 'https://your-domain.atlassian.net/rest/api/3/issue' \
  --user 'email@example.com:<api_token>' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
  "fields": {
    "project": "PROJECT_KEY",
    "summary": "이슈 제목",
    "issuetype": {
      "id": "10002"
    },
    "description": {
      "version": 1
      "type": "doc",
      "content": [
        {
          "type": "paragraph",
          "content": [
            {
              "type": "text",
              "text": "이슈 설명"
            }
          ]
        }
      ],
    }
  }
}'

로그프레소에서는 dict() 함수를 이용하여 맵 (map) 타입의 값을 표현할 수 있습니다. dict() 함수는 키, 값 쌍을 순차적으로 입력받습니다. 예를 들어, 아래와 같은 JSON 객체를 표현하려면,

{"project": "PROJECT_KEY", "summary": "이슈 제목"}

로그프레소 쿼리에서는 아래와 같이 표현할 수 있습니다.

dict("project", "PROJECT_KEY", "summary", "이슈 제목")

리스트 (list) 타입의 값을 표현하려면 array() 함수를 사용합니다. 예를 들어, 다음과 같은 JSON 배열을 표현하려면,

[{"type": "text", "text": "이슈 설명"}]

로그프레소 쿼리에서는 아래와 같이 표현할 수 있습니다.

array(dict("type", "text", "text", "이슈 설명"))

가변적으로 값을 생성하려면 입력 레코드의 description 필드를 활용할 수 있습니다.

array(dict("type", "text", "text", description))

즉, dict()와 array()를 중첩하면 Jira에서 요구하는 복잡한 형태의 본문 데이터를 정의할 수 있습니다. 아래의 로그프레소 쿼리에서 PROJECT_KEY, YOUR_ID, EMAIL_ADDR, API_TOKEN 값을 변경하여 실행해보세요.

API_TOKEN 발급 방법은 Atlassian Jira 앱 설치 가이드를 참고하시기 바랍니다.

json "{}" 
| eval project_key = "PROJECT_KEY", issue_type = "10002", summary = "이슈 제목", description = "이슈 설명"
| eval headers = dict("Accept", "application/json", "Content-Type", "application/json", "User-Agent", "Logpresso") 
| eval fields = 
    dict("project", dict("key", project_key), 
         "summary", summary, 
         "issuetype", dict("id", issue_type),
         "description", dict("version", 1,
                             "type", "doc",
                             "content", array(dict("type", "paragraph", 
                                                   "content", array(dict("type", "text", "text", description))))))
| eval url = "https://YOUR_ID.atlassian.net/rest/api/3/issue"
| wget method=post auth="EMAIL_ADDR:API_TOKEN" header=headers format=json

여기에서 사용된 wget 명령어의 옵션 설명은 아래와 같습니다:

  • method: POST 메소드 지정
  • auth: HTTP Basic 인증에 필요한 계정 및 암호 지정
  • header: Jira REST API 호출에 필요한 HTTP 헤더 키/값 쌍을 포함한 맵 필드를 지정
  • format: json 포맷을 지정하면 입력 레코드로 전달되는 모든 필드를 하나의 JSON 객체로 직렬화하여 HTTP 본문으로 전송

로그프레소 3은 wget 쿼리를 복잡하게 만들어서 실행해야 하지만, 로그프레소 4에서는 Jira 앱을 설치하여 편리하게 원하시는 작업을 수행할 수 있습니다. 이제 SIEM을 Jira에 통합하여 원하시는 업무 흐름을 만들어보세요.

둘러보기

더보기

RFC6587: TCP를 통한 SYSLOG 전송 규약

SYSLOG는 UDP 뿐 아니라 TCP로 전송할 수도 있습니다. 이 때 메시지는 어떤 규칙으로 작성되어야 하는지 간단하게 알아봅니다.

2023-05-20

NTFS 포렌식

NTFS 파일시스템의 핵심 구조와 함께 코드게이트 컨퍼런스 포렌식 문제 풀이를 설명합니다.

2020-09-12