AWS Lightsail에 OpenClaw 멀티 에이전트 구축하기 — 삽질 기록 포함

"☕" 6 "min read"

OpenClaw는 내 서버에서 돌아가는 오픈소스 AI 어시스턴트입니다. 이 글에서는 AWS Lightsail에 설치하고 Discord Bot 3개를 사용자별로 분리된 멀티 에이전트로 연결한 전 과정을 다룹니다.


배경 — 왜 OpenClaw를 직접 서버에 올렸나

가족이나 팀원들에게도 AI 어시스턴트 환경을 만들어주고 싶었습니다. 그런데 상용 서비스는 사람마다 구독이 필요하고, 데이터가 외부 서버로 나간다는 점이 걸렸습니다.

OpenClaw는 이 문제를 깔끔하게 해결해줍니다. 내 서버에서 돌아가기 때문에 데이터가 내 인프라를 벗어나지 않고, Discord 같은 익숙한 앱으로 여러 사람이 각자의 AI 비서를 사용할 수 있습니다.

AWS Lightsail에 아예 OpenClaw 전용 블루프린트가 있다는 걸 알게 됐고, 그걸 쓰기로 했습니다.


환경 정보

항목내용
서버AWS Lightsail (서울, ap-northeast-2a)
스펙4GB RAM / 2 vCPUs / 80GB SSD
OpenClaw2026.3.2
AI 모델Anthropic Claude Sonnet 4.6 (기본) + Gemini 1.5 Flash (fallback)
채팅 채널Discord
봇 구성3개 (odungclaw / clawbot2 / clawbot3)

설치 — Lightsail 블루프린트 방식

일반적인 npm i -g openclaw 설치와 달리, Lightsail 블루프린트를 사용하면 서버 프로비저닝과 OpenClaw 초기 설정이 함께 됩니다.

Lightsail 콘솔에서 인스턴스 생성 시 앱+OS 탭에서 OpenClaw를 선택하면 됩니다.

설치 후 기본 세팅 완료 상태:

config 위치: ~/.openclaw/openclaw.json
환경변수 위치: /opt/aws/open_claw/openclaw.env
Gateway 포트: 18789 (loopback)
Dashboard: https://[서버IP]/overviewCode language: JavaScript (javascript)

삽질 기록 1 — openclaw update 권한 에러

설정을 시작하기 전에 업데이트부터 하려 했습니다.

openclaw update
Updating OpenClaw...
│
◇  ✗ Updating via package manager (20.08s)
    npm error   dest: '/usr/lib/node_modules/.openclaw-gX1GdeX9'
    npm error The operation was rejected by your operating system.
    npm error It is likely you do not have the permissions to access this file
    as the current userCode language: JavaScript (javascript)

원인: Lightsail 블루프린트로 설치된 OpenClaw는 /usr/lib/node_modules/에 global npm 패키지로 설치되어 있는데, ubuntu 유저는 해당 디렉토리에 쓰기 권한이 없습니다.

해결:

# sudo로 업데이트 실행
sudo openclaw update

# 완료 후 gateway 재시작
openclaw gateway restart

# 버전 확인
openclaw --versionCode language: PHP (php)

Lightsail 블루프린트 환경에서 openclaw update는 반드시 sudo로 실행해야 합니다.


멀티 에이전트 구성

Discord Bot 3개 준비

사용자별로 완전히 분리된 Bot이 필요합니다. Discord Developer Portal에서 아래를 3회 반복합니다.

1. "New Application" → 이름 입력 (Claw-Odung, Claw-Bot2, Claw-Bot3)
2. 좌측 "Bot"3. Message Content Intent → ON
4. Server Members Intent → ON
5. "Reset Token" → 토큰 복사 후 안전하게 보관Code language: JavaScript (javascript)

openclaw.json 구조

~/.openclaw/openclaw.json에서 agents, channels, bindings를 설정합니다.

