시작하기#
기본 개념#
협업 도구의 요청을 기준으로 필요한 파일 전송 Flow를 실행하고 결과를 확인하기
파일 전송 작업은 항상 전송 관리 화면에서 직접 시작할 필요는 없습니다. 반복적으로 사용하는 전송 작업이라면 업무 중 사용하는 협업 도구에서 요청을 보내고, 해당 요청을 기준으로 미리 구성된 Flow를 실행하도록 연결할 수 있습니다.
예를 들어 Slack이나 Teams에서 특정 파일 전송을 요청하면 연결된 Flow가 실행되고, 설정된 Source와 Target, 전송 조건에 따라 파일 전송이 시작되도록 구성할 수 있습니다.
하지만 전송이 필요할 때마다 사용자가 전송 환경에 접속해 Source와 Target을 선택하고 파일 전송 조건을 다시 설정해야 하는 경우, 동일한 작업을 반복적으로 구성해야 할 수 있습니다.
INNORIX Flow를 활용하면 Slack 또는 Teams와 파일 전송 Flow를 연결해 협업 도구에서 발생한 요청을 전송 작업의 시작 조건으로 사용할 수 있습니다.
즉, 협업 도구에서 전송 요청을 확인한 뒤 별도로 파일 전송 작업을 실행하는 대신, Slack·Teams 요청 → Flow 실행 → 파일 전송 → 진행 및 완료 결과 확인과 같이 사용하는 협업 환경에서 전송 작업을 시작하고 결과를 이어서 확인할 수 있습니다.
User
│
│ Transfer Request
▼
Slack / Teams
│
│ Trigger Flow
▼
┌─────────────────┐
│ Transfer Flow │
└────────┬────────┘
│
▼
File Transfer
│
┌────┴─────┐
▼ ▼
Source Target
│
▼
Transfer Result
│
▼
Slack / Teams
이 방식에서는 사용자가 전송이 필요할 때마다 전체 전송 환경을 직접 구성하는 대신, 미리 설정된 Flow를 협업 도구에서 실행할 수 있습니다.
또한 전송이 완료되거나 추가 확인이 필요한 경우 해당 결과를 Slack이나 Teams로 확인하도록 연결하면, 전송을 시작하는 과정뿐 아니라 실행 결과와 완료 상태를 사용하는 협업 환경에서 함께 확인하는 흐름으로 구성할 수 있습니다.
예를 들어 자주 사용하는 전송 작업을 각각 Flow로 준비한 뒤 Slack이나 Teams에서 필요한 작업을 선택해 실행하고, 전송 완료 또는 실패 결과를 해당 채널이나 대화에서 확인하도록 구성할 수 있습니다.
Slack / Teams
│
▼
Select Transfer
│
▼
Run Flow
│
▼
File Transfer
│
┌────┴─────┐
▼ ▼
Complete Review
│ │
▼ ▼
Result Status
│
▼
Slack / Teams이렇게 구성하면 전송 요청 → Flow 실행 → 파일 전송 → 실행 결과 확인까지의 과정을 별도의 전송 관리 화면과 협업 도구로 나누어 처리하는 대신, 필요한 파일 작업을 사용하는 협업 환경에서 실행하고 그 결과까지 연결해 확인할 수 있습니다.
알림 흐름#
전송 상태를 협업 채널에서 바로 확인하기
Flow가 실행되면 모든 상태를 직접 확인하지 않아도 주요 실행 결과를 협업 도구로 전달할 수 있습니다.
예를 들어 전송이 시작되었을 때 실행 사실을 알리고, 완료되면 전송 결과를 전달하며, 문제가 발생한 경우에는 확인이 필요한 상태를 담당자에게 알릴 수 있습니다.
Flow 실행
│
▼
┌───────────┐
│ Transfer │
└─────┬─────┘
│
┌─────────┼─────────┐
▼ ▼ ▼
Started Running Completed
│ │ │
└─────────┼─────────┘
▼
Slack / Teams
│
▼
담당자 확인알림은 업무에 필요한 수준으로 구성할 수 있습니다.
| 전송 상태 | 협업 도구에서 확인하는 내용 |
|---|---|
| 시작 | 어떤 Flow가 실행되었는지 확인 |
| 진행 | 현재 파일 전송이 진행 중인지 확인 |
| 완료 | 전송 완료와 처리 결과 확인 |
| 실패 | 문제가 발생한 작업과 확인 필요 상태 확인 |
| 재실행 | 다시 실행된 작업의 결과 확인 |
이렇게 하면 파일 전송 시스템과 협업 도구가 분리되어 있어도, 업무 중 사용하는 채널에서 주요 전송 결과를 함께 확인할 수 있습니다.
활용 방식#
전송 요청과 결과 확인을 하나의 업무 대화 흐름으로 연결하기
협업 도구와 연결하면 파일 전송의 시작과 결과가 서로 다른 화면에 분산되지 않습니다.
예를 들어 특정 채널에서 파일 전송을 요청한 뒤 같은 채널에서 결과를 확인하도록 구성할 수 있습니다.
┌─────────────────────────────┐
│ Slack / Teams │
│ │
│ "일일 보고서 전송 실행" │
│ │ │
│ ▼ │
│ Flow Started │
│ │ │
│ ▼ │
│ 24 files transferred │
│ Status: Completed │
└─────────────────────────────┘이를 통해 전송 작업 자체는 파일 전송 환경에서 처리하면서도, 업무 요청과 결과 확인은 기존 협업 흐름 안에서 이어갈 수 있습니다.
IT 엔지니어#
서비스 연결#
Slack·Teams와 파일 전송 환경을 연결하기
먼저 파일 전송 환경과 협업 도구 사이의 연동을 구성합니다.
협업 도구에서 발생한 요청이나 이벤트를 파일 전송 Flow의 실행 조건으로 연결하고, Flow의 실행 결과를 다시 협업 도구로 전달하도록 설정합니다.
Slack / Teams
│
│ Request / Event
▼
┌───────────────┐
│ Integration │
└───────┬───────┘
▼
┌───────────────┐
│ Transfer Flow │
└───────┬───────┘
│
│ Status / Result
▼
Slack / Teams
이 구조에서는 요청을 받는 흐름과 결과를 알리는 흐름을 분리해 구성할 수 있습니다.
협업 도구 요청 → 파일 전송 Flow 실행
파일 전송 완료 → 완료 메시지 전송
파일 전송 실패 → 확인 필요 알림 전송
특정 조건 충족 → 담당 채널에 상태 공유
실행 연결#
협업 도구의 요청을 특정 Flow와 연결하기
연동 후에는 어떤 요청이 어떤 파일 전송 작업을 실행할지 구성합니다.
모든 사용자가 임의의 전송 작업을 실행하도록 하기보다, 업무 목적에 맞는 요청과 Flow를 연결할 수 있습니다.
요청 유형
│
├── Report Transfer ────→ Daily Report Flow
│
├── Backup Archive ────→ Backup Flow
│
└── File Distribution ─→ Distribution Flow
이렇게 구성하면 협업 도구는 전송 환경 자체를 관리하는 화면이 아니라, 정해진 Flow를 실행하는 업무 진입점으로 사용할 수 있습니다.
필요에 따라 실행 가능한 Flow와 사용 범위를 구분할 수도 있습니다.
| 설정 항목 | 구성 내용 |
|---|---|
| 요청 기준 | 메시지, 버튼 또는 외부 이벤트 |
| 실행 Flow | 요청에 연결할 파일 전송 작업 |
| 실행 대상 | 요청에 따라 적용할 Source와 Target |
| 사용자 범위 | 작업 실행이 가능한 사용자 또는 채널 |
| 결과 위치 | 실행 결과를 전달할 채널 또는 담당자 |
알림 구성#
전송 결과에 따라 필요한 상태만 협업 도구로 전달하기
모든 파일 전송 이벤트를 메시지로 전달하면 알림이 많아져 실제로 중요한 정보를 확인하기 어려울 수 있습니다.
따라서 운영 목적에 따라 어떤 상태를 알림으로 전달할지 구분하는 것이 좋습니다.
Transfer Run
│
├── Started ───────→ 선택적 알림
│
├── Progress ──────→ 필요 시 상태 공유
│
├── Completed ─────→ 완료 알림
│
└── Failed ────────→ 즉시 확인 알림예를 들어 다음과 같이 구성할 수 있습니다.
| 이벤트 | 알림 대상 | 활용 |
|---|---|---|
| Flow 시작 | 요청 채널 | 작업 시작 확인 |
| 대용량 전송 진행 | 운영 채널 | 장시간 작업 상태 확인 |
| 전송 완료 | 담당자 또는 업무 채널 | 다음 업무 시작 |
| 전송 실패 | 운영 담당자 | 원인 확인 및 대응 |
| 재실행 완료 | 요청자 | 정상 처리 결과 확인 |
이렇게 하면 협업 채널에는 실제 업무와 운영에 필요한 결과만 전달할 수 있습니다.
실행 추적#
협업 알림과 Run 정보를 연결해 실제 처리 결과 확인하기
Slack이나 Teams에서 완료 또는 실패 메시지를 받더라도, 상세한 처리 정보는 Runs에서 확인할 수 있습니다.
특정 실행 결과를 선택하면 해당 작업의 Source, Target, 파일 수, 전송량과 파일별 처리 상태를 확인할 수 있습니다.
Slack / Teams Notification
│
│ Run Result
▼
┌────────────────────┐
│ Runs │
│ │
│ Flow │
│ Source │
│ Target │
│ Files │
│ Progress │
│ Status │
└────────────────────┘
협업 도구에서는 빠른 상태 확인, Runs에서는 실제 파일 전송 결과와 상세 실행 기록 확인이라는 방식으로 역할을 나눌 수 있습니다.
| 확인 위치 | 주요 목적 |
|---|---|
| Slack·Teams | 실행 요청과 주요 결과 확인 |
| 알림 메시지 | 완료·실패 상태 빠르게 확인 |
| Runs | 전체 실행 기록과 상세 상태 확인 |
| Run Details | 파일별 처리 결과와 문제 발생 위치 확인 |
예외 대응#
실패 알림을 받은 후 해당 Run을 확인하고 필요한 작업 다시 실행하기
전송 실패나 추가 확인이 필요한 상태가 발생하면 협업 도구의 알림을 시작점으로 해당 작업을 확인할 수 있습니다.
이후 Runs에서 실패한 단계와 Source·Target 상태를 확인하고 필요한 조치를 진행합니다.
Failure Alert
│
▼
Run 확인
│
▼
문제 발생 위치 확인
│
┌────┼─────┐
▼ ▼ ▼
Source Target 권한
│
▼
환경 조정
│
▼
Retry
│
▼
새 Run 결과
│
▼
Completed Notification
이 가이드를 적용하면 Slack·Teams에서 파일 전송 요청 → 지정된 Flow 실행 → 진행 및 결과 알림 수신 → 필요 시 Run 상세 확인 → 문제 발생 시 재실행 → 최종 결과 알림까지 하나의 업무 흐름으로 연결할 수 있습니다.
업무팀은 별도의 전송 관리 환경에 직접 접근하지 않고 협업 도구에서 필요한 작업을 실행하고 결과를 확인할 수 있으며, IT 엔지니어는 Flow와 외부 서비스 연동, 알림 조건과 실행 기록을 구성해 파일 전송 작업을 기존 협업 환경 안으로 자연스럽게 연결할 수 있습니다.
개발자#
Slack·Teams에 전송 결과를 통지하고, 채팅 명령으로 전송을 실행하기
알림 연동을 한 번 등록하면 이벤트가 채널로 자동 통지되고, 채팅 명령 핸들러에서 전송 API를 호출해 전송을 시작합니다. 시작 전에 다음 항목을 준비합니다.
| 준비물 | 내용 |
|---|---|
| INNORIX 인증 | INNORIX_ACCESS_TOKEN (Authorization: Bearer) |
| 채널 Webhook URL | Slack·Teams의 수신 Webhook URL |
| 전송 Source·Target | 명령으로 실행할 전송의 소스·대상 장비와 경로 |
| 런타임 | Python 3 + requests · Java 17+ · Node.js 18+ · .NET 8+ |
Python·Node.js는 REST를 직접 호출하는 최소
api()헬퍼를 정의해 씁니다(API 호출 레시피 참고). Java·C#은 번들 소스의InnorixClient와Json(C#은J) 헬퍼를 사용합니다. 장비 식별자와 경로·URL은 실제 값으로 바꿔 넣습니다.
전송 이벤트 알림 연동#
알림 연동을 등록하면 notificationConfig.events에서 켠 이벤트가 워크스페이스의 모든 전송·자동화에 대해 채널로 자동 통지됩니다. 전송마다 연동을 연결하지 않으며, /api/transfers/manual에 integrationId를 넘기지 않습니다.
def create_notification(name, webhook_url, channel, kind="slack",
events=("started", "completed", "error")):
result = api("POST", "/api/integrations", {
"name": name,
"type": kind, # channel type such as slack or teams
"mode": "webhook",
"webhookUrl": webhook_url,
"config": {"name": name, "webhookUrl": webhook_url, "channel": channel},
# enabled events are notified automatically for every transfer in the workspace
"notificationConfig": {"events": {e: True for e in events}},
}) or {}
return result.get("integrationId")
integration_id = create_notification(
"transfer-alerts", "https://hooks.slack.com/services/...", "#file-ops")static String createNotification(InnorixClient client, String name, String webhookUrl,
String channel, String kind, List<String> events) {
Map<String, Object> eventMap = Json.newObj();
for (String e : events) eventMap.put(e, true); // enabled events are notified automatically across the workspace
Map<String, Object> result = client.apiObj("POST", "/api/integrations", Json.newObj(
"name", name,
"type", kind, // channel type such as slack or teams
"mode", "webhook",
"webhookUrl", webhookUrl,
"config", Json.newObj("name", name, "webhookUrl", webhookUrl, "channel", channel),
"notificationConfig", Json.newObj("events", eventMap)), null);
return Json.str(result, "integrationId");
}async function createNotification(name, webhookUrl, channel,
kind = "slack", events = ["started", "completed", "error"]) {
const eventMap = {};
for (const e of events) eventMap[e] = true; // enabled events are notified automatically across the workspace
const result = (await api("POST", "/api/integrations", {
name,
type: kind, // channel type such as slack or teams
mode: "webhook",
webhookUrl,
config: { name, webhookUrl, channel },
notificationConfig: { events: eventMap },
})) || {};
return result.integrationId;
}
const integrationId = await createNotification(
"transfer-alerts", "https://hooks.slack.com/services/...", "#file-ops");static async Task<string> CreateNotificationAsync(InnorixClient client, string name, string webhookUrl,
string channel, string kind = "slack", IEnumerable<string> events = null)
{
var eventMap = new JsonObject();
foreach (var e in events ?? new[] { "started", "completed", "error" })
eventMap[e] = true; // enabled events are notified automatically across the workspace
var result = await client.ApiObjAsync("POST", "/api/integrations", new JsonObject
{
["name"] = name,
["type"] = kind, // channel type such as slack or teams
["mode"] = "webhook",
["webhookUrl"] = webhookUrl,
["config"] = new JsonObject { ["name"] = name, ["webhookUrl"] = webhookUrl, ["channel"] = channel },
["notificationConfig"] = new JsonObject { ["events"] = eventMap },
});
return J.Str(result, "integrationId");
}notificationConfig.events에서 켠 이벤트만 통지됩니다. 유효 이벤트는 다음과 같습니다.
| 이벤트 | 의미 |
|---|---|
started |
전송 시작 |
completed |
전송 완료 |
paused |
일시정지 |
resumed |
재개 |
recovered |
복구 |
canceled |
취소 |
error |
실패 |
skipped |
건너뜀 |
워크스페이스 단위 통지 알림 연동은 등록된 워크스페이스의 모든 전송·자동화에 대해 자동으로 발화합니다. 특정 전송에만 연결하는 방식이 아니므로
/api/transfers/manual에integrationId를 넘기지 않습니다(넘겨도 무시됩니다). 생성된integrationId는 연동을 조회·수정·삭제할 때 사용합니다.
채널 유형과 설정
type은slack·teams등 채널 유형입니다. 유형별로 필요한webhookUrl·channel등의 설정은GET /api/integrations/rules/{type}에서 확인합니다. 필수 설정이 누락된 연동은 생성되더라도 알림이 전송되지 않을 수 있습니다.
Webhook URL 보안 Slack·Teams의 Webhook URL은 인증 정보처럼 취급합니다. 코드에 직접 넣지 말고 환경 변수나 시크릿 저장소에서 불러옵니다.
채팅 명령으로 전송 실행#
채팅 도구의 슬래시 명령이나 봇이 애플리케이션 엔드포인트를 호출하면, 그 핸들러에서 전송 API를 호출해 전송을 시작합니다. 반환된 monitorId로 이후 상태를 확인하고, 시작·완료·실패는 위 알림 연동이 채널로 통지합니다. 채팅 도구에서 요청을 수신하는 방식은 Slack·Teams 앱 구성에 따라 다르므로, 아래 예제에서는 명령을 받은 이후 INNORIX 전송을 시작하는 부분만 다룹니다.
def start_transfer_from_command(source, target, source_paths, target_path,
action="numbering"):
transfer = api("POST", "/api/transfers/manual", {
"sourceDevice": source,
"targetDevice": target,
"targetPath": target_path,
"sourcePaths": source_paths,
"sendAllFolder": True,
"transferOptions": {"target-action": action},
})
return transfer["monitorId"]
# call from the slash-command handler
monitor_id = start_transfer_from_command(
"device-source-01", "device-target-01",
["/data/out"], "/work/incoming")static String startTransferFromCommand(InnorixClient client, String source, String target,
List<String> sourcePaths, String targetPath, String action) {
Map<String, Object> transfer = client.apiObj("POST", "/api/transfers/manual", Json.newObj(
"sourceDevice", source,
"targetDevice", target,
"targetPath", targetPath,
"sourcePaths", sourcePaths,
"sendAllFolder", true,
"transferOptions", Json.newObj("target-action", action)), null);
return Json.str(transfer, "monitorId");
}async function startTransferFromCommand(source, target, sourcePaths, targetPath,
action = "numbering") {
const transfer = await api("POST", "/api/transfers/manual", {
sourceDevice: source,
targetDevice: target,
targetPath,
sourcePaths,
sendAllFolder: true,
transferOptions: { "target-action": action },
});
return transfer.monitorId;
}
// call from the slash-command handler
const monitorId = await startTransferFromCommand(
"device-source-01", "device-target-01",
["/data/out"], "/work/incoming");static async Task<string> StartTransferFromCommandAsync(InnorixClient client, string source, string target,
IEnumerable<string> sourcePaths, string targetPath, string action = "numbering")
{
var transfer = await client.ApiObjAsync("POST", "/api/transfers/manual", new JsonObject
{
["sourceDevice"] = source,
["targetDevice"] = target,
["targetPath"] = targetPath,
["sourcePaths"] = J.ArrOfStrings(sourcePaths),
["sendAllFolder"] = true,
["transferOptions"] = new JsonObject { ["target-action"] = action },
});
return J.Str(transfer, "monitorId");
}전송 생성 자체는 API 호출 레시피의 전송 생성과 같습니다. 채팅 명령의 인자를 소스·대상·경로에 매핑해 호출하면 됩니다.
다른 방법: 명령형 자동화 애플리케이션에서
/api/transfers/manual을 호출하는 대신, INNORIX에 명령형 자동화(transferType: "command")를 등록해 두고 채팅 도구가 이를 트리거하는 방식도 있습니다. 이때 명령형 자동화에apiKey를 설정하고, 트리거 호출은x-api-key헤더로 인증합니다.
구현 결과#
이 레시피를 적용하면 다음 흐름으로 협업 도구에서 전송을 실행하고 결과를 받을 수 있습니다.
알림 연동 등록 (1회)
↓
채팅 명령 → 전송 시작 (monitorId)
↓
전송 이벤트 발생 (started · completed · error)
↓
Slack·Teams 채널로 자동 통지전송 실행과 결과 확인을 협업 도구 안에서 처리하면, 담당자가 관리 화면을 오가지 않고도 익숙한 채널에서 전송을 시작하고 시작·완료·실패를 확인할 수 있습니다.