Spring Boot 애플리케이션을 사용하여 AWS S3와 상호 작용

개체(파일, 이미지..)를 저장하는 경우 선택할 수 있는 여러 옵션이 있습니다. 파일을 응용 프로그램의 서버와 같거나 다른 서버에 보관하거나 데이터베이스에 BLOB로 보관하거나 DB의 레코드로 경로를 유지해야 합니까? 확장성, 유지 관리, 탄력성, 분리 등은 어떻습니까?

스토리지와 같은 클라우드 컴퓨팅 서비스의 인기가 높아짐에 따라 다행스럽게도 더 이상 이 모든 것에 대해 걱정할 필요가 없습니다. AWS Simple Storage Service(S3)는 데이터 스토리지 문제를 해결하는 데 사용할 수 있는 널리 사용되는 서비스 중 하나입니다.

AWS S3 소개:

Amazon S3(Simple Storage Service)는 데이터 및 애플리케이션 프로그램의 온라인 백업 및 보관을 위해 설계된 확장 가능한 고속 저비용 웹 기반 서비스입니다. 최대 5TB 크기의 모든 유형의 파일을 업로드, 저장 및 다운로드할 수 있습니다. 구독자는 데이터의 액세스 가능성, 즉 비공개/공개 액세스를 제어할 수 있습니다.

