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 클릭
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"
}