인증 방식
🔑 API Key
요금
첫 1년 무료(5GB), 이후 GB당 $0.023~
Base URL
s3.amazonaws.com
태그
스토리지, S3
서비스 소개
Amazon S3(Simple Storage Service)는 파일 업로드·저장·서빙의 업계 표준입니다. 이미지, 동영상, 문서 등 모든 파일을 저장하고 CDN과 연동하여 빠르게 서빙할 수 있습니다. Presigned URL로 클라이언트에서 직접 안전하게 업로드하는 패턴이 많이 사용됩니다.
🚀 시작하기
- 1
AWS 계정 생성
aws.amazon.com → 계정 생성 (카드 등록 필요, 프리티어 12개월)
- 2
S3 버킷 생성
S3 콘솔 → 버킷 만들기 → 리전: ap-northeast-2 (서울)
- 3
IAM 사용자 생성
IAM → 사용자 → S3 접근 권한 부여 → Access Key 발급
- 4
CORS 설정
버킷 → 권한 → CORS → 프론트엔드 도메인 허용
💡 코드 예제
JavaScriptNode.js (Presigned URL)
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3'
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
const s3 = new S3Client({
region: 'ap-northeast-2',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
},
})
// 업로드용 Presigned URL 생성 (클라이언트에서 직접 업로드)
async function getUploadUrl(key: string, contentType: string) {
const command = new PutObjectCommand({
Bucket: process.env.S3_BUCKET_NAME!,
Key: key, // 예: 'images/profile/user123.jpg'
ContentType: contentType,
})
return getSignedUrl(s3, command, { expiresIn: 300 }) // 5분 유효
}
// 클라이언트에서 업로드
const uploadUrl = await getUploadUrl('images/test.jpg', 'image/jpeg')
await fetch(uploadUrl, {
method: 'PUT',
body: file,
headers: { 'Content-Type': 'image/jpeg' },
})
// 퍼블릭 URL
const publicUrl = `https://${process.env.S3_BUCKET_NAME}.s3.ap-northeast-2.amazonaws.com/images/test.jpg`PythonPython (boto3)
import boto3
from botocore.exceptions import ClientError
s3 = boto3.client(
's3',
region_name='ap-northeast-2',
aws_access_key_id='YOUR_ACCESS_KEY',
aws_secret_access_key='YOUR_SECRET_KEY',
)
# 파일 업로드
s3.upload_file('local_file.jpg', 'my-bucket', 'images/file.jpg')
# Presigned URL 생성
url = s3.generate_presigned_url(
'put_object',
Params={'Bucket': 'my-bucket', 'Key': 'images/file.jpg'},
ExpiresIn=300,
)