{
  "agents": {
    "defaults": {
      "contextTokens": 50000
    },
    "list": [
      {
        "id": "odungclaw",
        "name": "OdungClaw",
        "default": true,
        "workspace": "~/.openclaw/workspaces/odungclaw",
        "agentDir": "~/.openclaw/agents/odungclaw",
        "model": "anthropic/claude-sonnet-4-6"
      },
      {
        "id": "clawbot2",
        "name": "OpenClaw Bot",
        "workspace": "~/.openclaw/workspaces/openclawbot",
        "agentDir": "~/.openclaw/agents/openclawbot",
        "model": "anthropic/claude-sonnet-4-6"
      },
      {
        "id": "clawbot3",
        "name": "OpenClaw Bot-2",
        "workspace": "~/.openclaw/workspaces/openclawbot2",
        "agentDir": "~/.openclaw/agents/openclawbot2",
        "model": "anthropic/claude-sonnet-4-6"
      }
    ]
  },
  "channels": {
    "discord": {
      "accounts": {
        "bot-odungclaw": { "token": "ODUNGCLAW_BOT_TOKEN" },
        "bot-clawbot2":  { "token": "CLAWBOT2_BOT_TOKEN" },
        "bot-clawbot3":  { "token": "CLAWBOT3_BOT_TOKEN" }
      }
    }
  },
  "bindings": [
    { "channel": "discord", "accountId": "bot-odungclaw", "agentId": "odungclaw" },
    { "channel": "discord", "accountId": "bot-clawbot2",  "agentId": "clawbot2" },
    { "channel": "discord", "accountId": "bot-clawbot3",  "agentId": "clawbot3" }
  ],
  "session": {
    "dmScope": "per-peer"
  }
}Code language: JSON / JSON with Comments (json)

핵심 포인트:

  • agentDir는 에이전트 간 절대 공유 금지 — auth/session 충돌이 발생합니다
  • contextTokens: 50000으로 세션이 커져도 비용이 지수적으로 증가하는 걸 막습니다
  • dmScope: "per-peer"로 DM을 사용자별로 격리합니다

삽질 기록 2 — Discord 채널에서 봇이 응답하지 않음

Bot을 서버에 초대했는데 채널에서 메시지를 보내도 응답이 없었습니다.

원인: openclaw.jsonchannels.discord.accounts에 Bot 토큰만 있고, 어느 서버/채널에서 응답할지 Guild ID와 Channel ID가 설정되지 않은 상태였습니다.

해결 — Discord 채널 ID 수집:

Discord에서 개발자 모드를 먼저 활성화합니다.

Discord → 설정(톱니바퀴) → 고급 → 개발자 모드 ON
→ 서버 이름 우클릭 → "ID 복사" → Guild ID
→ 채널 이름 우클릭 → "ID 복사" → Channel IDCode language: JavaScript (javascript)

이후 openclaw.json의 각 account에 allowlist를 추가합니다.

"channels": {
  "discord": {
    "accounts": {
      "bot-odungclaw": {
        "token": "ODUNGCLAW_BOT_TOKEN",
        "allowlist": {
          "guilds": ["서버_GUILD_ID"],
          "channels": ["허용할_CHANNEL_ID"]
        }
      }
    }
  }
}Code language: JavaScript (javascript)

Workspace 파일 구조

에이전트 설정이 완료된 후 workspace 상태를 확인했습니다.

ls -la ~/.openclaw/workspaces/odungclaw/Code language: JavaScript (javascript)
-rw-rw-r-- 1 ubuntu ubuntu 7869 AGENTS.md
-rw-rw-r-- 1 ubuntu ubuntu 1470 BOOTSTRAP.md
-rw-rw-r-- 1 ubuntu ubuntu  168 HEARTBEAT.md
-rw-rw-r-- 1 ubuntu ubuntu  636 IDENTITY.md
-rw-rw-r-- 1 ubuntu ubuntu 1673 SOUL.md
-rw-rw-r-- 1 ubuntu ubuntu  860 TOOLS.md
-rw-rw-r-- 1 ubuntu ubuntu  477 USER.mdCode language: CSS (css)

각 파일의 역할입니다.

파일역할
SOUL.mdAI 페르소나, 말투, 가치관 정의 — 필수
AGENTS.md부팅 순서, 운영 규칙, 체크리스트 — 필수
IDENTITY.md봇 이름, 이모지, 아바타
USER.md사용자 프로필 (main 세션에서만 로드)
HEARTBEAT.md주기적 자동 작업 체크리스트
BOOTSTRAP.md초기 부팅 시 실행할 설정
TOOLS.md허용/제한 도구 목록

