| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- JPQL
- AWS
- JPA
- DI
- MSA
- dockerhub
- Web
- 쿠버네티스
- 지연 로딩
- securitycontextholderfilter
- Spring Container
- redis
- JdbcTemplate
- 페이징
- @Transactional
- docker compose
- JWT
- Routing Key
- Dead Letter Queue
- DLQ
- CORS
- mybatis
- 컨테이너
- @ComponentScan
- Spring Data JPA
- 스프링 부트
- docker
- 서블릿 컨테이너
- Spring
- kafka
- Today
- Total
look-forest
파일 및 이미지 업로드 (S3) 본문
S3란?
파일 저장 서비스이다. 사진이나 동영상과 같은 파일들을 구글 드라이브나 iCloud에 저장하는 것과 비슷하다.
EC2 내부에 이미지 파일을 저장할 수도 있지만, 운영하다보면 EC2에 쌓이는 파일들이 너무 많아지고 지저분해지게 된다.
따라서 휴대폰에 저장공간이 있는데도 불구하고 구글 드라이브나 iCloud와 같은 곳에 사진을 옮기는 이유와 비슷하게,
현업에서 파일 업로드 기능을 구현할 때면 대부분은 AWS S3를 활용한다.
S3는 파일 저장에 특화된 서비스이다. 파일 저장 뿐만 아니라 파일을 다운받는 것에 대해서도 최적화되어 있는 서비스이다.
S3를 활용한 아키텍처 구성
아래 예시는 이미지 파일로 예를 들었으나, S3는 이미지 이외에도 다양한 종류의 파일을 저장하는 용도로 많이 사용한다.
이미지 업로드 과정

DB에는 이미지가 저장된 URL을 저장한다.
이미지 파일 다운로드 과정

사용자는 이미지 URL을 응답받고, 브라우저가 해당 URL로 이미지를 다운로드한다.

용어
S3에서는 버킷(Bucket)과 객체(Object)라는 용어를 사용한다.
버킷(Bucket)이란?
깃헙(Github)을 보면 여러 개의 Repository를 만들 수 있다. S3에서도 여러 개의 저장소를 만들 수 있다.
여기서 하나의 저장소를 버킷(Bucket)이라고 부른다.
객체(Object)이란?
S3에 업로드한 파일을 보고, S3에서는 파일(File)이라 부르지 않고 객체(Object)라고 부른다.
즉, 객체(Object)란 S3 버킷에 업로드된 파일을 의미한다.
실습
S3 버킷 생성하기

중요한 것은, 이미지 업로드/다운로드를 위해서는 퍼블릭 엑세스를 허용해야 한다는 점이다.

버킷에 정책 추가하기
정책(Policy)이란?
권한(Permission)을 정의하는 JSON 문서를 의미한다. AWS는 기본적으로 대부분의 권한이 주어져있지 않다.
AWS의 특정 소스에 접근하려면 권한을 허용해주어야 한다. 권한을 허용할 때 작성해야 하는 게 정책(Policy)이다.
특정 서비스에서 상품 이미지를 모든 사용자한테 보여주고 싶다고 가정해보자. 그러면 버킷에서 상품 이미지를 다운로드해서 사용할 수 있어야 한다. 버킷에서 이미지 파일을 조회할 수 있게 정책을 추가해보자.
버킷 정책 편집 버튼을 누르고 새 문 추가를 누른다.
작업 추가에서 S3, GetObject 선택 후 리소스 추가를 누른다.
ARN이란 Amazon Resource Number의 약자이다. AWS에 존재하는 리소스를 표현하는 문법이다.


S3에 파일 업로드 할 수 있도록 IAM에서 액세스 키 발급받기
IAM (Identity and Access Management) 이란?
AWS 리소스에 대한 액세스 관리
기본적으로 AWS의 리소스에 아무나 접근을 못하게 막아놨기 때문에 S3에 접근해서 파일을 업로드할 수가 없다.
하지만 백엔드 서버가 S3에 접근해서 파일을 업로드할 수 있어야 한다.
S3에 접근할 수 있는 권한을 받기 위해 IAM이라는 곳에서 권한을 부여받아야 한다.
- IAM에서 ‘사용자’ 메뉴로 들어가기
- 사용자 추가하기
- 권한 설정 시 '직접 정책 연결'을 선택해 이미 셋팅된 정책을 연결한다.

- 권한 설정 시 '직접 정책 연결'을 선택해 이미 셋팅된 정책을 연결한다.
- 액세스 키 만들기
- 사용자를 눌러서 보안 자격 증명 탭
- 액세스 키 만들기를 눌러서 출입증(액세스키, 비밀액세스키)를 발급받고 저장해둔다.
이걸 이용해 백엔드 서버가 S3에 접근한다.
S3를 활용해 Springboot 서버에 이미지 업/다운로드 기능 구현하기
구현 방식 및 설정
나는 S3 연동을 위해 Spring Boot에서 S3Client 를 사용했다.
@Configuration
@EnableConfigurationProperties(S3Properties.class)
public class FileUploaderConfig {
@Bean
@Profile({ "dev", "prod" })
public S3Client s3Client() {
// AWS SDK는 AWS_ACCESS_KEY를 자동 인식
// EC2 환경 변수 또는 ~/.aws/credentials, IAM Role 등 외부에 저장된 키를 사용함
return S3Client.builder().region(Region.AP_NORTHEAST_2).build();
}
}
S3Client를 생성할 때 AWS 자격 증명(Access Key, Secret Key)을 주입하는 방식에는 여러가지가 있지만,
현재 코드 구조에서는 직접 코드에서 주입하지 않고, AWS SDK가 기본적으로 아래 환경 변수를 자동 인식하는 방식을 활용했다.
보통 EC2 환경 변수 또는 ~/.aws/credentials, IAM Role 등 외부에 저장된 키를 사용하는 것이 권장된다 하여,
로컬 서버에서는 S3에 접근할 때는 ~/.aws/credentials 에 설정된 엑세스 키 값을 읽도록 파일을 셋팅해두었고,
EC2 서버에서는 IAM Role 설정을 읽어오도록 했다.
IAM Role 설정 방법
1) IAM Role 생성 및 권한 부여
- AWS Management Console > IAM > 역할(Role) > 역할 만들기
- AWS 서비스 선택 → EC2 선택 → 다음
- 권한 정책에
- AmazonS3FullAccess (테스트용)
- 또는 최소 권한 정책(예: 특정 S3 버킷만 Put/Delete 가능) 선택
- 역할 이름 입력(예: capturecat-ec2-s3-role) → 역할 생성


2) EC2 인스턴스에 Role 할당
- EC2 > 인스턴스 > 대상 인스턴스 선택
- 상단 메뉴에서 작업 → 보안 → IAM 역할 수정
- 방금 만든 IAM Role 할당
(실행 중인 인스턴스에도 즉시 반영 가능)

참고 자료 & 이미지 출처
비전공자도 이해할 수 있는 AWS 입문/실전
https://jscode.notion.site/2a38dc67ca1448f7ab350e40b89abd5a
'Infra > AWS' 카테고리의 다른 글
| 데이터베이스 연결하기 (RDS) (0) | 2025.06.10 |
|---|---|
| HTTPS 연결하기 (ELB) (1) | 2025.06.07 |
| 백엔드 API 서버 배포하기 (EC2) (0) | 2025.06.06 |