INNORIX
전송 빌더전송 파인더개발자리소스고객사
무료 시작하기
INNORIX

LET FILES
MOVE THEMSELVES

INNORIX는 모든 시스템과 환경에서 파일 이동과 자동화를 제공하는 엔터프라이즈 파일 인프라 기업입니다.
5,000개 이상의 기업 및 공공기관에서 사용하고 있습니다.

시작하기

  • 필요한 전송 만들기
  • 필요한 전송 찾기

주요 전송

  • 팀 업무 폴더 동기화
  • 고객에게 대용량 파일 전송
  • 여러 시스템 파일 탐색
  • FTP·SFTP·SCP·rsync 전환
  • 앱에 파일 전송 추가
  • 웹 업로드·다운로드 적용
  • AI·데이터 워크플로 구축
  • 모든 전송 둘러보기→

개발자

  • 개발자 센터
  • 구현 예제
  • API 빠른 시작
  • 개발자 가이드
  • API 레퍼런스
  • GitHub

리소스

  • 리소스 센터
  • 제품 가이드
  • 외부 서비스 연동
  • 배포 및 관리
  • 도움말 센터

고객사

  • 정부
  • 공공부문
  • 제조
  • 엔지니어링
  • 금융
  • 유통
  • IT/통신
  • 미디어
  • 의료
  • 교육

플랜

  • 가격 및 플랜

회사

INNORIX 소개

Exabyter를 찾고 계신가요?

이제 INNORIX Platform에 통합되었습니다

기타 INNORIX 제품

Al.bert — 스마트 교통 AI

글로벌 오피스

  • 미국 뉴욕
  • 대한민국 서울
  • 베트남 호찌민
  • 오피스 위치 보기→

(C)2026 INNORIX. All rights reserved.

  • 보안
  • 상태
  • 이용약관
  • 개인정보 처리방침
  • 쿠키 정책
  1. 가이드
  2. Amazon S3 파일을 Linux 서버로 자동 내려받기

Amazon S3 파일을 Linux 서버로 자동 내려받기

S3에 업로드된 파일을 감지해 Linux 서버의 작업 폴더로 자동 전달합니다.

