Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

ssuperjun 님의 블로그

[장애 이력 자동 작성 도구5] 두레이 태스크로 등록 본문

인턴

[장애 이력 자동 작성 도구5] 두레이 태스크로 등록

ssuperjun 2026. 3. 5. 18:55

계획

  1. Redis 설치 - 완료
  2. Redis 장애 발생시키기 - 완료
  3. 장애 로그를 수집하는 스크립트 작성(OOM Killed 상황부터 구현 시작) - 완료
  4. 두레이 태스크로 등록
  5. Redis 센티널 설치 -> 마스터 다운, 복제 지연  상황 재현 -> 로그 수집 스크립트 작성

4번부터 계속


두레이 태스크 등록을 위해 필요한 정보 정리

 

사용할 API - 태스크(업무) 등록

POST /project/v1/projects/{project-id}/posts

:프로젝트 내에 업무를 생성

 

Base URL

민간 클라우드: https://api.dooray.com

 

두레이 도메인: nhnent.dooray.com

 

인증 토큰

Authorization: dooray-api {TOKEN} 헤더

  • 개인설정 > API > 개인 인증 토큰에서 발급

project-id(태스크를 등록할 프로젝트 ID): 두레이 업무 > '데이터운영팀-2026인턴' 프로젝트 접속시 나타나는 URL 뒷부분 숫자

 

담당자 organizationMemberId: 메일 주소 아님

GET /common/v1/members/me 이용해 토큰 소유자 id 자동 조회 -> 여러 사용자가 각자 토큰으로 실행함을 이용해 담당자가 바뀌어도 유동적으로 실행되도록

 

태스크 제목 형식: [발생 시점 연월일] [hostname] 장애 발생 원인

예시: [2026-02-27] [infa-testsrv-cb801] OOM Kill

 

본문 내용: 스크립트 output 그대로


시행착오

 

문제

hcon에서 스크립트를 실행했을 때

GET /project/v1/projects?member=me 로 프로젝트명 검색 -> 프로젝트 id 찾기 

=> 부분에서 오류 발생

 

원인

두레이 접속 시 오류가 발생함

[ERROR] 두레이 사전 조회 실패: 두레이 API 오류 (403): {"header":{"resultMessage":"AUTH_FORBIDDEN_ACL_IP_ERROR"}}

 

세부 원인 파악

curl -H "Authorization: dooray-api 인증토큰" https://api.dooray.com/common/v1/members/me

실행 결과, 아래와 같이 실행되는 것으로 보아 IP ACL 문제는 아님(두레이가 hcon IP 차단하고 있지는 않음)

{"header":{"isSuccessful":true,"resultMessage":"","resultCode":0},"result":{"id":(생략),"nativeName":"","nickname":"","displayMemberId":null}}[

 

진짜 문제

curl -H "Authorization: dooray-api 인증토큰" \
  "https://api.dooray.com/project/v1/projects?member=me&size=100"

실행 결과

{"header":{"resultMessage":"AUTH_FORBIDDEN_ACL_IP_ERROR"}}

=> members/me 허용되지만, 프로젝트(데이터운영팀-2026인턴) API 자체에 IP ACL 걸려 있어 hcon에서는 프로젝트 API 접근 불가능함

 

해결 시도1

두레이 관리자 설정에서 API IP ACL을 변경해야 하지만, 관리자 권한은 없는 상황

어쩔 없지만, project-id 코드에 하드코딩하기

 

프로젝트 id를 하드코딩했음에도 여전히 문제 지속

= >프로젝트 API 전체에 IP ACL 걸려 있어 hcon 프로젝트(데이터운영팀-2026인턴) 접근하지 못함

 

해결 시도2

로컬 pc에서만 curl 명령(프로젝트 API 접근) 이루어짐을 확인

 

실행 방법을 다음과 같이 수정

현재 실행 방법:

hcon에서: python3 collect_redis_incident.py irteamsu@infa-testsrv-cb801

 

변경 후:

로컬에서: python3 collect_redis_incident.py irteamsu@infa-testsrv-cb801 --proxy bjpark00@hcon.nhnent.com

# hcon 경유해서 cb801 로그 수집 + 로컬에서 두레이 등록

 

그러나 문제 발생

로컬에서 ProxyJump로 cb801에 직접 접속하는 건 커버로스 인증 때문에 불가능함

 

최종 해결 방법

두레이 관리자에게 hcon IP ACL 허용 요청이 근본적인 해결책이지만

시간 관계 상 다른 방법으로 진행

1안: hcon에서 로그를 수집해 json 결과 파일을 생성하면, 로컬에서 json 파일을 받아 두레이 등록 진행

2안: SSH 터널링 - 로컬(맥북)에서 포트를 두레이 API로 포워딩해두고 hcon에서는 localhost로 요청을 보내는 방식

 

1안 단점: 스크립트가 2개로 분리되어 유지보수에 불리

2안 단점: 실행 때마다 터널을 열어야 함

 

2안으로 최종 결정


실행 구조

맥북: SSH 터널 유지 (hcon 19999 → api.dooray.com:443 포워딩)

hcon에서 localhost:19999로 요청 → 맥북 → api.dooray.com:443으로 전달

  1. hcon에서 스크립트 실행
  2. hcon에서 localhost:19999로 두레이 API 요청
  3. 요청이 맥북 터널 -> api.dooray.com으로 전달됨(IP ACL 우회를 위해 이런 흐름을 취함)

 

실행 순서1: 맥북에서 터널 열기(닫지 말고 유지)

ssh -N -R 19999:api.dooray.com:443 bjpark00@hcon.nhnent.com

 

실행 순서2: hcon에서 스크립트 실행

python3 collect_redis_incident.py irteamsu@infa-testsrv-cb801 --tunnel

—tunnel 옵션으로 두레이 API 요청이 맥북 터널을 통해 나가므로 hcon IP ACL을 우회할 수 있음

 

결과


코드 개선 여지

  1. 메시지 위 아래에 ===== 지우기, 장애 타임라인에 시각, 태그, 원본 로그, —— 지우기
  2. 태스크 제목 형식이 현재는 "[발생 시각 연월일] [hostname] 장애 발생 원인"인데, 앞에 장애이력 문구를 추가해서 "[Redis 장애이력] [발생 시각 연월일] [hostname] 장애 발생 원인"으로 바꾸기?
  3. 등록 시 업무 상태가 '할일’로 표시되는데, 장애 해결이 안된 상황에서 스크립트를 실행하면 두레이 태스크가 '할일’로 뜨고, 다 해결되면 '완료’로 뜨게 바꾸기
    참고
    업무 상태 추가 부분(진행중, 완료): POST /project/v1/projects/{project-id}/workflows
    업무 상태 수정: PUT /project/v1/projects/{project-id}/workflows/{workflow-id}
    업무 상태를 완료로 변경: POST /project/v1/projects/{project-id}/posts/{post-id}/set-done
  4. cb801에서 —tunnel 옵션으로 로컬 실행 시 두레이 API 호출 실패하는 문제 해결 필요
    [ERROR] 두레이 사전 조회 실패: 두레이 API 호출 실패: <urlopen error [Errno 111] Connection refused>
  5. config파일 만들어 민감정보 따로 저장(인증토큰 등)

고도화 아이디어

  1. 두레이 태스크 중복 등록 방지 (같은 장애를 실행했을 기존 태스크 업데이트)
  2. —no-dooray 옵션 추가 (타임라인만 출력하고 등록은 생략)

고안하고 보니 가치가 낮아 보이는 아이디어

  1. 담당자가 접근 가능한 프로젝트 목록을 보고 (GET /project/v1/projects)
    프로젝트 상태가 active, 접근범위가 private인 프로젝트에만 태스크 생성 (POST /project/v1/projects/{project-id}/posts)
  2. 만약 private인 프로젝트가 없다면 프로젝트를 생성할 수 있는지 확인 (POST /project/v1/projects/is-creatable) -> 프로젝트 생성 (POST /project/v1/projects)