Post

TIL(20240720) [AWS S3]

TIL(20240720) [AWS S3]

정말 생각이 많아진 요즘이다. 이제는 내가 어떤 공부를 할 것이며, 내가 가고싶은 회사에서 요구하는 기술스택이 무엇인지 어떤 사람을 필요로 하는지에 대한 생각이 필요한 것 같다.

최종프로젝트가 시작되었고 내가 이때까지 공부한 것들을 어떻게 잘 녹여낼 수 있는지에서도 생각해보자.

이번 프로젝트를 통해서 내가 꼭 도전하고 싶었던 것
1) S3를 이용한 이미지 업로드기능 2) QueryDSL을 이용해서 동적쿼리 사용 3) OAuth로그인 4) 백오피스API 5) 자바스크립트 6) CI/CD

역할 분배에 따라서 달라지겠지만, 내가 할 수 있는 최선을 다해 해보려고 한다.

💡 AWS S3 버킷생성

S3가 무엇인지 아래 Amazon 공식문서와 블로그를 활용하여 알아보았다.

1) AWS S3 특징

  • 제공하는 단순한 웹 서비스 인터페이스를 사용하여 웹에서 언제 어디서나 원하는 양의 데이터를 저장하고 검색할 수 있다.
  • 개발자는 Amazon이 자체 웹 사이트의 글로벌 네트워크 운영에 사용하는 것과 같은 높은 확장성과 신뢰성을 갖춘 빠르고 경제적인 데이터 스토리지 인프라에 액세스할 수 있다.
  • 단독 스토리지로도 사용할 수 있으며 EC2, EBS, Glacier와 같은 다른 AWS 서비스와도 함께 사용할 수 있어 클라우드 어플리케이션, 컨텐츠 배포, 백업 및 아카이빙, 재해 복구 및 빅데이터 분석을 포함한 다양한 사례에 알맞다.
  • S3의 버킷은 무한대의 객체를 저장할 수 있으므로 스토리지의 요구를 미리 추정하여 관리할 필요가 없어 확장/축소에 신경쓰지 않아도 된다.
  • HTTPS 프로토콜을 사용하여 SSL로 암호화된 엔드포인트를 통해 데이터를 안전하게 업로드/다운로드 할 수 있으며 상주 데이터를 자동으로 암호화 하고 AWS KMS를 통해 S3에서 사용자를 위해 키를 관리하게 하는 방법과 고유한 키를 제공하는 방법 중에서 키 관리 방법을 선택할 수 있는 기능을 제공한다.
  • 사용한 스토리지 만큼 요금이 청구되며 데이터 전송부분에서는 해당 리전 내에서는 데이터 송수신은 무료(다른 AWS 리전으로는 무료가 아니다!)이고 S3에서 인터넷으로 데이터를 송수신 시에도 가격이 매우 저렴하다.

2) AWS S3 기본 개념

  • 객체(Object)S3에 데이터가 저장되는 기본 단위로써 파일과 메타데이터로 이루어져있다. 객체 하나의 크기는 1Byte부터 5TB까지 허용되며 메타데이터는 MIME 형식으로 파일 확장자를 통해 자동으로 설정되며 사용자 임의로도 지정 가능하다.

  • 버킷(Bucket)S3에서 생성할 수 있는 최상위 디렉토리의 개념으로 이름은 S3 리전 중에서 유일해야 한다. 계정별로 100개까지 생성 가능하며 버킷에 저장할 수 있는 객체수와 용량은 무제한이다.

  • 표준스토리지S3 서비스 수준 계약으로 객체에 대해 99.999999999%의 내구성을 보장하며 99.99%의 가용성을 제공한다. 하지만 높은 내구성을 보장해야 하는 만큼 비용이 높으므로 유실되면 안되는 원본 데이터, 민감정보, 개인정보 등의 중요한 데이터를 저장하는 것이 알맞다.
  • RRS(Reduced Redundancy Storage) 표준 스토리지보다 저렴한 비용으로 데이터를 저장할 수 있다. RRS 옵션은 여러 시설 전반에 다양한 디바이스에 객체를 저장하며 일반 디스크 드라이브의 400배에 달하는 내구성을 제공하나 표준 스토리지 만큼 많이 객체를 복제하지는 않으므로 원본을 복제한 데이터나 가공한 데이터(예를 들어 썸네일 같은)의 저장에 알맞다.

Amazon S3

S3 간단한 실습

자료를 여러가지 찾아보다가.. spring boot에서 s3에 파일을 업로드하는 방법이 3가지가 있다는 것을 알게되었다.

1) Stream 업로드 2) MultipartFile 업로드 3) AWS Multipart 업로드

의존성 추가

1
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

application.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#access key
cloud.aws.credentials.accessKey=ACCESS_KEY

#secret key
cloud.aws.credentials.secretKey=SECRET_KEY

#버킷 이름
cloud.aws.s3.bucketName=BUCKET_NAME

#리전
cloud.aws.region.static=ap-northeast-2

#cloud formation 기능을 사용하지 않기 위함.
cloud.aws.stack.auto=false

config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Configuration
public class S3Config {
    @Value("cloud.aws.credentials.accessKey")
    private String accessKey;
    @Value("cloud.aws.credentials.secretKey")
    private String secretKey;
    @Value("cloud.aws.s3.bucketName")
    private String bucketName;
    @Value("cloud.aws.region.static")
    private String region;

    @Bean
    public AmazonS3 s3Builder() {
        AWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey);

        return AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
                .withRegion(region).build();
    }
}

파일업로드를 위해선 AmazonS3의 putObject 메서드를 사용해야한다.

image

putObjectRequest도 생성하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
public PutObjectRequest(String bucketName, String key, File file) {
    super(bucketName, key, file);
}

public PutObjectRequest(String bucketName, String key, String redirectLocation) {
    super(bucketName, key, redirectLocation);
}

public PutObjectRequest(String bucketName, String key, InputStream input,
        ObjectMetadata metadata) {
    super(bucketName, key, input, metadata);
}
  • bucketName : 객체를 올릴 버킷 이름
  • key : 파일명
  • input : InputStream
  • metadata : 메타데이터

실습예제

비지니스로직을 적용한 실습

이미지 업로드 비지니스 로직 참고자료

This post is licensed under CC BY 4.0 by the author.