보통 개발 초기에는 로컬에 첨부파일이나 이미지를 저장하도록 설정하지만, 운영 단계에 들어가기 전에 파일 저장소를 어떻게 구성할지를 결정하는 것이 중요합니다.
파일을 서버의 특정 디렉토리에 저장할 수도 있지만, 일반적으로 서버 용량 관리와 이중화(HA) 문제를 고려하여 별도의 스토리지 시스템을 도입하는 경우가 많습니다.
AWS에서는 이러한 파일 저장소 문제를 해결하는 서비스를 제공하는데, 그중 대표적인 것이 AWS S3입니다.
S3 버킷 설정
- 버킷 만들기 클릭

- 버킷 만들기 세팅

버킷 이름 입력하는 부분 빼고, 나머지 부분은 기본 설정을 그대로 가져갔습니다.
AWS IAM 권한 설정
- AWS에서는 IAM(Identity and Access Management) 계정을 생성하여 권한을 세분화하여 할당하는 방법을 권장합니다.
- 루트 계정은 모든 권한을 가지고 있기 때문에, 보안상 위험한 행위를 방지하기 위해 루트 계정 사용을 최소화하고 IAM 계정을 통해 필요한 권한만 부여하는 것이 좋습니다.
- 따라서 AWS에서는 IAM 권한을 세밀하게 설정하고 관리하는 것을 강력히 권장합니다.
- iam 계정을 생성하면 access key와 secret key를 확인할 수 있습니다.
생성 방법
AWS IAM 콘솔에서 액세스 키 발급
1. AWS Management Console에 로그인
2. IAM (Identity and Access Management) 서비스로 이동
3. 왼쪽 메뉴에서 "사용자" 선택
4. S3 업로드에 사용할 IAM 사용자 선택
5. "보안 자격 증명" 탭으로 이동
6. "엑세스 키" 섹션에서 "새로운 엑세스 키 생성" 클릭
7. Secret Key는 한 번만 제공되므로 안전하게 보관

