🎯 클라우드 퍼포먼스 최적화 - 프로젝트 자동화 세팅 가이드

프로젝트 개요

  • 팀 구성: 클라우드 엔지니어 4인
  • 기간: 2026-02-11 ~ 2026-03-19
  • 목표: AWS 기반 클라우드 퍼포먼스 최적화
  • 작성 시간: 2026-02-11 09:39 KST

📑 목차


1. 협업 도구 구성

도구역할비고
Notion스프린트 보드, 이슈 트래커, 회의록, 기획서메인 프로젝트 관리
Google Sheets데일리 스탠드업 기록팀원 일일 보고 전용
Discord실시간 소통 + 자동 알림 수신웹훅으로 봇 알림
GitHub코드 저장소, Issue/PR 관리Actions로 Notion 연동

💡 도구 선택 원칙

핵심

  • Notion = Source of Truth (태스크, 상태, 스프린트 관리)
  • Sheets = 데일리 스탠드업 입력 전용 (가볍게 기록)
  • Discord = 알림 수신 채널 (자동화된 알림만)
  • GitHub = 코드 + Issue/PR → Notion 자동 반영

2. Notion 워크스페이스

📋 구조

클라우드 퍼포먼스 최적화 프로젝트 (루트 페이지)
├── 📊 스프린트 보드 DB        ← 칸반 뷰로 태스크 관리
├── 🐛 이슈 트래커 DB          ← 버그/이슈 추적
├── 📝 회의록 DB               ← 회의 기록
├── 📈 대시보드                ← 진행 현황 요약
├── 📄 기획서 (제출용)         ← 최종 산출물
├── 🏗️ 아키텍처 & 설계문서     ← 기술 설계
├── 🏛️ 아키텍처 결정 기록 (ADR) ← 기술적 의사결정 ([작성가이드](https://www.notion.so/ADR-Architecture-Decision-Record-305fed463c8481faba5bfbe47f0b6e9c))
└── 🔗 링크모음 & 일정         ← 참고 자료

📊 스프린트 보드 속성

속성타입
태스크Title태스크명
상태Select백로그, 이번 스프린트, 진행중, 리뷰, 완료
담당자People팀원
우선순위SelectP0 필수, P1 중요, P2 보통, P3 나중에
스프린트SelectSprint 0~3
카테고리Multi-select인프라, 모니터링, 문서, 테스트 등
SPNumber스토리 포인트
마감일Date마감 일자
GitHubURL관련 이슈/PR 링크

🔑 Notion 접속 정보

항목
루트 페이지 ID303fed46-3c84-80bb-b54b-c222292961a8
스프린트 보드 DB303fed46-3c84-816d-b1a7-e1089a64ab17
이슈 트래커 DB303fed46-3c84-8198-8e87-f24333403622
회의록 DB303fed46-3c84-8107-a408-f3d88aa812eb
ADR DB305fed46-3c84-811a-a2c3-d25aa65537a3

👥 팀원 게스트 초대

반드시 게스트로 초대 (멤버 X)

멤버 초대 시 블록 1000개 제한 + 유료 전환 압박

  1. 루트 페이지 → 우측 상단 공유 클릭
  2. 팀원 이메일 입력 → 권한: 편집 가능(Can edit)
  3. 초대 클릭 (상위 1개만 하면 하위 전체 접근 가능)

3. Google Sheets 구성

📋 시트 탭 목록

시트명용도자동화
백로그Notion 태스크 미러링✅ 30분마다 자동 갱신
스프린트 현황SP 집계 (총/완료/이월/완료율)✅ 자동 집계
데일리 스탠드업팀원 일일 보고✅ 매일 10:00 Discord 전송
Sprint 0~3스프린트별 상세수동
간트 차트일정 시각화수동
회고스프린트 회고수동

📝 데일리 스탠드업 컬럼

컬럼설명
날짜YYYY-MM-DD
이름팀원명
어제 한 일 (티켓)완료한 태스크 ID/이름
어제 한 일 (기타)티켓 외 작업
오늘 할 일오늘 계획
블로커막히는 것 (없으면 “없음”)
투입 가능오늘 투입 가능 시간 (예: 4h, 풀타임)
자신감(1~5)오늘 할 일 완료 자신감
메모기타

🔑 Sheets 접속 정보

항목
스프레드시트 ID1aSCCbBYXI7USvJX9_zQdZdFNUJw254LcHhEsvs_kgiM
서비스 계정sheets-connector@claude-business-card.iam.gserviceaccount.com

4. 자동화 파이프라인

┌─────────────┐     POST (실시간)    ┌─────────────┐
│   Notion    │ ──────────────────→ │  Cloud Run  │
│ 스프린트보드 │    웹훅 이벤트       │   (프록시)   │
└─────────────┘                     └──────┬──────┘
                                           │ GET (트리거)
                                           ▼
┌─────────────┐     30분 폴링       ┌─────────────┐
│   Sheets    │ ◀──────────────── │ Apps Script │
│ 백로그+현황  │                     │  동기화 엔진 │
└─────────────┘                     └──────┬──────┘
                                           │ 매일 10:00
       ┌───────────────────────────────────┘
       ▼
┌─────────────┐
│   Discord   │ ◀── 스탠드업 + 변경 알림
│  봇 알림    │
└─────────────┘
       ▲
       │ GitHub Actions
┌─────────────┐
│   GitHub    │
│  Issue/PR   │ → Notion 상태 자동 변경 (Python)
└─────────────┘

Apps Script POST 제한

Google Apps Script 웹앱은 외부 POST 요청 시 302 리다이렉트 → 405 에러 발생. Notion 웹훅이 doPost에 도달 불가. Cloud Run 프록시가 POST→GET 변환 담당.

동기화 흐름 요약

흐름트리거도구설명
Notion → Sheets30분 폴링 + 웹훅Apps Script백로그 전체 갱신 + SP 집계
Notion → Discord웹훅 (실시간)Apps Script태스크 변경 알림
Sheets → Discord매일 10:00Apps Script데일리 스탠드업 전송
GitHub → NotionIssue/PR 이벤트Python + GitHub Actions이슈 닫힘 → 완료, PR 머지 → 리뷰

5. Apps Script 설정

📂 파일 위치

/Users/a1234/project-automation/apps-script/NotionSync.gs

⚙️ 설치 방법

  1. Google Sheets → 확장 프로그램Apps Script
  2. NotionSync.gs 내용 전체 복사 + 붙여넣기
  3. CONFIG.DISCORD_WEBHOOK_URL 설정
  4. setupAll() 실행 (트리거 등록 + 초기 동기화)

🔧 주요 함수

함수설명
setupAll()전체 설정 (최초 1회)
syncNotionToSheets()Notion → Sheets 수동 동기화
sendDailyStandup()스탠드업 Discord 수동 전송
removeTrigger()모든 트리거 제거

📊 자동 트리거

트리거주기대상 함수
Notion 동기화30분마다syncNotionToSheets()
데일리 스탠드업매일 10:00 KSTsendDailyStandup()

6. Notion 웹훅 실시간 동기화

Apps Script 직접 수신 불가

GAS 웹앱은 외부 POST 시 302 리다이렉트 → 405 에러 발생. Cloud Run 프록시가 POST를 받아 Apps Script를 GET으로 트리거합니다.

📂 프록시 코드 위치

/Users/a1234/project-automation/webhook-proxy/
├── index.js        # Express 서버 (POST 수신 → 서명 검증 → GET 전달)
├── package.json    # 의존성 (express)
└── Dockerfile      # Cloud Run 배포용

🔑 현재 배포 정보

항목
Cloud Run URLhttps://notion-webhook-proxy-1060223101922.asia-northeast3.run.app
웹훅 엔드포인트/notion-webhook (POST)
헬스체크/ (GET)
토큰 확인/token (GET)
GCP 프로젝트claude-business-card (default config)
리전asia-northeast3 (서울)
Apps Script URLhttps://script.google.com/macros/s/AKfycbwLcfl-ZCXfPZVz3wxiluNaSfcb-Qk9K4-zfAHx-XIb4ATyXzYKwnVsAh3k6e4xsLnp/exec

📋 Notion 웹훅 등록 (3단계)

Step 1 - 구독 생성

  1. Notion → 설정 → 내 연결 → 웹훅구독 생성
  2. 엔드포인트: https://notion-webhook-proxy-1060223101922.asia-northeast3.run.app/notion-webhook
  3. 구독 이벤트 전부 체크 (또는 필요한 것만)

Step 2 - 인증 토큰 확인

  1. Notion이 verification_token POST → Cloud Run이 200 OK 반환 + 토큰 저장
  2. 토큰 확인: https://notion-webhook-proxy-1060223101922.asia-northeast3.run.app/token 접속
  3. 토큰을 Notion UI 인증 토큰 입력란에 붙여넣기
  4. 구독 활성화 완료

Step 3 - 서명 검증 (자동)

  • Cloud Run이 X-Notion-Signature 헤더의 HMAC-SHA256 서명 자동 검증
  • 저장된 verification_token으로 서명 재계산 → 불일치 시 401 거부

Notion 연동 기능(Capabilities) 확인

  • 댓글 이벤트 수신하려면: 기능 탭 → “댓글 읽기” 활성화 필수
  • 페이지 접근 권한: 연동이 해당 페이지/DB에 추가되어 있어야 이벤트 발생

💡 동작 방식

Notion 태스크 변경
  → Notion POST → Cloud Run /notion-webhook
  → X-Notion-Signature 서명 검증
  → 이벤트 타입 필터링
  → Apps Script GET ?trigger=webhook&type=이벤트 호출
  → syncNotionToSheets() 실행 (실시간 반영)
  → Webhook 로그 시트에 기록
  → 30분 폴링은 fallback으로 유지

📊 Cloud Run이 전달하는 이벤트 (10개)

이벤트설명
page.properties_updated상태, 담당자, SP 등 속성 변경
page.created새 태스크 생성
page.deleted태스크 삭제
page.undeleted삭제 취소
page.moved페이지 이동
page.content_updated페이지 내용 변경 (배치 전송)
comment.created댓글 생성
comment.updated댓글 수정
database.schema_updatedDB 스키마 변경
data_source.schema_updated데이터 소스 스키마 변경

📊 Notion 전체 웹훅 이벤트 (23개)

카테고리이벤트
페이지 (8)page.content_updated, page.created, page.deleted, page.locked, page.moved, page.properties_updated, page.undeleted, page.unlocked
데이터베이스 (6)database.content_updated, database.created, database.deleted, database.moved, database.schema_updated, database.undeleted
데이터 소스 (6)data_source.content_updated, data_source.created, data_source.deleted, data_source.moved, data_source.schema_updated, data_source.undeleted
댓글 (3)comment.created, comment.deleted, comment.updated

7. Cloud Run 프록시 운영

🔧 주요 명령어

# GCP config 확인 + 활성화
gcloud config configurations list
gcloud config configurations activate default  # claude-business-card 프로젝트
 
# 배포 (코드 수정 후)
cd /Users/a1234/project-automation/webhook-proxy
gcloud run deploy notion-webhook-proxy \
  --source . \
  --region asia-northeast3 \
  --allow-unauthenticated \
  --set-env-vars "APPS_SCRIPT_URL=https://script.google.com/macros/s/AKfycbwLcfl-ZCXfPZVz3wxiluNaSfcb-Qk9K4-zfAHx-XIb4ATyXzYKwnVsAh3k6e4xsLnp/exec" \
  --project claude-business-card \
  --quiet
 
# Apps Script URL 변경 시 (환경변수만 업데이트)
gcloud run services update notion-webhook-proxy \
  --region asia-northeast3 \
  --project claude-business-card \
  --set-env-vars "APPS_SCRIPT_URL=https://script.google.com/.../exec"
 
# 로그 확인
gcloud run services logs read notion-webhook-proxy \
  --region asia-northeast3 \
  --project claude-business-card \
  --limit 30
 
# 서비스 상태 확인
gcloud run services describe notion-webhook-proxy \
  --region asia-northeast3 \
  --project claude-business-card
 
# 서비스 삭제 (프로젝트 종료 후)
gcloud run services delete notion-webhook-proxy \
  --region asia-northeast3 \
  --project claude-business-card

📊 헬스체크 / 디버깅

# 헬스체크
curl https://notion-webhook-proxy-1060223101922.asia-northeast3.run.app/
 
# 저장된 인증 토큰 확인
curl https://notion-webhook-proxy-1060223101922.asia-northeast3.run.app/token
 
# 수동 이벤트 테스트 (POST)
curl -X POST https://notion-webhook-proxy-1060223101922.asia-northeast3.run.app/notion-webhook \
  -H "Content-Type: application/json" \
  -d '{"type": "page.properties_updated", "data": {"page_id": "test"}}'

💰 비용

무료 범위

  • Cloud Run 무료 티어: 월 200만 요청, CPU 180,000 vCPU-초
  • 웹훅 트래픽은 극소량 → 사실상 무료
  • 프로젝트 종료 후 gcloud run services delete로 정리

8. GitHub → Notion 동기화

📂 파일 위치

/Users/a1234/project-automation/
├── config.py            # 설정 (토큰, DB ID)
├── notion_client.py     # Notion API 클라이언트
├── discord_notify.py    # Discord 웹훅 클라이언트
└── github_to_notion.py  # GitHub Issue/PR → Notion 상태 변경

동작 방식

GitHub 이벤트Notion 상태 변경매칭 기준
Issue 닫힘완료이슈 제목 ↔ 태스크명
PR 머지리뷰브랜치명/PR 제목 ↔ 태스크명

⚙️ 실행 방법

# 수동 실행
python3 /Users/a1234/project-automation/github_to_notion.py
 
# GitHub Actions (추천) - repo 생성 후 워크플로우 설정

9. 트러블슈팅 기록

🔧 Apps Script 외부 POST 불가 (302 → 405)

핵심 교훈

Google Apps Script 웹앱은 외부 POST 요청을 직접 받을 수 없다

  • 현상: Notion 웹훅 POST → script.google.com 302 리다이렉트 → script.googleusercontent.com 405 Method Not Allowed
  • 원인: GAS 보안 정책상 모든 요청을 googleusercontent.com으로 리다이렉트. POST → GET 변환되면서 body 유실
  • GET은 정상: 리다이렉트 후에도 GET은 정상 동작
  • 해결: Cloud Run 프록시가 POST 수신 → Apps Script를 GET으로 트리거

🔧 Apps Script 배포 버전 미반영

  • 현상: 코드 수정했는데 응답이 안 바뀜
  • 원인: Apps Script는 코드 저장 ≠ 배포 반영. 반드시 “새 버전”으로 재배포 필요
  • 해결: 배포 → 배포 관리 → 연필 아이콘 → “새 버전” 선택 → 배포
  • 주의: “새 배포”하면 URL이 바뀜. 기존 배포 수정은 URL 유지

🔧 Notion 웹훅 댓글 이벤트 미수신

  • 현상: comment.created 이벤트가 안 옴
  • 원인: Notion 연동 → 기능(Capabilities)에서 “댓글 읽기” 미활성화
  • 해결: 연동 설정 → Capabilities 탭 → “Read comments” 활성화

🔧 Notion 인증 토큰 “유효하지 않음”

  • 현상: /token에서 확인한 토큰을 Notion UI에 입력해도 거부
  • 해결: 공백 없이 정확히 복사. 안 되면 구독 삭제 후 새로 생성 → 새 토큰 발급

10. 남은 TODO

  • Discord 서버 생성 + 웹훅 URL 발급
    • Apps Script CONFIG.DISCORD_WEBHOOK_URL에 설정
    • Python config.py DISCORD_WEBHOOK_URL에 설정
  • GitHub repo 생성
    • Python config.py GITHUB_REPO"owner/repo-name" 설정
    • .github/workflows/notion-sync.yml 워크플로우 추가
  • Notion 게스트 초대 (팀원 3명)
    • 루트 페이지 → 공유 → 이메일 입력 → Can edit
  • Apps Script 웹앱 배포
  • Cloud Run 프록시 배포
  • Notion 웹훅 구독 등록 + 인증
  • Notion 연동 Capabilities 확인 (댓글 읽기 등)
  • 웹훅 실시간 동기화 동작 검증 (Sheets 반영 확인)
  • 도메인/시나리오 확정 (팀 미팅)
  • 프로젝트 종료 후 Cloud Run 서비스 삭제 (과금 방지)

11. 주요 일정

일자마일스톤비고
2/11 (화)킥오프 미팅, 도메인 확정Sprint 0 시작
2/13 (목)기획서 제출
2/23 (일)Sprint 0 종료
2/24 (월)발표, Sprint 1 시작
3/2 (일)Sprint 1 종료
3/3 (월)Sprint 2 시작
3/9 (일)중간보고서 제출, Sprint 2 종료
3/10 (월)Sprint 3 시작
3/18 (수)Sprint 3 종료
3/19 (목)최종 제출

참고