API 목록으로
☁️ 클라우드·스토리지유료

AWS S3

Amazon Web Services · Amazon S3 API

인증 방식

🔑 API Key

요금

첫 1년 무료(5GB), 이후 GB당 $0.023~

Base URL

s3.amazonaws.com

태그

스토리지, S3

서비스 소개

Amazon S3(Simple Storage Service)는 파일 업로드·저장·서빙의 업계 표준입니다. 이미지, 동영상, 문서 등 모든 파일을 저장하고 CDN과 연동하여 빠르게 서빙할 수 있습니다. Presigned URL로 클라이언트에서 직접 안전하게 업로드하는 패턴이 많이 사용됩니다.

🚀 시작하기

  1. 1

    AWS 계정 생성

    aws.amazon.com → 계정 생성 (카드 등록 필요, 프리티어 12개월)

  2. 2

    S3 버킷 생성

    S3 콘솔 → 버킷 만들기 → 리전: ap-northeast-2 (서울)

  3. 3

    IAM 사용자 생성

    IAM → 사용자 → S3 접근 권한 부여 → Access Key 발급

  4. 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,
)