S3 파일 업로드 및 관리를 위한 IAM 사용자라면, 다음 중 하나의 정책을 선택하면 됩니다.
AmazonS3FullAccess
- S3의 모든 버킷에 대한 읽기/쓰기 권한을 가짐
- 검색창에 AmazonS3FullAccess 입력 후 선택
여기까지 진행해도 IAM 계정을 만들었을 뿐 엑세스 키와, 시크릿 키를 만드려면 IAM 메뉴에서 엑세스 키를 만들어야 합니다.
생성한 액세스 키를 Spring Boot에서 사용하기
application.yml 또는 application.properties에 추가합니다.
aws:
s3:
access-key: "발급받은 액세스 키"
secret-key: "발급받은 시크릿 키"
bucket-name: "map-sv-bucket"
region: "ap-northeast-2" # AWS 콘솔에서 확인한 리전 값
AWS S3 SDK 적용 및 S3 파일 업로드 설정
1. AWS SDK 라이브러리 추가
implementation 'software.amazon.awssdk:s3:2.20.17'
implementation 'io.awspring.cloud:spring-cloud-starter-aws:2.4.4'
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.20.17</version>
</dependency>
<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-starter-aws</artifactId>
<version>2.4.4</version>
</dependency>
2. S3FileStorageService 구현
- 기존에 작성해둔 파일 관련 인터페이스 FileStorageService를 상속하여
- 기능은 동일하지만, Aws S3 기준으로 파일이 업로드 삭제될 수 있게 설정합니다.
- 해당 코드(기존)
- https://github.com/beginner0107/Foody/pull/19
@Service
@RequiredArgsConstructor
public class S3FileStorageService implements FileStorageService {
private final S3Client s3Client;
@Value("${cloud.aws.s3.bucket}")
private String bucketName;
@Override
public String saveFile(MultipartFile file) {
try {
String fileName = UUID.randomUUID() + getFileExtension(file.getOriginalFilename());
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(fileName)
.contentType(file.getContentType())
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromBytes(file.getBytes()));
return getFileUrl(fileName);
} catch (IOException e) {
throw new FileStorageException("파일 저장 중 오류 발생", e);
}
}
@Override
public void deleteFile(String fileName) {
DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder()
.bucket(bucketName)
.key(fileName)
.build();
s3Client.deleteObject(deleteObjectRequest);
}
@Override
public String getFileUrl(String fileName) {
return "https://" + bucketName + ".s3.amazonaws.com/" + fileName;
}
private String getFileExtension(String filename) {
return filename.substring(filename.lastIndexOf("."));
}
}
확인해야할 점
AWS SDK v2 (software.amazon.awssdk:s3:2.20.17는 기본적으로 IAM 역할(ROLE)을 통해 자격 증명을 가져올 수 있는 방식을 지원한다고 합니다.
명시적인 accessKey와 secretKey 없이도 IAM 역할을 통해 자동으로 인증할 수 있습니다
액세스 키와 시크릿 키가 필요 없는 경우
- EC2, ECS 같은 AWS 리소스에서 실행될 때
- 환경 변수 설정 (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
결론
- EC2, ECS에서 실행 중이며 IAM 역할이 설정되어 있다면 액세스 키 필요 없음 → AWS SDK가 자동으로 자격 증명을 가져옴
- EC2에 IAM 역할이 없으면 명시적으로 accessKey와 secretKey를 설정해야 함
참고사이트
[AWS] 📚 S3 개념 & 버킷 · 권한 설정 방법
S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는 온라인 오브젝트(객체) 스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.) 쉽
inpa.tistory.com
OpenAI. (2025). ChatGPT (February 13 version) [Large language model]. https://chat.openai.com
'배포관련 > AWS' 카테고리의 다른 글
AWS EC2에서 Nginx + Docker Compose + Jenkins를 활용한 CI/CD 구축 (0) | 2025.02.23 |
---|---|
AWS로 Spring boot 배포하기 (1) | 2025.02.16 |
AWS 에서의 망에 대해.. (0) | 2024.01.09 |
리전(Region)이란? (1) | 2024.01.01 |
EC2란? (0) | 2023.12.31 |
보통 개발 초기에는 로컬에 첨부파일이나 이미지를 저장하도록 설정하지만, 운영 단계에 들어가기 전에 파일 저장소를 어떻게 구성할지를 결정하는 것이 중요합니다.
파일을 서버의 특정 디렉토리에 저장할 수도 있지만, 일반적으로 서버 용량 관리와 이중화(HA) 문제를 고려하여 별도의 스토리지 시스템을 도입하는 경우가 많습니다.
AWS에서는 이러한 파일 저장소 문제를 해결하는 서비스를 제공하는데, 그중 대표적인 것이 AWS S3입니다.
S3 버킷 설정
- 버킷 만들기 클릭

- 버킷 만들기 세팅

버킷 이름 입력하는 부분 빼고, 나머지 부분은 기본 설정을 그대로 가져갔습니다.
AWS IAM 권한 설정
- AWS에서는 IAM(Identity and Access Management) 계정을 생성하여 권한을 세분화하여 할당하는 방법을 권장합니다.
- 루트 계정은 모든 권한을 가지고 있기 때문에, 보안상 위험한 행위를 방지하기 위해 루트 계정 사용을 최소화하고 IAM 계정을 통해 필요한 권한만 부여하는 것이 좋습니다.
- 따라서 AWS에서는 IAM 권한을 세밀하게 설정하고 관리하는 것을 강력히 권장합니다.
- iam 계정을 생성하면 access key와 secret key를 확인할 수 있습니다.
생성 방법
AWS IAM 콘솔에서 액세스 키 발급
1. AWS Management Console에 로그인
2. IAM (Identity and Access Management) 서비스로 이동
3. 왼쪽 메뉴에서 "사용자" 선택
4. S3 업로드에 사용할 IAM 사용자 선택
5. "보안 자격 증명" 탭으로 이동
6. "엑세스 키" 섹션에서 "새로운 엑세스 키 생성" 클릭
7. Secret Key는 한 번만 제공되므로 안전하게 보관

S3 파일 업로드 및 관리를 위한 IAM 사용자라면, 다음 중 하나의 정책을 선택하면 됩니다.
AmazonS3FullAccess
- S3의 모든 버킷에 대한 읽기/쓰기 권한을 가짐
- 검색창에 AmazonS3FullAccess 입력 후 선택
여기까지 진행해도 IAM 계정을 만들었을 뿐 엑세스 키와, 시크릿 키를 만드려면 IAM 메뉴에서 엑세스 키를 만들어야 합니다.
생성한 액세스 키를 Spring Boot에서 사용하기
application.yml 또는 application.properties에 추가합니다.
aws:
s3:
access-key: "발급받은 액세스 키"
secret-key: "발급받은 시크릿 키"
bucket-name: "map-sv-bucket"
region: "ap-northeast-2" # AWS 콘솔에서 확인한 리전 값
AWS S3 SDK 적용 및 S3 파일 업로드 설정
1. AWS SDK 라이브러리 추가
implementation 'software.amazon.awssdk:s3:2.20.17'
implementation 'io.awspring.cloud:spring-cloud-starter-aws:2.4.4'
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.20.17</version>
</dependency>
<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-starter-aws</artifactId>
<version>2.4.4</version>
</dependency>
2. S3FileStorageService 구현
- 기존에 작성해둔 파일 관련 인터페이스 FileStorageService를 상속하여
- 기능은 동일하지만, Aws S3 기준으로 파일이 업로드 삭제될 수 있게 설정합니다.
- 해당 코드(기존)
- https://github.com/beginner0107/Foody/pull/19
@Service
@RequiredArgsConstructor
public class S3FileStorageService implements FileStorageService {
private final S3Client s3Client;
@Value("${cloud.aws.s3.bucket}")
private String bucketName;
@Override
public String saveFile(MultipartFile file) {
try {
String fileName = UUID.randomUUID() + getFileExtension(file.getOriginalFilename());
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(fileName)
.contentType(file.getContentType())
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromBytes(file.getBytes()));
return getFileUrl(fileName);
} catch (IOException e) {
throw new FileStorageException("파일 저장 중 오류 발생", e);
}
}
@Override
public void deleteFile(String fileName) {
DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder()
.bucket(bucketName)
.key(fileName)
.build();
s3Client.deleteObject(deleteObjectRequest);
}
@Override
public String getFileUrl(String fileName) {
return "https://" + bucketName + ".s3.amazonaws.com/" + fileName;
}
private String getFileExtension(String filename) {
return filename.substring(filename.lastIndexOf("."));
}
}
확인해야할 점
AWS SDK v2 (software.amazon.awssdk:s3:2.20.17는 기본적으로 IAM 역할(ROLE)을 통해 자격 증명을 가져올 수 있는 방식을 지원한다고 합니다.
명시적인 accessKey와 secretKey 없이도 IAM 역할을 통해 자동으로 인증할 수 있습니다
액세스 키와 시크릿 키가 필요 없는 경우
- EC2, ECS 같은 AWS 리소스에서 실행될 때
- 환경 변수 설정 (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
결론
- EC2, ECS에서 실행 중이며 IAM 역할이 설정되어 있다면 액세스 키 필요 없음 → AWS SDK가 자동으로 자격 증명을 가져옴
- EC2에 IAM 역할이 없으면 명시적으로 accessKey와 secretKey를 설정해야 함
참고사이트
[AWS] 📚 S3 개념 & 버킷 · 권한 설정 방법
S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는 온라인 오브젝트(객체) 스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.) 쉽
inpa.tistory.com
OpenAI. (2025). ChatGPT (February 13 version) [Large language model]. https://chat.openai.com
'배포관련 > AWS' 카테고리의 다른 글
AWS EC2에서 Nginx + Docker Compose + Jenkins를 활용한 CI/CD 구축 (0) | 2025.02.23 |
---|---|
AWS로 Spring boot 배포하기 (1) | 2025.02.16 |
AWS 에서의 망에 대해.. (0) | 2024.01.09 |
리전(Region)이란? (1) | 2024.01.01 |
EC2란? (0) | 2023.12.31 |