IT 엔지니어개발자
  • AI 학습 데이터와 모델 파일의 전체 흐름 자동화하기
  • AI 모델 파일을 여러 엣지 장비에 배포하기
  • 폐쇄망·망분리 환경에서 파일을 승인 반입·반출하기
  • 승인된 파일을 여러 지점에 동시에 배포하기
  • Azure Blob에서 사내 서버로 파일 전달하기
  • 데이터베이스 덤프, 백업, 아카이브 파일을 원격 보관처로 자동 전달하기
  • 지점·공장·엣지 장비의 파일을 중앙으로 수집하기
  • CI/CD 빌드 결과물을 여러 서버에 배포하기
  • 서로 다른 클라우드 스토리지 사이에서 파일 이동하기
  • 서로 다른 AWS 계정의 S3 버킷 사이에 파일 전송하기
  • 고객별 파일 작업 공간 제공하기
  • 고객에게 만료 조건이 있는 대용량 다운로드 링크 제공하기
  • 고객이 브라우저에서 대용량 파일을 업로드하게 하기
  • 고객 작업 공간으로 대용량 파일 직접 보내기
  • 데이터베이스 백업 파일을 오브젝트 스토리지에 보관하기
  • Datadog으로 파일 전송 실패와 복구 알림 받기
  • 웹, 앱, 업무 시스템에 파일 전송 기능 추가하기
  • 파일 도착 후 검증·변환·후속 작업 실행하기
  • NAS, 파일 서버의 대량 파일을 클라우드로 이전하기
  • FTP 배치 작업을 관리형 파일 흐름으로 전환하기
  • Google Cloud Storage에서 Amazon S3로 직접 전송하기
  • Grafana에서 파일 전송 상태 대시보드 만들기
  • 전송된 파일의 해시값으로 무결성 자동 검증하기
  • 새 파일이 생기면 지정한 곳으로 자동 전송하기
  • Kubernetes에서 오브젝트 스토리지로 결과 파일 보내기
  • Git 밖의 대용량 파일과 빌드 결과물 자동 전달하기
  • Git으로 관리하기 어려운 파일을 자동 전달하기
  • 분산 서버의 로그·진단 파일을 중앙으로 모으기
  • 미디어 원본과 처리 결과를 단계별로 자동 전달하기
  • 수신 파일을 Microsoft Defender로 검사하고 후속 처리하기
  • 여러 단계의 파일 전송을 하나의 흐름으로 자동화하기
  • 승인된 파일을 여러 팀·지점에 자동 배포하기
  • 협력사 파일을 업무 시스템으로 자동 분류하기
  • 협력사·공급망과 정기적으로 파일 교환하기
  • 매일·매주 반복되는 파일 전송 자동화하기
  • 네트워크 중단 후 파일 전송을 자동으로 재개하기
  • rsync 작업을 관리형 파일 흐름으로 전환하기
  • 정해진 시간에 반복 파일 전송 예약하기
  • 소프트웨어·펌웨어를 여러 장비에 배포하고 결과 확인하기
  • 소프트웨어 패키지를 여러 서버·지점에 배포하기
  • 팀 폴더의 변경 파일을 여러 장비에 자동 반영하기
  • 팀 업무 폴더를 여러 PC에 자동 반영하기
  • 여러 장비의 파일을 한곳에서 찾고 직접 전송하기
  • 웹사이트에 대용량 파일 업로드·다운로드 기능 추가하기
  • 채널을 구독해 새 파일을 자동으로 받기
  • Amazon S3에서 Azure Blob으로 직접 전송하기
  • Amazon S3에서 Cloudflare R2로 파일 이전하기
  • Amazon S3 파일을 Linux 서버로 자동 내려받기
  • SCP 셸 스크립트를 CLI 기반 전송으로 전환하기
  • SFTP 계정과 배치 전송을 중앙에서 관리하기
  • Slack·Teams에서 파일 전송을 실행하고 상태 알림 받기
  • Windows 폴더의 파일을 Amazon S3로 자동 업로드하기
  • Windows와 Linux 서버 사이에 파일을 직접 전송하기

시작하기#

기본 개념#

Amazon S3에 준비된 파일을 Linux 작업 환경으로 자동 가져오기

클라우드 환경에서는 애플리케이션, 외부 시스템, 데이터 수집 서비스 등 다양한 환경이 Amazon S3에 파일을 저장합니다.

이후 Linux 서버에서 해당 파일을 처리해야 한다면 S3에 새로운 파일이 업로드되었는지 확인하고, 필요한 파일을 서버의 작업 폴더로 내려받는 과정이 필요할 수 있습니다.

Amazon S3 파일 자동 다운로드는 파일이 저장되는 S3와 실제 처리가 진행되는 Linux 서버를 직접 연결하는 방식입니다.

S3의 특정 버킷과 경로를 지정하고 Linux 서버의 작업 폴더를 연결하면, 필요한 파일이 준비된 이후 지정된 조건에 따라 서버 환경으로 자동 전송할 수 있습니다.

예를 들어 다음과 같은 환경을 구성할 수 있습니다.

파일이 생성되는 환경 파일을 처리하는 환경
Amazon S3 Linux Server
s3://company-data/incoming/ /data/incoming/
외부 시스템이 파일 업로드 분석 프로그램이 파일 처리

이렇게 연결하면 S3는 파일이 모이는 위치가 되고, Linux 서버는 필요한 파일을 받아 실제 작업을 수행하는 환경이 됩니다.

즉, 단순히 S3의 파일을 내려받는 것이 아니라 클라우드에 준비된 파일을 Linux 작업 흐름으로 연결할 수 있습니다.

다운로드 흐름#

파일 업로드 여부를 확인하고 필요한 파일만 Linux 서버로 가져오기

자동 다운로드는 S3에 있는 모든 파일을 한 번에 복사하는 방식으로만 구성할 필요가 없습니다.

파일이 저장되는 위치와 파일 유형, 실행 조건에 따라 실제 Linux 서버에서 필요한 파일만 가져오도록 구성할 수 있습니다.

예를 들어 S3의 /incoming/ 경로에 다음 파일이 저장되어 있다고 가정할 수 있습니다.

