오늘은 쓰레드 자동화를 계획하던 도중, 쓰레드 글에 API를 이용하여 미디어(이미지, 동영상)을 첨부하기 위해서는 공개 접근 가능한 URL이 있어야 한다는 걸 알았다.
그래서 스토리지를 알아보던 도중 Cloudflare R2가 10GB까지 무료라고 하길래 이참에 써보기로 했다.
추가로 Egress(데이터전송)이 무료라서 나중에 옮기기도 쉬울 것 같았다.

Step 1: Cloudflare 계정 가입
- dash.cloudflare.com/sign-up 접속
- 이메일 + 비밀번호로 가입 (무료)
- 이메일 인증 완료
[!tip] 신용카드 등록이 필요할 수 있지만, 무료 범위 내에서는 과금되지 않습니다.
Step 2: R2 버킷 생성
- 대시보드 왼쪽 메뉴에서 R2 Object Storage 클릭
- Create bucket 클릭
- 버킷 이름 입력 (예:
thread-media) - 위치는 APAC 선택 (한국 가까운 리전)
- Create bucket 완료


Step 3: 퍼블릭 액세스 설정
Threads API가 파일을 가져가려면 공개 URL이 필요합니다.
- 생성된 버킷 → Settings 탭
- Public Development URL 활성화
pub-xxxxx.r2.dev형태의 공개 도메인이 생성됨
이후 업로드한 파일은 https://pub-xxxxx.r2.dev/파일명으로 접근 가능합니다.

Step 4: API 토큰 생성
Python에서 업로드하려면 API 키가 필요합니다.
- R2 Overview 페이지 → 우측 하단 Account Details의 Manage 클릭
- Create Account API token 클릭
- 설정:
- Permission: Object Read & Write
- Specify bucket:
thread-media(생성한 버킷)
- Create API Token 클릭
- 표시되는 값 즉시 복사 (다시 볼 수 없음):
Access Key ID→R2_ACCESS_KEY_IDSecret Access Key→R2_SECRET_ACCESS_KEYEndpoint→ 버킷 상세 페이지에서 확인 (https://<ACCOUNT_ID>.r2.cloudflarestorage.com)
[!warning] API 토큰은 생성 직후에만 확인 가능합니다. 반드시 즉시 복사해 두세요.


Step 5: .env에 추가
R2_ACCESS_KEY_ID=your_access_key
R2_SECRET_ACCESS_KEY=your_secret_key
R2_ENDPOINT=https://<ACCOUNT_ID>.r2.cloudflarestorage.com
R2_BUCKET_NAME=thread-media
R2_PUBLIC_URL=https://pub-xxxxx.r2.dev
Step 6: Python으로 업로드 테스트
패키지 설치:
uv add boto3
업로드 코드:
import boto3
s3 = boto3.client('s3',
endpoint_url='https://<ACCOUNT_ID>.r2.cloudflarestorage.com',
aws_access_key_id='your_access_key',
aws_secret_access_key='your_secret_key',
)
# 업로드
s3.upload_file('video.mp4', 'thread-media', 'media/video.mp4')
# 공개 URL
print('https://pub-xxxxx.r2.dev/media/video.mp4')728x90
'알쓸신잡' 카테고리의 다른 글
| Claudian-옵시디언에서 Claude Code 사용하기 (0) | 2026.02.04 |
|---|---|
| Daggr - HuggingFace의 새로운 AI 워크플로우 도구 (0) | 2026.02.02 |
| Microsoft VibeVoice-ASR (0) | 2026.02.02 |
| PaddleOCR-VL-1.5-초경량 OCR의 새로운 강자 (0) | 2026.02.02 |
| STAX - 구글이 내놓은 LLM 평가 플랫폼 (0) | 2026.01.26 |