본문 바로가기

⭐ AWS/AWS SDK

AWS SDK를 활용하여 S3에 이미지 업로드

# AWS 라이브러리를 활용하여 S3에 이미지를 저장 및 삭제하는 모듈을 만들어보자.

# 개발 환경은 InteliJ를 기반으로 한다.

- InteliJ를 실행 후 pom.xml파일에 Dependency를 추가해준다.

<dependency>
	<groupId>com.amazonaws</groupId>
	<artifactId>aws-java-sdk</artifactId>
	<version>1.10.63</version>
</dependency>

- 타임존 문제를 해결하기 위해 joda 라이브러리를 추가해준다.

<dependency>
	<groupId>joda-time</groupId> 
	<artifactId>joda-time</artifactId> 
	<version>2.4</version> 
</dependency> 

- 코드에 S3 서비스 엑세스를 위해 IAM Role을 생성하자

- S3 서비스 → 사용자 생성하기 → 프로그래밍방식 엑세스 → 기존 정책 직접연결 → S3 Full Access 정책 선택 → 사용자 만들기 → .CSV로된 키값 다운받아 보관

- 그러면 일단 S3 버킷을 생성하자, 일반 구성에 값들 설정하고 생성을 하자.

- 생성된 버킷을 확인할 수 있습니다.

- S3의 보안정책을 수정 하겠습니다. 테스트 이기 때문에 모든 옵션을 오픈 하도록 하겠습니다.

- 이제 InteliJ에서 JAVA 소스코드를 활용하여 파일을 S3 저장소에 업로드 하는 작업을 수행 하겠습니다.

- pom.xml 에 아래의 디펜던시를 추가 하십시오.

    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-core</artifactId>
            <version>1.11.256</version>
        </dependency>

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

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>

        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.4</version>
        </dependency>

    </dependencies>

- 자바 파일을 생성 후 아래 코드를 입력하여 실행 합니다.

import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.PutObjectRequest;

import java.io.File;

public class AmazonWebServiceUtil {

    private static final String BUCKET_NAME = ""; // AWS 에 설정된 버킷명
    private static final String ACCESS_KEY = ""; // AWS에 접근하기 위한 키
    private static final String SECRET_KEY = ""; // AWS에 접근하기 위한 비밀 키
    private AmazonS3 amazonS3;

    public AmazonWebServiceUtil() {
        AWSCredentials awsCredentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
        amazonS3 = new AmazonS3Client(awsCredentials);
        amazonS3.setRegion(Region.getRegion(Regions.AP_NORTHEAST_2)); // 추가된 코드
        System.out.println("객체가 이동합니다.");
    }

    public void uploadFile(File file) {
        if (amazonS3 != null) {
            try {
                PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, file.getName(), file);
                putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead); // file permission
                amazonS3.putObject(putObjectRequest); // upload file
            } catch (AmazonServiceException ase) {
                ase.printStackTrace();
            } finally {
                amazonS3 = null;
                System.out.println("객체가 이동 완료 되었습니다.");
            }
        }
    }

    public static void main(String[] args) throws Exception {
        String fileName = "d:\\파일이름.jpg"; //이동할 파일
        File tempFile = new File(fileName);
        AmazonWebServiceUtil awsService = new AmazonWebServiceUtil();
        awsService.uploadFile(tempFile);
        System.out.println("객체이동 성공");
    }
}

- 실행 : 현재 S3의 저장소에는 아무 파일도 존재 하지 않는다.

- 프로그램 실행 후

- S3 버킷 확인, 자동으로 파일이 로컬에서 S3 버킷으로 복사된것을 확인 할 수 있다.

- 위와같은 방법을 활용하여, 주기적으로 파일을 옮겨야 하는 경우나, 배치성 작업등을 수행하여 데이터를 백업하는 작업 등을 보다 원활히 수행 할 수 있다.