AWS 2

짬그브·2025년 6월 9일

S3

파일저장 서비스로 백엔드 서버를 구현하다보면 이미지 업로드 기능을 구현할 때가 많다. 그럼 이 이미지 파일을 어디에 저장해야 할까? EC2 내부에 이미지 파일을 저장할 수도 있다. 하지만 서비스를 조금만 운영하다보면 EC2에 쌓이는 파일들이 너무 많아지고 지저분해지게 된다.

우리가 휴대폰에 저장공간이 있는데도 불구하고 구글 드라이브나 iCloud와 같은 곳에 사진을 옮기는 이유와 비슷하다. S3는 파일 저장에 특화된 서비스이다. 파일 저장 뿐만 아니라 파일을 다운받는 것에 대해서도 최적화되어 있는 서비스이다. 이러한 이유 때문에 S3를 사용한다.

S3 사용해보기

우측 버킷 생성에 버킷만들기

버킷 이름 정해주기

액세스 차단 설정 해주기 (모든퍼블릭 액세스차단 해제 및 주의사항 체크)

설정 끝나면 우측 아래 버킷만들기 클릭

버킷 생성 완료 화면

버킷 이름 클릭해서 들어가기

권한 탭으로 이동

버킷 정책 설정 (우측 편집 사용)

우측 새 문 추가 클릭

우측 검색에서 서비스선택칸에 s3 검색후 선택

GetObject 검색 후 체크

리소스 추가 선택 후 리소스 유형 object로 설정

리소스 ARN설정

정책에 리소스 추가된 모습

정책 Principal {} 에서 * 로 변경

우측 하단 변경사항 저장 클릭 후 이동

iam 사용자 만들기

좌측상단 검색창에 iam 검색 후 클릭

좌측 액세스관리 탭에서 사용자 클릭

우측 사용자 생성 클릭

사용자 이름 설정 이후 다음

권한 옵션에서 직접 정책 연결

S3Full 이라고 검색후 체크 이후 다음

사용자 생성 클릭

사용자 생성된 모습

사용자 이름 클릭

보안자격증명 탭에서 액세스키로 이동해서 액세스 키 만들기 클릭

AWS 외부에서 실행되는 어플리케이션에 체크 후 다음

액세스 키 만들기 클릭

액세스키 이름과 비밀 액세스 키 복사

표시 키로 비밀 액세스 키도 볼 수 있음 이후 완료

사용자 탭으로 가서 활성 확인

FastAPI 적용해보기

파이참 커맨드 프롬프트에서 추가 설치

from fastapi import FastAPI, File, UploadFile
import boto3
from botocore.exceptions import NoCredentialsError

app = FastAPI()

AWS_ACCESS_KEY_ID = "AKIA4TTOMWJCQ64SEOPZ"
AWS_SECRET_ACCESS_KEY = "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"
AWS_REGION = "ap-northeast-2"
S3_BUCKET_NAME = "zzuni-test-static-lec"

s3_client = boto3.client(
    "s3",
    region_name=AWS_REGION,
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY
)

@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
    try:
        file_content = await file.read()

        s3_client.put_object(
            Bucket=S3_BUCKET_NAME,
            Key=file.filename,
            Body=file_content,
            ContentType=file.content_type
        )

        file_url = f"https://{S3_BUCKET_NAME}.s3.{AWS_REGION}.amazonaws.com/{file.filename}"
        return{"message":"Upload successful","file_url":file_url}

    except NoCredentialsError:
        return {"error":"aws 자격 증명이 유효하지 않습니다."}
    except Exception as e:
        return {'error': str(e)}



실행시 화면

업로드 후

버킷 확인

속성에 객체 URL 확인

실행 확인

profile
+AI to AI+

0개의 댓글