incoming/
├── sales-20260901.csv
├── sales-20260902.csv
├── image.zip
├── temporary.txt
└── README.md

이 중 Linux 분석 서버에는 CSV 파일만 자동으로 가져오도록 설정할 수 있습니다.

Amazon S3
incoming/
   │
   ├── sales-20260901.csv ────────┐
   ├── sales-20260902.csv ────────┤
   │                              │
   ├── image.zip ───────────── 제외 │
   ├── temporary.txt ────────── 제외 │
   └── README.md ────────────── 제외 │
                                  ▼
                           Linux Server
                           /data/input/

파일이 Linux 서버에 반영된 이후에는 분석 프로그램이나 후속 처리 작업에서 해당 파일을 바로 사용할 수 있습니다.

전체 흐름은 다음과 같이 구성됩니다.

단계 처리 내용
파일 저장 외부 시스템 또는 애플리케이션이 S3에 파일 업로드
대상 확인 지정된 버킷과 경로에서 파일 확인
조건 적용 파일 이름, 확장자, 경로 등의 조건 확인
파일 전송 조건에 맞는 파일을 Linux 서버로 다운로드
작업 폴더 반영 지정된 경로에 파일 저장
결과 처리 Linux 환경의 다음 작업에서 파일 활용

이 흐름을 통해 파일이 S3에 준비되는 시점과 Linux 서버에서 작업을 시작하는 시점을 하나의 파일 흐름으로 연결할 수 있습니다.

활용 변화#

S3 확인과 수동 다운로드 없이 파일 준비 과정 자동화하기

기존에는 Linux 서버에서 사용할 파일이 S3에 업로드되면 담당자나 운영 작업이 다음 과정을 반복할 수 있습니다.

S3 접속
   │
   ▼
새 파일 확인
   │
   ▼
필요한 파일 선택
   │
   ▼
Linux 서버 다운로드
   │
   ▼
작업 폴더 이동
   │
   ▼
처리 시작

자동 다운로드를 구성하면 파일 준비 과정이 다음과 같이 변경됩니다.

S3 파일 업로드
       │
       ▼
   조건 자동 확인
       │
       ▼
Linux 작업 폴더 반영
       │
       ▼
   다음 작업 시작

두 방식의 차이는 다음과 같습니다.

구분 기존 방식 자동 다운로드
새 파일 확인 직접 S3 확인 지정된 조건으로 자동 확인
파일 선택 필요한 파일 직접 선택 규칙에 맞는 파일 자동 선택
다운로드 필요할 때마다 직접 실행 조건에 따라 자동 실행
저장 위치 매번 확인 또는 지정 미리 설정한 Linux 경로 사용
다음 작업 파일 준비 후 직접 시작 파일 반영 이후 자동 연결 가능

예를 들어 매일 생성되는 데이터 파일을 분석 서버로 가져오거나, 외부 시스템의 처리 결과를 Linux 서버에서 다음 작업에 사용해야 하는 환경에 적용할 수 있습니다.

IT 엔지니어#

환경 연결#

S3의 파일 위치와 Linux 서버의 작업 폴더 연결하기

먼저 Source로 사용할 Amazon S3와 Target으로 사용할 Linux 서버를 연결합니다.

S3에서는 파일을 확인할 버킷과 경로를 지정하고, Linux 서버에서는 다운로드한 파일을 저장할 실제 작업 폴더를 설정합니다.

┌─────────────────────────────────────┐
│              SOURCE                 │
│                                     │
│  Amazon S3                          │
│                                     │
│  Bucket : company-data              │
│  Path   : /incoming/daily/          │
└──────────────────┬──────────────────┘
                   │
                   │ File Transfer
                   │
┌──────────────────▼──────────────────┐
│              TARGET                 │
│                                     │
│  Linux Server                       │
│                                     │
│  Host : analytics-server            │
│  Path : /data/input/daily/          │
└─────────────────────────────────────┘

환경을 연결할 때는 다음 범위를 함께 확인합니다.

구분 확인 내용
S3 접근 버킷과 파일 경로에 접근할 수 있는지 확인
Source 경로 실제 파일이 저장되는 위치 확인
Linux 연결 대상 서버의 연결 상태 확인
Target 경로 파일을 저장할 작업 폴더 지정
저장 권한 Linux 서버에 파일을 생성할 수 있는지 확인

