발행일: 2026-10-06(화) 11:44
← 목차로 돌아가기|하루 30분 n8n 시리즈 ② 실무 자동화 레시피 100
RECIPE 089

AWS S3 파일 업로드 → 자동 처리 파이프라인

  • ▸S3 버킷에 파일 업로드 시 자동 처리 워크플로우 트리거
  • ▸이미지 파일은 리사이징 및 썸네일 자동 생성
  • ▸처리 완료 파일을 다른 S3 경로로 자동 이동

✅사전 준비

  • □AWS 계정 및 S3 버킷 생성
  • □S3 이벤트 알림 → SNS 또는 SQS → n8n 웹훅 연동
  • □AWS IAM 사용자 생성 (S3 읽기/쓰기 권한)
  • □이미지 처리 API 설정 (Cloudinary 또는 imgix)

S3 이벤트 → n8n 웹훅 연결

// AWS S3 → SNS → HTTP Subscription 설정
// S3 버킷 → Properties → Event Notifications
// Event: s3:ObjectCreated:*
// Destination: SNS Topic
// SNS → Subscriptions → HTTPS → n8n 웹훅 URL

// n8n Webhook 수신
Node: Webhook
Path: /s3-event
Method: POST

// S3 파일 정보 추출 (Code 노드)
const record = $json.Records[0];
const bucketName = record.s3.bucket.name;
const objectKey = decodeURIComponent(record.s3.object.key);
const fileSize = record.s3.object.size;

return [{ json: { bucketName, objectKey, fileSize } }];

파일 유형별 처리 분기 (Switch)

// 파일 확장자 추출 후 Switch
const ext = $json.objectKey.split('.').pop().toLowerCase();

Node: Switch
Value: {{ ext }}

Case 'jpg'/'jpeg'/'png'/'webp': 이미지 처리 경로
Case 'pdf': 텍스트 추출 경로
Case 'csv'/'xlsx': 데이터 파싱 경로
Default: 원본 이동만 처리

Cloudinary 이미지 업로드 및 변환

Node: HTTP Request
Method: POST
URL: https://api.cloudinary.com/v1_1/YOUR_CLOUD_NAME/image/upload

Body (Form Data):
  file: {{ $json.s3_presigned_url }}
  upload_preset: auto_process
  transformation: w_800,h_600,c_fill,q_auto,f_auto
  tags: processed,auto
💡 TIPn8n에서 AWS S3를 직접 다루려면 AWS S3 노드가 내장되어 있습니다. 별도의 HTTP Request 없이도 파일 업로드/다운로드/삭제/목록 조회가 가능합니다.
⚡

워크플로우 JSON

아래 JSON을 복사해 n8n에 바로 임포트하세요

📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
  "recipeId": "recipe089",
  "title": "카카오 채널 DB 자동 업데이트",
  "chapter": 8,
  "category": "국내 서비스 특화 레시피",
  "difficulty": "⭐⭐⭐",
  "estimatedTime": "50분",
  "usedApps": [
    "Google Sheets",
    "카카오 비즈니스 API"
  ],
  "description": "Google Sheets에서 관리하는 카카오 채널 챗봇 FAQ 데이터를 매일 새벽 3시 자동 점검해, 전일 대비 변경된 항목만 추출하고 카카오 비즈니스 API로 챗봇 DB를 자동 업데이트합니다.",
  "nodes": [
    {
      "id": "node1",
      "type": "n8n-nodes-base.scheduleTrigger",
      "name": "매일 새벽 3시 실행",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 3 * * *"
            }
          ]
        }
      }
    },
    {
      "id": "node2",
      "type": "n8n-nodes-base.googleSheets",
      "name": "FAQ 전체 목록 조회",
      "parameters": {
        "operation": "getAll",
        "spreadsheetId": "={{$env.KAKAO_FAQ_SHEET_ID}}",
        "sheetName": "FAQ"
      }
    },
    {
      "id": "node3",
      "type": "n8n-nodes-base.code",
      "name": "전일 이후 수정 항목 필터링",
      "parameters": {
        "jsCode": "const yesterday = new Date();\nyesterday.setDate(yesterday.getDate() - 1);\nreturn items.filter(item => {\n  const modifiedAt = new Date(item.json['최종수정일']);\n  return modifiedAt >= yesterday;\n});"
      }
    },
    {
      "id": "node4",
      "type": "n8n-nodes-base.if",
      "name": "변경 항목 있음?",
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{$items().length}}",
              "operation": "largerEqual",
              "value2": 1
            }
          ]
        }
      }
    },
    {
      "id": "node5",
      "type": "n8n-nodes-base.httpRequest",
      "name": "카카오 비즈니스 API 챗봇 DB 업데이트",
      "parameters": {
        "method": "PUT",
        "url": "https://kakaoapi.aligo.in/akv10/chatbot/update/",
        "headers": {
          "Authorization": "Bearer {{$env.KAKAO_CHATBOT_API_KEY}}",
          "Content-Type": "application/json"
        },
        "body": {
          "question": "={{$json['질문']}}",
          "answer": "={{$json['답변']}}",
          "category": "={{$json['카테고리']}}"
        }
      }
    },
    {
      "id": "node6",
      "type": "n8n-nodes-base.slack",
      "name": "업데이트 완료 알림",
      "parameters": {
        "channel": "={{$env.CS_SLACK_CHANNEL}}",
        "text": "✅ 카카오 채널 챗봇 DB 업데이트 완료\n변경 항목: {{$items().length}}건\n업데이트 시각: {{$now.format('MM/DD HH:mm')}}"
      }
    }
  ],
  "envVariables": {
    "KAKAO_FAQ_SHEET_ID": "Google Sheets FAQ 시트 ID",
    "KAKAO_CHATBOT_API_KEY": "카카오 비즈니스 챗봇 API 키",
    "CS_SLACK_CHANNEL": "CS팀 Slack 채널 ID"
  },
  "tips": [
    "새벽 3시에 실행하면 서버 부하가 낮아 API 응답이 안정적이에요. 업무 시간 중 실행보다 안정성이 높습니다.",
    "Google Sheets의 '최종수정일' 열은 수동으로 입력하거나 Google Apps Script로 자동 갱신하도록 설정할 수 있어요.",
    "업데이트 실패 시 Error Trigger 노드를 추가해 CS팀에 재시도 요청 알림을 보내면 안전하게 운영할 수 있어요."
  ],
  "qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe089"
}
← 이전 레시피☰ 목차다음 레시피 →