Jay's Developer Note

[Android] AWS S3 Upload 하기(Util 소스 코드 有) 본문

Android

[Android] AWS S3 Upload 하기(Util 소스 코드 有)

Jay(J) 2022. 5. 30. 15:55
728x90

AWS S3 Upload 하기

프로젝트 진행 중에 클라이언트에서 주기적으로 AWS S3 에 파일을 올려야 하는 상황이 생겼다.

그래서 Util 을 만들었고 기록용으로 글을 작성하려 한다. 나중에 git 화 해야겠다.

소스코드는 공개해놨으니 가져가서 입맛대로 사용하시길 바란다.

 

AWS S3 를 사용하려면 2개의 선행 작업이 필요하다.

 

1. IAM 생성
2. S3 Bucket 생성

 

S3 Bucket 은 프로그래밍으로 동적 생성할 수도 있지만, 클라이언트에서 생성하고 관리하는 컨셉이 아니기 때문에 생성된 버켓에 올리는 프로세스로 진행했다.

 

AWS 설정
IAM 생성

AWS Console 에서 IAM 으로 들어가서 Add User 를 진행한다.

 

Type 을 Access key Type 으로 선택해야 한다.

 

 

권한은 S3 를 검색하고 FullAccess 권한을 부여한다.

3, 4 스텝은 Optional 이라 설정해도 되고 안 해도 무방하다.

 

 

완료가 되면 Key 가 발급되는데 꼭 csv 를 다운로드해서 보관해야 한다. Secret Key 는 다시 안 알려준다..

 

S3 Bucket 생성

원하는 이름과 원하는 지역을 선택하고 생성한다.

별다른 설정은 필요 없다.

 

 

Android 설정

Dependency 추가(app 단의 build.gradle)

implementation 'com.amazonaws:aws-android-sdk-s3:2.13.5'

S3Util 소스코드

import android.content.Context;
import android.text.TextUtils;

import androidx.annotation.Nullable;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferNetworkLossHandler;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver;
import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3Client;

import java.io.File;

/**
 * 2022. 05. 24.
 *
 * @author jbchoi
 */
public class S3Util {

    private String accessKey = "";  // IAM AccessKey
    private String secretKey = "";  // IAM SecretKey
    private Region region;          // S3 Region

    /**
     * 생성자 생성 시 초기 Region 설정 : AP_NORTHEAST_2
     */
    public S3Util() {
        region = Region.getRegion(Regions.AP_NORTHEAST_2);
    }

    /**
     * Overloading
     */
    public void uploadWithTransferUtility(
            Context context,
            String bucketName, File file,
            TransferListener listener
    ) {
        this.uploadWithTransferUtility(
                context,
                bucketName, null, file, null,
                listener
        );
    }

    /**
     * Overloading
     */
    public void uploadWithTransferUtility(
            Context context,
            String bucketName, String folder, File file,
            TransferListener listener
    ) {
        this.uploadWithTransferUtility(
                context,
                bucketName, folder, file, null,
                listener
        );
    }

    /**
     * S3 파일 업로드
     *
     * @param context    Context
     * @param bucketName S3 버킷 이름(/(슬래쉬) 없이)
     * @param folder     버킷 내 폴더 경로(/(슬래쉬) 맨 앞, 맨 뒤 없이)
     * @param fileName   파일 이름
     * @param file       Local 파일 경로
     * @param listener   AWS S3 TransferListener
     */
    public void uploadWithTransferUtility(
            Context context,
            String bucketName, @Nullable String folder,
            File file, @Nullable String fileName,
            TransferListener listener
    ) {
        if (TextUtils.isEmpty(accessKey) || TextUtils.isEmpty(secretKey)) {
            throw new IllegalArgumentException(
                    "AccessKey & SecretKey must be not null"
            );
        }

        AWSCredentials awsCredentials = new BasicAWSCredentials(
                accessKey, secretKey
        );

        AmazonS3Client s3Client = new AmazonS3Client(
                awsCredentials, region
        );

        TransferUtility transferUtility = TransferUtility.builder()
                .s3Client(s3Client)
                .context(context)
                .build();

        TransferNetworkLossHandler.getInstance(context);

        TransferObserver uploadObserver = transferUtility.upload(
                (TextUtils.isEmpty(folder))
                        ? bucketName
                        : bucketName + "/" + folder,
                (TextUtils.isEmpty(fileName))
                        ? file.getName()
                        : fileName,
                file
        );

        uploadObserver.setTransferListener(listener);

    }

    /**
     * Access, Secret Key 설정
     */
    public S3Util setKeys(String accessKey, String secretKey) {
        this.accessKey = accessKey;
        this.secretKey = secretKey;
        return this;
    }

    /**
     * Access Key 설정
     */
    public S3Util setAccessKey(String accessKey) {
        this.accessKey = accessKey;
        return this;
    }

    /**
     * Secret Key 설정
     */
    public S3Util setSecretKey(String secretKey) {
        this.secretKey = secretKey;
        return this;
    }

    /**
     * Region Enum 으로 Region 설정
     */
    public S3Util setRegion(Regions regionName) {
        this.region = Region.getRegion(regionName);
        return this;
    }

    /**
     * Region Class 로 Region 설정
     */
    public S3Util setRegion(Region region) {
        this.region = region;
        return this;
    }

    /**
     * Singleton Pattern
     */
    public static S3Util getInstance() {
        return LHolder.instance;
    }

    private static class LHolder {
        private static final S3Util instance = new S3Util();
    }

}

 

사용법

S3Util.getInstance()
      .setKeys("accessKey", "secretKey")
      .setRegion(Regions.AP_NORTHEAST_2)
      .uploadWithTransferUtility(
          this,
          "bucketName",
          "folderName",
          file,
          new TransferListener() {
              ...
          }
      );

 

728x90