SOUL.md 작성 예시

# Soul

## Identity
나는 오둥클로야. 팀의 AI 비서로, 실용적이고 친근하게 도와주는 게 목표야.

## Personality
- 한국어로 먼저 대화하고, 상대가 영어로 쓰면 영어로 답함
- 간결하고 실용적인 답변을 선호함
- 모르면 솔직하게 모른다고 말함

## Values
- 개인 정보는 항상 보호함
- 확실하지 않은 정보는 추측으로 제공하지 않음

## Tone
친근하지만 전문적. 이모지는 필요할 때만 사용.Code language: PHP (php)

최종 상태 확인

openclaw agents list --bindingsCode language: PHP (php)
Agents:
- odungclaw (default) (OdungClaw)
  Workspace: ~/.openclaw/workspaces/odungclaw
  Model: anthropic/claude-sonnet-4-6
  Routing: discord accountId=bot-odungclaw

- clawbot2 (OpenClaw Bot)
  Workspace: ~/.openclaw/workspaces/openclawbot
  Model: anthropic/claude-sonnet-4-6
  Routing: discord accountId=bot-clawbot2

- clawbot3 (OpenClaw Bot-2)
  Workspace: ~/.openclaw/workspaces/openclawbot2
  Model: anthropic/claude-sonnet-4-6
  Routing: discord accountId=bot-clawbot3Code language: JavaScript (javascript)

3개 에이전트가 각자 독립된 workspace와 Discord 봇에 바인딩된 상태입니다.


추가로 알아두면 좋은 점

비용 제어

Anthropic API 비용이 지수적으로 늘어나는 걸 막는 두 가지 설정입니다.

// contextTokens: 세션당 컨텍스트 창 상한선
"agents": {
  "defaults": {
    "contextTokens": 50000
  }
}Code language: JavaScript (javascript)

Anthropic 콘솔에서 월 예산 상한(Hard Limit)을 설정해두는 것도 권장합니다.

Claude Max 구독 연동 주의

Anthropic OAuth 토큰(Claude Max 구독)을 OpenClaw에 사용하는 방법은 2026년 1월부터 차단되었습니다. 현재는 API Key 방식만 지원됩니다. Anthropic 콘솔에서 API 키를 발급받아 사용해야 합니다.

권장 Discord 서버 구조

사용자별로 채널을 분리해서 각 봇이 전용 채널에서만 응답하게 구성하는 것이 관리하기 편합니다.

Discord 서버
├── #odungclaw-generalodungclaw 봇 전용
├── #clawbot2-taskclawbot2 봇 전용
└── #clawbot3-researchclawbot3 봇 전용Code language: CSS (css)

상태 모니터링 명령어

openclaw gateway status          # Gateway 상태
openclaw models status           # 모델 상태
openclaw channels status --probe # 채널 연결 실시간 확인
openclaw gateway logs --tail 50  # 최근 로그Code language: PHP (php)

마무리

이 글의 핵심을 세 줄로 요약합니다.

  1. Lightsail 블루프린트로 설치한 환경에서 openclaw update는 반드시 sudo로 실행해야 합니다.
  2. Discord 봇이 채널에서 응답하지 않는다면 Guild ID와 Channel ID가 config에 없는 것이 원인인 경우가 많습니다.
  3. agentDir은 절대 공유하지 말 것 — 에이전트 간 auth/session 충돌이 발생합니다.

다음 글에서는 SOUL.md와 AGENTS.md를 어떻게 작성하면 봇의 페르소나와 동작이 달라지는지, 실제 비교 사례를 다룰 예정입니다.

참고 링크

Y

yshyuk

Java 백엔드 개발자 | Spring, AWS, DevOps
2020년부터 Java/Spring boot 서버 개발자로 일하면서, 인프라(AWS/NCP), DevOps 업무를 병행하였고, 현재는 OpenSource 기여에도 관심을 가지고 있습니다.

조회수: 1