🎯 클라우드 퍼포먼스 최적화 - 프로젝트 자동화 세팅 가이드
프로젝트 개요
- 팀 구성: 클라우드 엔지니어 4인
- 기간: 2026-02-11 ~ 2026-03-19
- 목표: AWS 기반 클라우드 퍼포먼스 최적화
- 작성 시간: 2026-02-11 09:39 KST
📑 목차
- 협업 도구 구성
- Notion 워크스페이스
- Google Sheets 구성
- 자동화 파이프라인
- Apps Script 설정
- Notion 웹훅 실시간 동기화
- Cloud Run 프록시 운영
- GitHub → Notion 동기화
- 트러블슈팅 기록
- 남은 TODO
- 주요 일정
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 | 팀원 |
| 우선순위 | Select | P0 필수, P1 중요, P2 보통, P3 나중에 |
| 스프린트 | Select | Sprint 0~3 |
| 카테고리 | Multi-select | 인프라, 모니터링, 문서, 테스트 등 |
| SP | Number | 스토리 포인트 |
| 마감일 | Date | 마감 일자 |
| GitHub | URL | 관련 이슈/PR 링크 |
🔑 Notion 접속 정보
| 항목 | 값 |
|---|---|
| 루트 페이지 ID | 303fed46-3c84-80bb-b54b-c222292961a8 |
| 스프린트 보드 DB | 303fed46-3c84-816d-b1a7-e1089a64ab17 |
| 이슈 트래커 DB | 303fed46-3c84-8198-8e87-f24333403622 |
| 회의록 DB | 303fed46-3c84-8107-a408-f3d88aa812eb |
| ADR DB | 305fed46-3c84-811a-a2c3-d25aa65537a3 |
👥 팀원 게스트 초대
반드시 게스트로 초대 (멤버 X)
멤버 초대 시 블록 1000개 제한 + 유료 전환 압박
- 루트 페이지 → 우측 상단 공유 클릭
- 팀원 이메일 입력 → 권한: 편집 가능(Can edit)
- 초대 클릭 (상위 1개만 하면 하위 전체 접근 가능)
3. Google Sheets 구성
📋 시트 탭 목록
| 시트명 | 용도 | 자동화 |
|---|---|---|
| 백로그 | Notion 태스크 미러링 | ✅ 30분마다 자동 갱신 |
| 스프린트 현황 | SP 집계 (총/완료/이월/완료율) | ✅ 자동 집계 |
| 데일리 스탠드업 | 팀원 일일 보고 | ✅ 매일 10:00 Discord 전송 |
| Sprint 0~3 | 스프린트별 상세 | 수동 |
| 간트 차트 | 일정 시각화 | 수동 |
| 회고 | 스프린트 회고 | 수동 |
📝 데일리 스탠드업 컬럼
| 컬럼 | 설명 |
|---|---|
| 날짜 | YYYY-MM-DD |
| 이름 | 팀원명 |
| 어제 한 일 (티켓) | 완료한 태스크 ID/이름 |
| 어제 한 일 (기타) | 티켓 외 작업 |
| 오늘 할 일 | 오늘 계획 |
| 블로커 | 막히는 것 (없으면 “없음”) |
| 투입 가능 | 오늘 투입 가능 시간 (예: 4h, 풀타임) |
| 자신감(1~5) | 오늘 할 일 완료 자신감 |
| 메모 | 기타 |
🔑 Sheets 접속 정보
| 항목 | 값 |
|---|---|
| 스프레드시트 ID | 1aSCCbBYXI7USvJX9_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 → Sheets | 30분 폴링 + 웹훅 | Apps Script | 백로그 전체 갱신 + SP 집계 |
| Notion → Discord | 웹훅 (실시간) | Apps Script | 태스크 변경 알림 |
| Sheets → Discord | 매일 10:00 | Apps Script | 데일리 스탠드업 전송 |
| GitHub → Notion | Issue/PR 이벤트 | Python + GitHub Actions | 이슈 닫힘 → 완료, PR 머지 → 리뷰 |
5. Apps Script 설정
📂 파일 위치
/Users/a1234/project-automation/apps-script/NotionSync.gs
⚙️ 설치 방법
- Google Sheets → 확장 프로그램 → Apps Script
NotionSync.gs내용 전체 복사 + 붙여넣기CONFIG.DISCORD_WEBHOOK_URL설정setupAll()실행 (트리거 등록 + 초기 동기화)
🔧 주요 함수
| 함수 | 설명 |
|---|---|
setupAll() | 전체 설정 (최초 1회) |
syncNotionToSheets() | Notion → Sheets 수동 동기화 |
sendDailyStandup() | 스탠드업 Discord 수동 전송 |
removeTrigger() | 모든 트리거 제거 |
📊 자동 트리거
| 트리거 | 주기 | 대상 함수 |
|---|---|---|
| Notion 동기화 | 30분마다 | syncNotionToSheets() |
| 데일리 스탠드업 | 매일 10:00 KST | sendDailyStandup() |
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 URL | https://notion-webhook-proxy-1060223101922.asia-northeast3.run.app |
| 웹훅 엔드포인트 | /notion-webhook (POST) |
| 헬스체크 | / (GET) |
| 토큰 확인 | /token (GET) |
| GCP 프로젝트 | claude-business-card (default config) |
| 리전 | asia-northeast3 (서울) |
| Apps Script URL | https://script.google.com/macros/s/AKfycbwLcfl-ZCXfPZVz3wxiluNaSfcb-Qk9K4-zfAHx-XIb4ATyXzYKwnVsAh3k6e4xsLnp/exec |
📋 Notion 웹훅 등록 (3단계)
Step 1 - 구독 생성
- Notion → 설정 → 내 연결 → 웹훅 → 구독 생성
- 엔드포인트:
https://notion-webhook-proxy-1060223101922.asia-northeast3.run.app/notion-webhook - 구독 이벤트 전부 체크 (또는 필요한 것만)
Step 2 - 인증 토큰 확인
- Notion이
verification_tokenPOST → Cloud Run이 200 OK 반환 + 토큰 저장 - 토큰 확인:
https://notion-webhook-proxy-1060223101922.asia-northeast3.run.app/token접속 - 토큰을 Notion UI 인증 토큰 입력란에 붙여넣기
- 구독 활성화 완료
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_updated | DB 스키마 변경 |
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.com302 리다이렉트 →script.googleusercontent.com405 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.pyDISCORD_WEBHOOK_URL에 설정
- Apps Script
- GitHub repo 생성
- Python
config.pyGITHUB_REPO에"owner/repo-name"설정 .github/workflows/notion-sync.yml워크플로우 추가
- Python
- 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 (목) | 최종 제출 |
참고
- 논의 자료: 1차_프로젝트_도메인_시나리오_논의자료
- 자동화 코드:
/Users/a1234/project-automation/