뒤로가기

14. OpenClaw 자동화 및 예약 작업: Cron, Webhook 및 Gmail 연동

본 문서는 Cron 예약 작업, Webhook 트리거, Gmail Pub/Sub 연동 등 OpenClaw의 자동화 기능을 소개하여 AI 어시스턴트가 수동 응답이 아닌 능동적으로 동작하도록 합니다.

OpenClaw v2026.2 적용 | 본 문서는 AI 어시스턴트가 수동 응답이 아닌 능동적으로 동작하길 원하는 사용자에게 적합합니다.

TL;DR: Cron 예약 작업: "cron": [{"id": "daily", "schedule": "0 9 * * *", "message": "..."}]. Webhook 트리거: POST /webhook/your-path. Gmail Pub/Sub로 이메일 자동 처리. Heartbeat로 능동 점검. 설정 예: 일일 아침 브리핑 0 8 * * 1-5, CI 알림 webhook, 이메일 필터 gmail pub/sub.

자동화 개요

자동화 유형

유형 트리거 방식 적용 시나리오
Cron 예약 트리거 일일 리포트, 정기 점검
Webhook HTTP 요청 외부 시스템 연동
Gmail Pub/Sub 새 이메일 이메일 자동화
Heartbeat 주기 점검 능동 알림, 제안

아키텍처

flowchart TB
    subgraph Triggers["트리거 소스"]
        CRON[Cron 예약]
        WH[Webhook HTTP]
        GM[Gmail Pub/Sub]
        HB[Heartbeat]
    end
    
    subgraph Gateway["Gateway"]
        SCHED[스케줄러]
        ROUTE[라우터]
        AGENT[Agent]
    end
    
    subgraph Actions["동작"]
        MSG[메시지 전송]
        EXEC[작업 실행]
        NOTIF[알림 전송]
    end
    
    CRON --> SCHED
    WH --> ROUTE
    GM --> ROUTE
    HB --> SCHED
    
    SCHED --> AGENT
    ROUTE --> AGENT
    AGENT --> MSG
    AGENT --> EXEC
    AGENT --> NOTIF

Cron 예약 작업

Cron 표현식

┌───────────── 분 (0 - 59)
│ ┌───────────── 시 (0 - 23)
│ │ ┌───────────── 일 (1 - 31)
│ │ │ ┌───────────── 월 (1 - 12)
│ │ │ │ ┌───────────── 요일 (0 - 6, 0 = 일요일)
│ │ │ │ │
* * * * *

자주 쓰는 표현식

표현식 설명
0 9 * * * 매일 9:00
0 18 * * 1-5 평일 18:00
*/30 * * * * 30분마다
0 0 1 * * 매월 1일 0:00
0 9,18 * * * 매일 9:00, 18:00
0 9 * * 1 매주 월요일 9:00

Cron 작업 설정

{
  "cron": [
    {
      "id": "daily-briefing",
      "schedule": "0 9 * * *",
      "session": "main",
      "message": "오늘 일정과 할 일을 알려주세요",
      "enabled": true
    },
    {
      "id": "weekly-summary",
      "schedule": "0 18 * * 5",
      "session": "main",
      "message": "이번 주 업무 요약 생성",
      "enabled": true
    },
    {
      "id": "health-check",
      "schedule": "*/15 * * * *",
      "session": "main",
      "message": "시스템 상태 확인 후 이상 사항 보고",
      "enabled": true
    }
  ]
}

Cron 설정 항목

필드 유형 설명
id string 작업 고유 ID
schedule string Cron 표현식
session string 대상 세션
message string 전송할 메시지
enabled boolean 활성화 여부
timezone string 타임존(기본: 시스템 타임존)

Cron 작업 관리

# 모든 작업 나열
openclaw cron list

# 출력 예시:
# ID               Schedule       Status    Last Run
# daily-briefing   0 9 * * *     enabled   2026-02-26 09:00
# weekly-summary   0 18 * * 5    enabled   2026-02-23 18:00
# health-check    */15 * * * *   enabled   2026-02-26 10:30

# 수동 실행
openclaw cron run daily-briefing

# 작업 활성화/비활성화
openclaw cron enable daily-briefing
openclaw cron disable daily-briefing

# 작업 로그 확인
openclaw cron logs daily-briefing

Webhook 트리거

Webhook 설정

{
  "webhooks": [
    {
      "id": "github-push",
      "path": "/webhook/github",
      "secret": "your-webhook-secret",
      "session": "main",
      "handler": "github-push"
    },
    {
      "id": "custom-alert",
      "path": "/webhook/alert",
      "secret": "your-webhook-secret",
      "session": "main",
      "message": "알림 수신: {{data.message}}"
    }
  ]
}

Webhook 엔드포인트

POST http://your-gateway:18789/webhook/github-push
POST http://your-gateway:18789/webhook/alert

GitHub Webhook 예시

{
  "webhooks": [
    {
      "id": "github-push",
      "path": "/webhook/github",
      "secret": "${GITHUB_WEBHOOK_SECRET}",
      "session": "work",
      "handler": "github-push"
    }
  ]
}

Handler 스크립트:

// ~/.openclaw/handlers/github-push.js
module.exports = async (payload, session) => {
  if (payload.ref === 'refs/heads/main') {
    const commits = payload.commits.map(c => c.message).join('\n- ');
    return `새 푸시 감지:\n\n브랜치: main\n커밋:\n- ${commits}\n\n무엇을 도와드릴까요?`;
  }
  return null;
};

커스텀 Webhook 처리

