티스토리 뷰
입사 후 온프레미스 환경에서 클라우드 환경으로 넘어오면서 AWS 인프라를 많이 활용해 보고 있다.
그 중에서도 리소스를 저장하기 위해 S3를 가장 많이 사용하고 있는데,
스프링부트에서 연동해서 사용하는 법을 알아보자.
주의!! 이 글은 S3 버킷을 생성하는 부분은 따로 언급하지 않았습니다.
AWS S3란?
Amazon Simple Storage Service(Amazon S3)는 업계 최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다. 모든 규모와 업종의 고객은 Amazon S3를 사용하여 데이터 레이크, 웹 사이트, 모바일 애플리케이션, 백업 및 복원, 아카이브, 엔터프라이즈 애플리케이션, IoT 디바이스, 빅 데이터 분석 등 다양한 사용 사례에서 원하는 양의 데이터를 저장하고 보호할 수 있습니다. Amazon S3는 특정 비즈니스, 조직 및 규정 준수 요구 사항에 맞게 데이터에 대한 액세스를 최적화, 구조화 및 구성할 수 있는 관리 기능을 제공합니다.
- AWS S3 사용 설명서
요약하면 보안성과 유지보수를 위한 기능을 제공하는 클라우드 저장소이다.
스프링부트에서는 S3를 사용하는 방법이 크게 두가지가 있다.
하나는 AWS CLI를 이용하는 방법과 다른 하나는 AWS S3 SDK를 이용하는 방법이다.
액세스 키 생성 하기
이 포스팅에서 확인
AWS CLI 이용하기
AWS CLI(Command Line Interface)는 커맨드라인에서 AWS 서비스와 상호 작용할 수 있게 지원해주는 오픈 소스이다.
AWS CLI는 S3에만 사용할 수 있는게 아니라 커맨드라인을 통해 다른 서비스도 이용이 가능하다.
먼저 AWS CLI를 사용하기 위해 설치부터 시작한다.
각 OS 별로 설치 방법이 다르니, 홈페이지에서 맞는 방식을 선택해서 다운로드해서 설치한다.
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html
설치 후 아래 명령어를 입력 해서 정상적으로 설치되었느지 체크할 수 있다.
PS C:\> aws --version
aws-cli/2.11.25 Python/3.11.3 Windows/10 exe/AMD64 prompt/off
정상적으로 설치되었다면, S3에 접속권한을 얻기 위해 Configuration 설정을 해야한다.
다음은 홈페이지에서 설정 방법을 그대로 가져왔다.
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: ENTER
현재 S3 가 만들어진 리전을 입력하고 아까 발급받은 액세스 키와 비밀 액세스 키를 입력한다.
이러면 윈도우 기준으로 USER > "사용자명" > .aws 아래에 credentials 파일이 생성된다.
이렇게 설정되면 AWS CLI로 내가 설정한 AWS 어플리케이션들에 접근이 가능해진다.
스프링부트에서 AWS CLI로 S3에 접근하는 방법은 그냥 커맨드라인 명령어를 스프링에서 실행해 주는 것이다.
public boolean uploadFileToS3(String filePathAndName, String targetPath) {
try {
String command = String.format("aws s3 cp %s %s", filePathAndName, uploadUrl + targetPath);
Process process = Runtime.getRuntime().exec(command);
process.waitFor();
int exitCode = process.exitValue();
return exitCode == 0;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
하지만 AWS CLI를 사용할 때 주의해야 할 점은 커맨드라인에서 실행하는 방법이기 때문에
AWS CLI가 시스템에 반드시 정상적으로 설치되어 있어야 한다.
그리고 AWS CLI가 업데이트되거나 변경될 때 혹은 OS의 설정이 변경 됐을 때, 호환성 문제가 발생할 수 있다.
또한, 이 방식은 외부 프로세스를 호출하므로 속도와 안정성 면에서 AWS SDK를 사용하는 방식이 권장된다.
AWS S3 SDK 이용하기
먼저 build.gradle에 의존성을 추가한다.
implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.1000')
implementation 'com.amazonaws:aws-java-sdk-s3'
S3에 접속하기 위해서, AWS Client의 Configuration 설정이 필요하다.
아래와 같이 액세스 키와 S3 리전을 입력한다.
@Configuration
public class S3Config {
private final String accesKey = "[액세스키]";
private final String secretKey = "[비밀 액세스키]";
private final String region = "[S3 리전]";
@Bean
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials credentials = new BasicAWSCredentials(accesKey,secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(credentials)).build();
}
}
S3Client를 서비스 내에 설정하고, putObject 매서드를 가져다 쓰면 된다.
저장 경로는 PutObjectRequest 객체에 설정한다.
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, fileName, uploadFile);
amazonS3Client.putObject(putObjectRequest);
여기서 주의할 점은 PutObjectRequest의 key가 파일 명을 포함해, s3 내의 풀 경로가 들어가야한다는 점이다.
예를 들어, 버킷 내에 temp 폴더가 있고 파일명이 hello.txt라면,
key는 temp/hello.txt가 되어야한다는 것이다.
추가적으로, 파일을 업로드하면서 업로드된 파일의 권한을 설정할 수 있다.
amazonS3Client.putObject(putObjectRequest.withCannedAcl(CannedAccessControlList.BucketOwnerFullControl));
이를 ACL(Access Control List)이라고하는데, 아래와 같은 권한들이 있다.
마치며
결론은 하드코딩을 줄이고, 의존성을 줄이기 위해 S3 SDK를 쓰자이다.
사실 AWS SDK를 설치하면서 굉장히 많은 삽질을 했다.
S3용 SDK와 스프링 클라우드에서 제공하는 AWS 통합 SDK가 따로 있는데, 후자는 추가적으로 설정해야될 부분들이 있다.
이 내용은 추후에 다루도록 하겠다.
'개발 > AWS' 카테고리의 다른 글
스프링부트에서 AWS SQS SDK 2.0 사용하기 (0) | 2023.08.07 |
---|---|
Windows에서 AWS 인증키 생성하고 저장하기 (0) | 2023.08.07 |
스프링부트에서 AWS S3 SDK 2.x 버전 사용하기 (0) | 2023.06.17 |
스프링부트에서 AWS S3 의존성을 Spring cloud starter로 설정했을 때 생기는 문제 (0) | 2023.06.07 |
AWS EC2에서 JAVA 서버 백그라운드 프로세스 실행 (0) | 2023.02.06 |
- Total
- Today
- Yesterday
- 오블완
- serverless
- AWS
- CloudFront
- elasticsearch
- AOP
- cache
- Kotlin
- S3
- JWT
- AWS EC2
- 후쿠오카
- ChatGPT
- EKS
- Spring
- GIT
- Log
- lambda
- docker
- java
- OpenFeign
- MySQL
- openAI API
- terraform
- OpenAI
- Elastic cloud
- 스프링부트
- 티스토리챌린지
- springboot
- 람다
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |