AWS를 비롯한 클라우드 인프라를 정기적으로 점검해야 하는 경우가 많습니다. 특히 월간 보고서를 매번 수동으로 작성하다 보면 시간이 많이 들고 실수도 발생하기 쉽습니다.
그래서 이번에 Go 언어로 자동으로 리포트를 생성해주는 스크립트를 만들고 이를 설명해보려고 해요.
목표
- 매달 월요일, 목요일에 점검이 이뤄졌다고 가정
- 인프라 점검은 매주 정해진 요일에 반복적으로 수행되는 일이 많습니다.
- 각 점검일마다 그에 해당하는 작업 기간 정보를 추출
- 월요일 점검이면 지난 금~일 기간을, 목요일 점검이면 지난 화~수 기간을 점검하는 것으로 보고 있습니다.
- 이를 기반으로 Markdown 보고서 자동 생성
- 사람이 일일이 문서를 만들 필요 없이 CLI 실행 한번으로 리포트가 자동 생성
전체 구조 요약
main.go
├── main() // 실행 진입점
├── buildHeader() // 보고서 상단 작성 (개요, 점검항목 등)
├── buildDetails() // 보고서 중간 (개별 점검 기록)
├── buildFooter() // 보고서 하단 (이슈 리포트, 기타 작업)
- main()은 Go의 메인 실행 함수입니다.
CLI로부터 연도/월을 인자로 받고, 그걸 기준으로 전체 리포트 생성 흐름이 시작됩니다. - buildHeader()는 보고서의 제목, 개요, 점검 항목 등을 적는 부분입니다.
- buildDetails()는 실제로 어떤 날 점검이 있었고, 그날의 대상 기간이 언제였는지를 표로 만듭니다.
- buildFooter()는 이슈가 있을 경우 채워 넣을 수 있도록 미리 템플릿만 생성해 둡니다.
날짜 계산 로직 이해
1. 입력값 처리
year, _ := strconv.Atoi(os.Args[1])
monthInt, _ := strconv.Atoi(os.Args[2])
→ 프로그램 실행 시 커맨드라인에서 연도와 월을 입력받습니다.
예: go run main.go 2025 6 → 2025년 6월의 보고서를 만든다는 뜻입니다.
2. 점검일 계산
startDate := time.Date(year, month, 1, 0, 0, 0, 0, time.UTC)
endDate := startDate.AddDate(0, 1, -1)
→ 입력받은 달의 1일부터 말일까지 범위를 계산합니다.
→ 그리고 1주일 전부터 10일 후까지의 날짜들 중 월요일/목요일을 모두 수집합니다.
d := startDate.AddDate(0, 0, -7)
limit := endDate.AddDate(0, 0, 10)
→ 어떤 점검일은 실제로는 전월에 해당하지만, 대상 기간이 현재 달에 걸쳐 있을 수도 있기 때문입니다.
→ 그래서 시작일보다 7일 전, 종료일보다 10일 후까지 넉넉하게 잡고 월/목을 필터링합니다.
3. 유효한 점검일 필터링
if (d.Month() == month || schedStart.Month() == month || schedEnd.Month() == month) && schedStart.Month() != month-1 {
→ 모든 월/목이 무조건 리포트에 들어가는 건 아닙니다 .
→ 리포트에 포함될 점검일은 아래 조건을 만족해야 합니다:
점검일(d), 점검 시작일(schedStart), 점검 종료일(schedEnd) 중 하나라도 현재 달에 포함 단, 시작일이 전월이면 제외 (전월에 해당하는 점검이기 때문에)
이 로직은 예외 처리를 잘해야할거 같아요.
Markdown 보고서 구성
자동 생성되는 리포트는 Markdown 포맷으로 구성되어 있으며, 다음과 같은 구조로 만들었어요.
1. buildHeader()
## 1. Overview
- This report is provided for a regular inspection result of infrastructure environments.
- Regular inspection is scheduled on every Monday and Thursday.
이 섹션은 보고서의 개요를 담당하며, 보고 목적과 점검 일정 등을 간단하게 기술합니다.
이 보고서는 매주 월요일과 목요일에 진행된 점검 내용을 바탕으로 작성됩니다.
관리자나 운영자가 이 부분만 읽고도 전체 리포트의 성격을 파악할 수 있어야 하므로, 명확하고 간결한 설명이 중요합니다.
2. buildDetails()
| Reported Date | Scheduled Date
| -------------- | -------------------
| 2025.06.03 | 2025.05.30 ~ 06.02
→ Reported Date : 실제 점검이 수행된 날짜입니다. 주로 월요일 또는 목요일입니다.
→ Scheduled Date : 해당 점검이 다루는 대상 기간입니다.
3. buildFooter()
## 3. Issue Report
| ReportNumber | Subject | Contents |
| ------------ | ----------------| ---------------------------------------- |
| 15158977-001 | GuardDuty Alert | Malware alert detected on EC2 i-xxxxxxx |
→ 리포트의 하단에는 문제가 발생했을 경우 작성할 수 있도록 미리 준비된 템플릿이 포함됩니다.
실행 예시
$ go run main.go 2025 6
✅ 생성 완료: Report.md
이처럼 리포트는 Markdown 기반으로 작성되기 때문에 GitHub, Wiki, Confluence, Notion 등에 그대로 붙여넣거나 PDF로 변환해 활용하기 매우 용이합니다.
만든 이유와 느낀 점
- 매주 점검 리포트를 수동으로 작성하면서 시간낭비가 반복됨
- 반복적인 보고 작업을 자동화하며 더 중요한 다른일에 집중할수 있음
- Go언어의 time.time API가 생각보다 강력하고 직관적이지만, 월 단위/주 단위 계산은 좀 까다로움
- 코드로 날짜 계산을 명확히 해두면 실제 업무 자동화에 바로 적용되어서 도움이 많이 될듯
'개발 > Golang' 카테고리의 다른 글
| [go] golang으로 RSA 암복호화 테스트 (2) | 2025.07.27 |
|---|---|
| [go] golang으로 hsm 연동 및 RSA 키 생성부터 서명 검증 (1) | 2025.07.24 |