{
  "webhooks": [
    {
      "id": "monitoring-alert",
      "path": "/webhook/alert",
      "methods": ["POST"],
      "session": "main",
      "message": "🚨 알림\n\n등급: {{data.level}}\n서비스: {{data.service}}\n메시지: {{data.message}}\n시간: {{data.timestamp}}"
    }
  ]
}

Webhook 전송:

curl -X POST http://localhost:18789/webhook/alert \
  -H "Content-Type: application/json" \
  -H "X-Webhook-Secret: your-secret" \
  -d '{
    "level": "critical",
    "service": "api-server",
    "message": "CPU 사용률 90% 초과",
    "timestamp": "2026-02-26T10:30:00Z"
  }'

Webhook 보안

{
  "webhooks": [
    {
      "id": "secure-webhook",
      "path": "/webhook/secure",
      "secret": "your-secret-key",
      "signatureHeader": "X-Signature",
      "signatureAlgorithm": "sha256",
      "ipWhitelist": ["192.168.1.0/24"]
    }
  ]
}

Gmail Pub/Sub 연동

Gmail Pub/Sub 설정

{
  "gmail": {
    "pubsub": {
      "enabled": true,
      "projectId": "your-project-id",
      "subscription": "gmail-subscription",
      "credentials": {
        "type": "service_account",
        "project_id": "your-project-id",
        "private_key_id": "...",
        "private_key": "...",
        "client_email": "..."
      },
      "filters": [
        {
          "from": "[email protected]",
          "session": "main",
          "message": "중요 이메일 수신:\n발신자: {{sender}}\n제목: {{subject}}"
        }
      ]
    }
  }
}

Gmail Pub/Sub 설정 절차

  1. Google Cloud 프로젝트 생성
  2. Gmail API 활성화
  3. Pub/Sub 토픽 생성
  4. 서비스 계정 생성
  5. Gmail watch 설정
# Gmail watch 설정
openclaw gmail watch --email [email protected]

Gmail 필터

필터 조건 설명
from 발신자 이메일
to 수신자 이메일
subject 제목 키워드
hasAttachment 첨부파일 여부
label Gmail 라벨
{
  "filters": [
    {
      "from": "[email protected]",
      "session": "work",
      "message": "GitHub 알림 수신: {{subject}}"
    },
    {
      "from": "[email protected]",
      "hasAttachment": true,
      "session": "main",
      "message": "Stripe 문서 수신, 처리 필요"
    }
  ]
}

Heartbeat 능동 점검

Heartbeat 설정

{
  "heartbeat": {
    "enabled": true,
    "interval": 3600000,
    "session": "main",
    "message": "Heartbeat: 제가 확인할 사항이 있는지 살펴봐 주세요"
  }
}

Heartbeat 용도

용도 설명
능동 알림 정기 알림
상태 점검 시스템/서비스 상태 확인
작업 제안 컨텍스트 기반 제안
컨텍스트 유지 세션 활성 유지

Heartbeat 예시

{
  "heartbeat": {
    "enabled": true,
    "interval": 1800000,
    "conditions": [
      {
        "type": "time",
        "start": "09:00",
        "end": "18:00"
      },
      {
        "type": "active",
        "session": "main"
      }
    ],
    "message": "현재 시각 기준으로 다음 사항을 확인해 주세요:\n1. 오늘 할 일\n2. 이메일 알림\n3. 일정"
  }
}

자동화 실전 예시

예시 1: 일일 아침 브리핑

{
  "cron": [
    {
      "id": "morning-briefing",
      "schedule": "0 8 * * 1-5",
      "session": "main",
      "message": "좋은 아침! 오늘 아침 브리핑:\n1. 날씨\n2. 오늘 일정\n3. 할 일\n4. 중요 이메일 요약"
    }
  ]
}

예시 2: CI/CD 알림

{
  "webhooks": [
    {
      "id": "ci-failure",
      "path": "/webhook/ci",
      "session": "dev",
      "message": "⚠️ CI 실패\n\n프로젝트: {{data.repository}}\n브랜치: {{data.branch}}\n커밋: {{data.commit}}\n오류: {{data.error}}\n\n분석 도와드릴까요?"
    }
  ]
}

예시 3: 이메일 자동 처리

{
  "gmail": {
    "pubsub": {
      "filters": [
        {
          "from": "[email protected]",
          "hasAttachment": true,
          "session": "main",
          "message": "인보이스 이메일 수신, 처리 중...\n첨부파일을 재무 폴더에 저장해 주세요"
        }
      ]
    }
  }
}

예시 4: 시스템 모니터링

{
  "cron": [
    {
      "id": "system-monitor",
      "schedule": "*/5 * * * *",
      "session": "main",
      "message": "시스템 상태 확인",
      "skills": ["system-monitor"]
    }
  ]
}

문제 해결

Cron 작업 미실행

# 작업 상태 확인
openclaw cron list

# 로그 확인
openclaw logs --filter cron

# 수동 실행 테스트
openclaw cron run task-id

Webhook 미응답

# Webhook 엔드포인트 확인
curl -X POST http://localhost:18789/webhook/test \
  -H "Content-Type: application/json" \
  -d '{"test": true}'

# 로그 확인
openclaw logs --filter webhook

Gmail Pub/Sub 미동작

# 구독 상태 확인
openclaw gmail status

# 재설정
openclaw gmail setup

# 권한 확인
openclaw gmail check-permissions

요약

자동화로 OpenClaw가 수동 응답에서 능동 작업으로 전환됩니다:

  • Cron: 예약 작업 실행
  • Webhook: 외부 이벤트 트리거
  • Gmail Pub/Sub: 이메일 자동화
  • Heartbeat: 능동 알림 및 제안

업데이트 기록:

  • 2026-02-26: 초판 발행

시리즈 네비게이션: