콘텐츠로 이동

13. 문제 해결

에러 메시지로 바로 찾아보세요.


먼저 여기부터

문제가 생기면 워크플로우 상세 → Overview → 실행 이력에서 실패한 실행을 클릭하세요.

  • 어느 노드가 FAILED인지
  • 그 노드가 받은 입력은 무엇이었는지
  • 바로 앞 노드의 출력은 어떤 모양이었는지

이 세 가지만 보면 대부분 원인이 드러납니다.

CANCELLED 노드는 원인이 아닙니다. 다른 노드가 실패해서 정리된 것뿐입니다. FAILED 노드를 보세요.


저장할 때 나는 에러

저장 시점에는 그래프 구조를 검사합니다. 표현식은 검사하지 않습니다.

workflow must have exactly one ENTRYPOINT

시작점이 없거나 둘 이상입니다. type: ENTRYPOINT 노드가 정확히 하나 있어야 합니다.

only JOINT nodes may have multiple inbound edges

한 노드에 선이 두 개 이상 들어갑니다. 그 자리에 JOINT 노드를 놓고 거기로 모으세요.

# ❌ notify로 두 선이 들어감
edges:
  - from: fetch-a
    to: notify
  - from: fetch-b
    to: notify

# ✅ JOINT를 거쳐서
edges:
  - from: fetch-a
    to: join
  - from: fetch-b
    to: join
  - from: join
    to: notify

cycle detected

화살표를 따라가다 제자리로 돌아옵니다. 되돌아가는 엣지를 찾아 지우세요. 반복이 필요한 거라면 LOOP_START / LOOP_END를 쓰세요.

edge references unknown node

엣지의 from 또는 to에 적힌 id가 없습니다. 노드 id 오타를 확인하세요.

duplicate node id

같은 id를 가진 노드가 둘 이상입니다. 노드 id는 워크플로우 안에서 고유해야 합니다.

condition label has no matching edge

CONDITIONALlabel마다 나가는 엣지가 하나씩 있어야 합니다.

execution-info:
  conditions:
    - label: vip        # ← 이 label에
      expression: "amount >= 100000"

edges:
  - from: route
    to: vip-handler
    label: vip          # ← 이 엣지가 짝

LOOP_START has no matching LOOP_END

둘은 반드시 짝입니다. LOOP_ENDexecution-info.loop-start에 짝이 되는 LOOP_STARTid가 정확히 적혀 있는지 확인하세요.

CONDITIONAL is not allowed inside a loop body

루프 안에는 조건 분기를 넣을 수 없습니다. → 대안 보기

workflow has N nodes — the maximum is 200

워크플로우를 나누세요. 한 워크플로우가 다른 워크플로우의 웹훅을 http_request로 호출하는 방식으로 이을 수 있습니다.

저장은 되는데 slug 충돌

id가 워크스페이스 안에서 이미 쓰이고 있습니다. 다른 id로 바꾸거나, 기존 워크플로우를 수정하세요.


실행할 때 나는 에러

ExpressionResolveException

가장 흔한 에러입니다. ${...} 안의 경로가 실제 데이터와 맞지 않습니다.

확인 순서:

  1. 실행 이력에서 바로 앞 노드의 실제 출력을 봅니다.
  2. 표현식 경로가 그 모양과 맞는지 대조합니다.
  3. 노드 id 오타를 확인합니다 (${nodes.fetch-order...} vs 실제 id fetch-orders).

자주 틀리는 것들:

잘못된 표현식 문제
${nodes.join.response.body.x} JOINT는 출력이 없습니다. 앞 노드를 직접 참조하세요
${nodes.trigger.response.body.windowStart} 스케줄 트리거에 lookback을 설정해야 생깁니다
${secrets.MY_KEY} 그 이름의 시크릿이 없거나, 일반 변수로 등록했습니다
${vars.MY_KEY} 반대로 시크릿으로 등록해두고 vars로 부르고 있습니다
${item.id} 루프 밖에서는 쓸 수 없습니다
${input.amount} 들어오는 엣지에 request.data 매핑이 없습니다

값이 {a=1, b=2} 같은 이상한 문자열로 넘어감

| raw 를 빠뜨렸습니다. 배열이나 객체를 넘길 때는 붙여야 합니다.

data: "${nodes.fetch.response.body.items}"          # ❌
data: "${nodes.fetch.response.body.items | raw}"    # ✅

자세히

Transform 노드가 실패함

CALL 노드의 출력은 JSON 객체여야 합니다. 배열이나 숫자를 그대로 내보내면 실패합니다.

expression: "items[*].id"            # ❌ 배열
expression: "{ids: items[*].id}"     # ✅ 객체로 감싸기

expression: "length(items)"          # ❌ 숫자
expression: "{count: length(items)}" # ✅

조건 분기가 항상 같은 쪽으로만 감

조건이 볼 값이 안 넘어오고 있습니다. 들어오는 엣지에 request.data 를 추가하세요.

edges:
  - from: fetch
    to: route
    request:
      data:
        amount: "${nodes.fetch.response.body.totalAmount}"

그리고 조건식에서는 ${} 없이 이름만 씁니다: amount >= 100000

Slack: not_in_channel

채널에 봇을 초대하지 않았습니다. 해당 채널에서:

/invite @이음새

Slack: channel_not_found

채널 ID가 틀렸거나 비공개 채널입니다. 채널 ID는 Slack에서 채널 우클릭 → 채널 세부정보 → 맨 아래에서 확인합니다. 비공개 채널이면 봇을 먼저 초대해야 보입니다.

Slack: invalid_auth

연결이 만료·해지되었습니다. Connections 화면에서 재연결하세요.

LLM: 400 Bad Request

흔한 원인 두 가지입니다.

  • temperature — 최신 Claude 모델 등 일부는 이 값을 받지 않습니다. 빼보세요.
  • model 오타 — 엔드포인트가 아는 모델 id인지 확인하세요.

LLM: 401 Unauthorized

API 키가 틀렸거나 만료되었습니다. ${secrets.*}에 등록한 값을 확인하세요. apiContract와 키가 맞는지도 보세요 — OpenAI 키로 ANTHROPIC_MESSAGES를 부르면 실패합니다.

타임아웃으로 실패함

timeout 값을 늘리거나, 조회 범위를 줄이세요. AI 호출은 30s ~ 2m, 무거운 조회 API는 30s ~ 1m 정도가 무난합니다.

워크플로우를 수정할 수 없음 (MCP)

실행 중인 게 있습니다. 끝나기를 기다리거나 취소한 뒤 다시 시도하세요.


자주 묻는 질문

스케줄이 원하는 시각에 안 돌아요

timezone을 확인하세요. 안 적으면 UTC입니다. cron: "0 0 9 * * ?" 만 적으면 한국 시간 오후 6시에 돕니다.

trigger:
  kind: SCHEDULER
  cron: "0 0 9 * * ?"
  timezone: "Asia/Seoul"     # ← 필수

cron이 6자리인 것도 확인하세요. 맨 앞이 초입니다. → 자세히

웹훅을 불렀는데 200이 왔는데 아무 일도 안 일어나요

200은 "잘 접수했다"는 뜻이고, 워크플로우는 뒤에서 비동기로 돕니다. 실제 결과는 실행 이력에서 확인하세요. 십중팔구 거기에 FAILED가 남아 있습니다.

웹훅으로 보낸 필드가 다음 노드에 안 넘어와요

트리거의 input-schema화이트리스트입니다. properties에 적지 않은 필드는 조용히 버려집니다. 쓰려는 필드를 전부 properties에 추가하세요.

실행이 실패했는데 아무도 몰랐어요

Notifications 화면에서 실패 알림 웹훅을 설정하세요. → 10. 실행과 모니터링

워크플로우를 고치는 중인데 저장이 안 돼요

그래프 구조가 아직 안 맞을 수 있습니다. 에러 메시지가 무엇이 문제인지 알려줍니다. 표현식은 저장 시점에 검사하지 않으므로, 표현식 때문에 저장이 막히지는 않습니다.

AI가 만든 워크플로우가 실행하면 실패해요

validate_workflow그래프 구조만 검사합니다. ${...} 경로 오류는 실행해봐야 드러납니다. AI에게 "실행해보고 실패하면 고쳐줘"까지 시키면 알아서 반복합니다.

워크스페이스를 옮기면 설정도 따라가나요

아니요. 연결·변수·데이터셋은 워크스페이스마다 따로입니다. 새 워크스페이스에서는 다시 등록해야 합니다.

요금은 어떻게 되나요

베타 기간의 이용 조건은 app.eeumsae.com과 서비스 약관을 확인하세요. AI 호출 비용은 별도입니다 — 이음새는 여러분의 API 키로 대신 호출할 뿐이고, 요금은 OpenAI·Anthropic 등에 직접 청구됩니다.

실행 중인 워크플로우를 수정하면 어떻게 되나요

실행이 시작될 때 그 시점의 모양이 저장되므로, 이미 도는 실행은 영향받지 않습니다. 수정 내용은 다음 실행부터 적용됩니다.


그래도 안 되면

contact@eeumsae.com으로 문의하세요. 아래를 함께 보내주시면 훨씬 빠릅니다.

  • 워크플로우 이름 또는 slug
  • 실패한 실행 시각
  • 실행 이력에 나온 에러 메시지 원문
  • (가능하면) 워크플로우 YAML — API 키와 토큰은 지우고 보내주세요

돌아가기목차