이 설정을 통해 어디에서 파일을 가져오고 어디에 저장할지 전송 경로를 명확하게 구성할 수 있습니다.

파일 조건#

Linux 서버에서 실제로 필요한 S3 파일만 선택하기

하나의 S3 버킷에는 여러 시스템의 파일이 함께 저장될 수 있습니다.

따라서 Linux 서버로 모든 파일을 전송하기보다 실제 작업에 필요한 파일만 선택하도록 조건을 설정할 수 있습니다.

예를 들어 데이터 처리 서버에서는 다음 조건을 사용할 수 있습니다.

Source Path
└── /incoming/data/

File Rules
├── Include : *.csv
├── Include : *.json
└── Exclude : temporary/*

이를 실제 파일 흐름에 적용하면 다음과 같습니다.

Amazon S3
│
├── data/
│   ├── customer.csv      ✓ Download
│   ├── order.json        ✓ Download
│   └── test.tmp          ✕ Skip
│
└── temporary/
    └── sample.csv        ✕ Skip

파일 조건은 다음과 같은 기준으로 구성할 수 있습니다.

기준 활용 예시
파일 경로 특정 폴더의 파일만 처리
파일 이름 날짜 또는 업무명 규칙에 맞는 파일 선택
확장자 CSV, JSON, ZIP 등 필요한 유형만 처리
제외 조건 임시 파일이나 테스트 파일 제외
실행 시점 파일 준비 또는 지정된 일정에 따라 실행

이렇게 구성하면 S3를 공용 저장소로 사용하면서도 Linux 서버에는 실제 처리에 필요한 파일만 자동으로 준비할 수 있습니다.

실행 구성#

파일 준비 시점에 맞춰 다운로드 작업 자동 실행하기

파일을 가져올 조건을 설정한 뒤에는 실제 다운로드 작업을 시작할 기준을 구성합니다.

예를 들어 새로운 파일이 준비되었을 때 자동으로 실행하거나, 매일 특정 시간에 S3를 확인하도록 구성할 수 있습니다.

                실행 조건
                    │
        ┌───────────┼───────────┐
        │           │           │
        ▼           ▼           ▼
    파일 확인     일정 실행    이전 작업 완료
        │           │           │
        └───────────┼───────────┘
                    ▼
              Download Flow
                    │
                    ▼
              Linux Server

실행 방식은 업무 환경에 따라 다르게 구성할 수 있습니다.

실행 기준 활용 환경
파일 준비 S3에 새로운 파일이 저장된 후 처리
정기 실행 매일 또는 지정된 시간에 파일 확인
이전 작업 완료 다른 파일 처리 또는 전송 이후 실행
외부 요청 애플리케이션 또는 API 요청으로 실행

예를 들어 외부 시스템이 매일 밤 S3에 데이터를 업로드한다면, 파일이 준비된 이후 Linux 분석 서버로 다운로드하고 다음 분석 작업까지 연결할 수 있습니다.

경로 설계#

여러 S3 파일을 목적에 따라 다른 Linux 작업 환경으로 분리하기

하나의 S3 버킷에서 여러 종류의 파일을 사용하는 경우 파일 목적에 따라 Linux 서버 또는 작업 폴더를 분리할 수 있습니다.

예를 들어 다음과 같이 구성할 수 있습니다.

                    Amazon S3
                         │
        ┌────────────────┼────────────────┐
        │                │                │
        ▼                ▼                ▼
   /raw-data/        /image/          /release/
        │                │                │
        ▼                ▼                ▼
 Linux Data        Linux Media      Linux Deploy
 /data/raw/        /media/input/    /opt/release/

각 파일 유형이 필요한 작업 환경으로 바로 이동하기 때문에, 하나의 Linux 서버에 모든 파일을 모은 뒤 다시 분류하는 과정을 줄일 수 있습니다.

반대로 여러 S3 경로의 파일을 하나의 처리 서버로 모으는 방식도 가능합니다.

S3 System-A ───┐
               │
S3 System-B ───┼────► Linux Processing Server
               │             │
S3 System-C ───┘             ▼
                        /data/input/

이처럼 실제 서버 구조와 업무 목적에 따라 수집형 또는 분산형 다운로드 구조를 구성할 수 있습니다.

결과 확인#

다운로드 작업과 파일별 처리 상태 확인하기

자동 다운로드가 실행되면 Runs에서 전체 작업의 진행 상태와 처리 결과를 확인합니다.

실행 중인 작업에서는 현재 전송량과 진행률을 확인하고, 완료된 작업에서는 실제로 어떤 파일이 Linux 서버에 반영되었는지 확인할 수 있습니다.

Run에서는 다음과 같은 정보를 확인할 수 있습니다.

확인 항목 확인 내용
Source 파일을 가져온 S3 버킷과 경로
Target 파일이 저장되는 Linux 서버와 경로
Files 처리된 파일 목록
Total Size 전체 전송 용량
Progress 현재 다운로드 진행률
Status 실행 및 완료 상태
Started 작업 시작 시간
Completed 작업 완료 시간

예를 들어 하나의 Run에서 다음과 같이 파일별 결과를 확인할 수 있습니다.

Run Details
────────────────────────────────

Source
Amazon S3 /incoming/data/

Target
Linux /data/input/

Files
────────────────────────────────
customer.csv       Completed
order.csv          Completed
product.json       Completed

Status
Completed

이를 통해 전체 작업의 완료 여부뿐 아니라 실제 파일이 Linux 서버의 지정된 위치에 정상적으로 반영되었는지 함께 확인할 수 있습니다.

후속 연결#

파일 다운로드 이후 Linux 서버의 처리 작업까지 이어가기

파일이 Linux 작업 폴더에 저장된 이후에는 해당 파일을 기준으로 다음 작업을 시작할 수 있습니다.

예를 들어 데이터 파일을 다운로드한 뒤 분석 프로그램을 실행하거나, 미디어 파일을 가져온 뒤 변환 작업을 시작하도록 연결할 수 있습니다.

┌───────────────┐
│   Amazon S3   │
└───────┬───────┘
        │
        ▼
┌───────────────┐
│ File Download │
└───────┬───────┘
        │
        ▼
┌───────────────────────┐
│ Linux Working Folder  │
└───────────┬───────────┘
            │
     ┌──────┼──────────────┐
     │      │              │
     ▼      ▼              ▼
  분석 작업  파일 변환      알림

후속 작업은 다음과 같이 활용할 수 있습니다.

연결 방식 활용 예시
서버 처리 파일 반영 후 분석 또는 변환 작업 시작
다음 Flow 다른 장비 또는 스토리지로 파일 전송
알림 다운로드 완료 또는 실패 결과 알림
운영 확인 모니터링 환경에서 실행 상태 확인

이를 통해 S3 → Linux 서버의 단순 파일 이동을 넘어 파일이 실제 업무에 사용되는 다음 단계까지 자동으로 연결할 수 있습니다.

장애 대응#

다운로드가 완료되지 않은 위치를 확인하고 필요한 작업 다시 실행하기

자동 다운로드 과정에서 파일이 정상적으로 반영되지 않은 경우 Runs의 상세 정보를 통해 처리 상태를 확인합니다.

문제가 발생한 위치에 따라 S3 Source, 파일 조건, Linux Target 또는 저장 경로를 확인할 수 있습니다.

장애 확인은 모든 환경을 처음부터 다시 점검하기보다 문제가 발생한 단계부터 확인하는 방식으로 진행할 수 있습니다.

                    ┌─────────────┐
                    │ Run 확인     │
                    └──────┬──────┘
                           │
                           ▼
                    문제 발생 위치
                           │
           ┌───────────────┼───────────────┐
           │               │               │
           ▼               ▼               ▼
       S3 Source       File Rule       Linux Target
           │               │               │
           ▼               ▼               ▼
       접근 확인        조건 확인        경로·권한 확인
           │               │               │
           └───────────────┼───────────────┘
                           ▼
                      설정 조정
                           │
                           ▼
                         Retry
                           │
                           ▼
                      새 Run 확인

확인 항목은 다음과 같이 구분할 수 있습니다.

문제 위치 확인 내용 조치
S3 버킷 접근과 원본 파일 상태 연결 및 접근 설정 확인
파일 조건 경로, 이름, 확장자 조건 다운로드 규칙 조정
Linux 서버 연결 상태 Target 환경 확인
저장 경로 실제 작업 폴더 위치 경로 수정
접근 권한 파일 생성 및 저장 권한 권한 설정 확인
실행 기록 Run과 파일별 처리 결과 문제 단계 확인 후 재실행

환경을 조정한 뒤에는 해당 작업을 다시 실행하고 새로운 Run을 통해 결과를 확인합니다.

이렇게 하면 Amazon S3에 파일이 저장되는 단계부터 Linux 서버의 작업 폴더 반영, 이후의 처리 작업까지 하나의 자동화 흐름으로 구성하고 안정적으로 운영할 수 있습니다.

개발자#

S3의 파일을 Linux 서버로 내려받는 예약 자동화를 코드로 등록하기

정해진 시각에 실행되는 자동화 하나를 만들면, S3의 파일이 Linux로 전송됩니다. 시작 전에 다음 항목을 준비합니다.

준비물 내용
INNORIX 인증 INNORIX_ACCESS_TOKEN (Authorization: Bearer)
S3 장비 소스 device ID와 원본 경로 (예: my-bucket/incoming)
Linux 장비 대상 device ID와 저장 폴더 경로 (예: /work/incoming)
런타임 Python 3 + requests · Java 17+ · Node.js 18+ · .NET 8+

Python·Node.js는 REST를 직접 호출하는 최소 api() 헬퍼를 정의해 씁니다(API 호출 레시피 참고). Java·C#은 번들 소스의 InnorixClient와 Json(C#은 J) 헬퍼를 사용하며, encode_path·now_iso가 여기에 들어 있습니다. 장비 식별자(device-s3·device-linux-01)와 경로는 실제 값으로 바꿔 넣습니다.

예약 자동화 생성#

예약 전송은 transferType: "normal"에 스케줄을 붙여 만듭니다. 스케줄은 schedules[].type: "day"(매일)와 실행 시각(hour·minute·ampm)으로 지정합니다. 경로는 장비 식별자와 인코딩된 경로를 이어 붙인 토큰(encode_path)으로 넣습니다.

def create_scheduled_download(source, source_path, target, target_path,
                              hour="02", minute="00", ampm="am", action="nosend"):
    body = {
        "name": "s3 to linux daily",
        "flowName": "s3 to linux daily",
        "transferType": "normal",
        "isUpcoming": False,
        "timezone": "Asia/Seoul",
        "details": [{
            "senderId": source,
            "receiverId": target,
            "sourceItem": [{
                "hash": encode_path(source, source_path),
                "filePath": str(source_path or "").replace("\\", "/"),
                "isDir": True,
            }],
            "targetPath": encode_path(target, target_path),
            "step": 1,
            "transferOptions": {
                "noSchedule": False,
                "target-action": action,   # nosend = skip files already on the target
                "send-fileoption": {},
            },
        }],
        "schedules": [{
            "type": "day",                 # run daily
            "startDateType": "now",
            "hour": hour, "minute": minute, "ampm": ampm,
            "startDate": now_iso(),
            "timezone": "Asia/Seoul",
        }],
        "step": 1,
    }

    return api("POST", "/api/automations", body)["automationId"]


automation_id = create_scheduled_download(
    "device-s3", "my-bucket/incoming",
    "device-linux-01", "/work/incoming", hour="02")
static String createScheduledDownload(InnorixClient client, String source, String sourcePath,
        String target, String targetPath, String hour, String minute, String ampm, String action) {
    Map<String, Object> detail = Json.newObj(
            "senderId", source,
            "receiverId", target,
            "sourceItem", Json.newArr(Json.newObj(
                    "hash", InnorixClient.encodePath(source, sourcePath),
                    "filePath", sourcePath.replace("\\", "/"),
                    "isDir", true)),
            "targetPath", InnorixClient.encodePath(target, targetPath),
            "step", 1,
            "transferOptions", Json.newObj(
                    "noSchedule", false,
                    "target-action", action,   // nosend = skip files already on the target
                    "send-fileoption", Json.newObj()));

    Map<String, Object> body = Json.newObj(
            "name", "s3 to linux daily",
            "flowName", "s3 to linux daily",
            "transferType", "normal",
            "isUpcoming", false,
            "timezone", "Asia/Seoul",
            "details", Json.newArr(detail),
            "schedules", Json.newArr(Json.newObj(
                    "type", "day",             // run daily
                    "startDateType", "now",
                    "hour", hour, "minute", minute, "ampm", ampm,
                    "startDate", InnorixClient.nowIso(), "timezone", "Asia/Seoul")),
            "step", 1);

    return Json.str(client.apiObj("POST", "/api/automations", body, null), "automationId");
}
async function createScheduledDownload(source, sourcePath, target, targetPath,
                                       hour = "02", minute = "00", ampm = "am", action = "nosend") {
  const body = {
    name: "s3 to linux daily",
    flowName: "s3 to linux daily",
    transferType: "normal",
    isUpcoming: false,
    timezone: "Asia/Seoul",
    details: [{
      senderId: source,
      receiverId: target,
      sourceItem: [{
        hash: encodePath(source, sourcePath),
        filePath: String(sourcePath ?? "").replace(/\\/g, "/"),
        isDir: true,
      }],
      targetPath: encodePath(target, targetPath),
      step: 1,
      transferOptions: {
        noSchedule: false,
        "target-action": action,   // nosend = skip files already on the target
        "send-fileoption": {},
      },
    }],
    schedules: [{
      type: "day",                 // run daily
      startDateType: "now",
      hour, minute, ampm,
      startDate: nowIso(),
      timezone: "Asia/Seoul",
    }],
    step: 1,
  };

  return (await api("POST", "/api/automations", body)).automationId;
}

const automationId = await createScheduledDownload(
  "device-s3", "my-bucket/incoming",
  "device-linux-01", "/work/incoming", "02");
static async Task<string> CreateScheduledDownloadAsync(InnorixClient client, string source, string sourcePath,
    string target, string targetPath, string hour = "02", string minute = "00", string ampm = "am",
    string action = "nosend")
{
    var detail = new JsonObject
    {
        ["senderId"] = source,
        ["receiverId"] = target,
        ["sourceItem"] = new JsonArray
        {
            new JsonObject
            {
                ["hash"] = InnorixClient.EncodePath(source, sourcePath),
                ["filePath"] = sourcePath.Replace("\\", "/"),
                ["isDir"] = true,
            }
        },
        ["targetPath"] = InnorixClient.EncodePath(target, targetPath),
        ["step"] = 1,
        ["transferOptions"] = new JsonObject
        {
            ["noSchedule"] = false,
            ["target-action"] = action,   // nosend = skip files already on the target
            ["send-fileoption"] = new JsonObject(),
        },
    };

    var body = new JsonObject
    {
        ["name"] = "s3 to linux daily",
        ["flowName"] = "s3 to linux daily",
        ["transferType"] = "normal",
        ["isUpcoming"] = false,
        ["timezone"] = "Asia/Seoul",
        ["details"] = new JsonArray { detail },
        ["schedules"] = new JsonArray
        {
            new JsonObject
            {
                ["type"] = "day",             // run daily
                ["startDateType"] = "now",
                ["hour"] = hour, ["minute"] = minute, ["ampm"] = ampm,
                ["startDate"] = InnorixClient.NowIso(), ["timezone"] = "Asia/Seoul",
            }
        },
        ["step"] = 1,
    };

    return J.Str(await client.ApiObjAsync("POST", "/api/automations", body), "automationId");
}
항목 값 설명
transferType "normal" 예약 전송 (실시간 감시 아님)
schedules[].type "day" 매일 반복
schedules[].hour · minute · ampm string 실행 시각
transferOptions.target-action nosend · overwrite · numbering nosend=대상에 이미 있는 파일은 건너뜀
isUpcoming false 요청에 담은 반복 스케줄을 그대로 등록 (서버가 다음 실행 시각 값으로 대체하지 않음). 예약 자동화에서는 false로 지정

sync와 normal의 차이 transferType: "sync"는 원본 폴더를 지속적으로 감시하는 방식입니다. 정해진 시각에만 전송하려면 이 레시피처럼 transferType: "normal"에 스케줄을 지정합니다. 주기(매주·매월 등)를 다르게 잡는 방법은 예약 전송 레시피에서 다룹니다.

실행 확인#

예약 자동화가 실행될 때마다 실행 이력이 쌓입니다. 회차별 상태와 monitorId를 조회합니다. 실행 이력은 최신 회차가 배열 앞에 옵니다.

runs = api("GET", f"/api/automations/{automation_id}/executions") or []

for run in runs:
    print(run["startTime"], run["status"], run["monitorId"])
List<Object> runs = Json.asArr(client.api("GET", "/api/automations/" + automationId + "/executions"));

for (Object run : runs) {
    Map<String, Object> r = Json.asObj(run);
    System.out.println(Json.str(r, "startTime") + " " + Json.intOrNull(r, "status") + " " + Json.str(r, "monitorId"));
}
const runs = (await api("GET", `/api/automations/${automationId}/executions`)) || [];

for (const run of runs) {
  console.log(run.startTime, run.status, run.monitorId);
}
JsonArray runs = J.AsArr(await client.ApiAsync("GET", 
quot;/api/automations/{automationId}/executions"
)); foreach (JsonNode run in runs) Console.WriteLine(
quot;{J.Str(run, "startTime")} {J.IntOrNull(run, "status")} {J.Str(run, "monitorId")}"
);

각 회차의 monitorId로 파일 단위 결과까지 이어집니다(전송 상태·파일 조회는 API 호출 레시피 참고).

예약 일시정지·재개·삭제#

예약을 잠시 멈추려면 일시정지하고, 다시 켜려면 재개합니다. 예약을 완전히 끝내려면 자동화를 삭제합니다. 원본·대상 경로나 실행 시각을 변경하려면 기존 자동화를 삭제하고 변경된 값으로 새 자동화를 생성합니다.

api("POST", f"/api/automations/{automation_id}/pause", {"pause": True})   # pause
api("POST", f"/api/automations/{automation_id}/pause", {"pause": False})  # resume
api("DELETE", f"/api/automations/{automation_id}")                        # delete automation (permanent)
client.api("POST", "/api/automations/" + automationId + "/pause", Json.newObj("pause", true));   // pause
client.api("POST", "/api/automations/" + automationId + "/pause", Json.newObj("pause", false));  // resume
client.api("DELETE", "/api/automations/" + automationId);                                        // delete automation (permanent)
await api("POST", `/api/automations/${automationId}/pause`, { pause: true });   // pause
await api("POST", `/api/automations/${automationId}/pause`, { pause: false });  // resume
await api("DELETE", `/api/automations/${automationId}`);                        // delete automation (permanent)
await client.ApiAsync("POST", 
quot;/api/automations/{automationId}/pause"
, new JsonObject { ["pause"] = true }); // pause await client.ApiAsync("POST",
quot;/api/automations/{automationId}/pause"
, new JsonObject { ["pause"] = false }); // resume await client.ApiAsync("DELETE",
quot;/api/automations/{automationId}"
); // delete automation (permanent)

구현 결과#

이 레시피를 적용하면 다음 흐름으로 S3의 파일을 Linux 서버로 정기 수집할 수 있습니다.

S3에 파일 적재
   ↓
예약 시각에 자동화 실행 (normal)
   ↓
Linux 서버로 전송
   ↓
실행 이력·monitorId 확인

예약된 시각마다 S3의 파일을 Linux로 내려받아 클라우드에 적재된 데이터를 온프레미스 작업 환경으로 자동 수집할 수 있습니다.

이전Amazon S3에서 Cloudflare R2로 파일 이전하기다음SCP 셸 스크립트를 CLI 기반 전송으로 전환하기

이 페이지에서

  • 시작하기
  • 기본 개념
  • 다운로드 흐름
  • 활용 변화
  • IT 엔지니어
  • 환경 연결
  • 파일 조건
  • 실행 구성
  • 경로 설계
  • 결과 확인
  • 후속 연결
  • 장애 대응
  • 개발자
  • 예약 자동화 생성
  • 실행 확인
  • 예약 일시정지·재개·삭제
  • 구현 결과