AWS는 객체를 프로그래밍 방식으로 관리하기 위한 SDK를 제공합니다. 시작하는 단계를 살펴보겠습니다.
  • 가장 먼저 필요한 것은 AWS 계정입니다.
  • AWS 스토리지 API를 사용하여 스토리지에 대한 액세스 권한을 얻기 위한 액세스 키. AWS 루트 계정 또는 IAM 사용자 계정의 액세스 키를 사용할 수 있습니다. 이 키를 사용할 수 있는 위치를 보려면 아래 이미지를 확인하십시오.
  • 보안 자격 증명으로 이동하고 액세스 키 생성을 클릭합니다.






  • 지금은 S3를 검색하고 모든 기본값으로 버킷을 생성합니다.


  • 데이터를 저장할 AWS S3 리전을 선택해야 합니다. 리전이 AWS 청구서에 영향을 미친다는 점에 유의하십시오. 자세한 내용은 사용할 수 있습니다here.

  • 이것으로 AWS S3 버킷에 대한 설정이 충분합니다. 이 기사의 Spring 부트 부분으로 이동하여 일부 코딩을 직접 해봅시다.


    Spring Initiliazr 플러그인 및 Maven을 빌드 도구로 사용하여 이 프로젝트에 IntelliJ IDEA를 사용할 것입니다.
  • 새 프로젝트를 만들고 Generators 섹션에서 "Spring Initiliazr"를 선택합니다.


  • 필요에 따라 프로젝트 속성을 지정하고 프로젝트를 만듭니다.


  • pom.xml에 AWS S3 SDK 종속성을 추가합니다. 이 프로젝트에 필요한 다른 종속성은 거의 없습니다. GitHub 리포지토리 링크는 이 문서의 끝에서 공유됩니다.

  • <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-s3</artifactId>
        <version>1.12.239</version>
    </dependency>
    


  • 리소스 폴더 아래의 application.properties에 아래 매개 변수를 추가합니다.


  • 이것을 세 부분으로 나눌 것입니다.
  • 다음을 담당할 구성 클래스
    AWS S3 클라이언트로 애플리케이션을 인증합니다.
  • S3 버킷과의 상호 작용을 담당하는 서비스 클래스입니다.
  • 파일 작업을 수행하기 위한 API를 포함하는 컨트롤러 클래스입니다.

  • 구성 등급:

    package com.springbootstorage.awss3.configuration;
    
    import com.amazonaws.auth.AWSStaticCredentialsProvider;
    import com.amazonaws.auth.BasicAWSCredentials;
    import com.amazonaws.services.s3.AmazonS3;
    import com.amazonaws.services.s3.AmazonS3ClientBuilder;
    import lombok.Getter;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class S3ClientConfiguration {
    
        @Value("${access.key.id}")
        @Getter
        private String accessKeyId;
    
        @Value("${access.key.secret}")
        @Getter
        private String accessKeSecret;
    
        @Value("${s3.region.name}")
        @Getter
        private String bucketRegion;
    
        @Bean
        public AmazonS3 getAwsS3Client() {
            BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKeyId, accessKeSecret);
            return AmazonS3ClientBuilder
                    .standard()
                    .withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
                    .withRegion(bucketRegion)
                    .build();
        }
    }
    
    


    서비스 클래스:

    package com.springbootstorage.awss3.service;
    
    import com.amazonaws.services.s3.AmazonS3;
    import com.amazonaws.services.s3.model.*;
    import lombok.Data;
    import org.apache.commons.io.FileUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    @Data
    @Service
    public class S3FileService {
    
        @Value("${s3.bucket.name}")
        private String s3BucketName;
        private final String DOWNLOAD_PATH = "D:\\S3Download\\";
        private final String UPLOAD_PATH = "E:\\";
    
        @Autowired
        private AmazonS3 amazonS3;
    
        // List all objects in the bucket
        public List<String> listAllObjects(String s3BucketName) {
    
            List<String> listOfObjects = new ArrayList<>();
    
            ObjectListing objectListing = amazonS3.listObjects(s3BucketName);
            for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                listOfObjects.add("FileName: " + objectSummary.getKey() +
                        " | " + "LastModified: " + objectSummary.getLastModified() +
                        " | " + "Size: " + objectSummary.getSize());
            }
    
            return listOfObjects;
        }
    
        // Downloading object from the bucket
        public String downloadObject(String s3BucketName, String objectName) {
            S3Object s3Object = amazonS3.getObject(s3BucketName, objectName);
            S3ObjectInputStream inputStream = s3Object.getObjectContent();
            try {
                FileUtils.copyInputStreamToFile(inputStream, new File( DOWNLOAD_PATH + objectName));
                return DOWNLOAD_PATH + objectName +  " Downloaded Successfully!";
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
        // Upload object to the bucket
        public PutObjectResult uploadObject(String s3BucketName, String objectName, File objectToUpload) {
            return amazonS3.putObject(s3BucketName, objectName, objectToUpload);
        }
    
        public void deleteObject(String bucketName, String objectName) {
            amazonS3.deleteObject(bucketName, objectName);
        }
    }
    


    컨트롤러 클래스:

    package com.springbootstorage.awss3.controller;
    
    import com.amazonaws.services.s3.model.PutObjectResult;
    import com.springbootstorage.awss3.service.S3FileService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.io.File;
    import java.util.List;
    
    @RestController
    @RequestMapping("/api/v1")
    public class S3Controller {
    
        @Autowired
        private S3FileService s3FileService;
    
        // List all files in the bucket
        @GetMapping("/listAllFiles")
        public String listAllFilesInBucket() {
            List<String> files = s3FileService.listAllObjects(s3FileService.getS3BucketName());
            StringBuilder allFiles = new StringBuilder();
            allFiles.append("****************************************\n");
            allFiles.append("List of Files available in bucket ").append(s3FileService.getS3BucketName());
            allFiles.append("\n****************************************\n");
            for (String filename : files)
                allFiles.append(files).append("\n");
            return allFiles.toString();
        }
    
        @PostMapping("/upload/{fileToUpload}")
        public PutObjectResult uploadFiletoBucket(@PathVariable String fileToUpload) {
            return s3FileService.uploadObject(s3FileService.getS3BucketName(), fileToUpload, new File(s3FileService.getUPLOAD_PATH()+ fileToUpload));
        }
    
        @PostMapping("/download/{fileToDownload}")
        public String downloadFileFromBucket(@PathVariable String fileToDownload) {
            return s3FileService.downloadObject(s3FileService.getS3BucketName(), fileToDownload);
        }
    
        @PostMapping("/delete/{fileToDelete}")
        public String deleteFileFromBucket(@PathVariable String fileToDelete) {
            s3FileService.deleteObject(s3FileService.getS3BucketName(), fileToDelete);
            return fileToDelete + " has been deleted successfully from " + s3FileService.getS3BucketName();
        }
    }
    


    이제 Spring 부트 애플리케이션을 시작하고 S3 버킷에서 객체를 나열, 업로드, 다운로드 및 삭제하기 위해 이 API를 테스트해 보겠습니다.

    이러한 작업을 수행하기 위한 엔드포인트는 4개 미만입니다.

    http://localhost:9090/api/v1/listAllFiles
    http://localhost:9090/api/v1/upload/
    http://localhost:9090/api/v1/download/
    http://localhost:9090/api/v1/delete/
    


  • 객체를 S3 버킷에 업로드합니다.

  • curl -XPOST http://localhost:9090/api/v1/upload/sample1.jpg
    curl -XPOST http://localhost:9090/api/v1/upload/sample2.jpg
    curl -XPOST http://localhost:9090/api/v1/upload/employees.json
    



  • 버킷의 객체를 나열합니다.
  • curl http://localhost:9090/api/v1/listAllFiles



  • 버킷에서 객체를 다운로드합니다.
  • curl -XPOST http://localhost:9090/api/v1/download/employees.json

  • 버킷에서 객체를 삭제합니다.
  • curl -XPOST http://localhost:9090/api/v1/delete/employees.json




    프로그래밍 방식으로 버킷 생성/삭제를 관리할 수도 있습니다. 이에 대한 더 많은 예를 확인하십시오link.

    아래 주어진 GitHub 리포지토리에서 이 프로젝트의 코드를 찾을 수 있습니다.

    https://github.com/devanandukalkar/SpringBootAwsS3

    그게 다야. 즐겁게 읽으셨기를 바랍니다. 계속 배우도록!! 건배!

    좋은 웹페이지 즐겨찾기