본문 바로가기

Study/AWS

안드로이드에서 AWS S3 버킷으로 사진 업로드하기

728x90

 

 

안드로이드 앱으로 Rekognition을 사용하기 위해서 카메라로 촬영한 사진을 S3에 업로드 해야 할 일이 생겼다

나중에 내가 참고하려고 정리하는 글!!

 


 

 

먼저 IAM과 S3 버킷이 만들어져 있어야 함!

이전 포스트 참고

https://hemon.tistory.com/73?category=1289659 

 

AWS Rekognition 사용하기(IAM 생성, 버킷 만들기)

먼저 I AM 계정을 생성해보겠다 I AM 검색 IAM 서비스 - 사용자 - 사용자 추가 원하는 사용자 이름을 입력하고 암호를 설정해준다. 비밀번호 재설정 체크 해제 후 다음으로 넘어간다. 아직 그룹이 없

hemon.tistory.com

 

 

 

 

 

 

 

1. Cognito 자격 증명 풀 생성하기

Amazon Cognito에 들어가면 이런 화면이 나오는데 여기서 [자격 증명 풀 관리]를 눌러준다

Cognito > 자격 증명 풀 관리

 

 

자격 증명 풀을 처음 만드는 사람이면 이런 화면이 뜰 것이다

원하는 이름을 입력하고 우리 앱은 로그인 기능이 없기 때문에 인증되지 않은 자격 증명에 대한 액세스를 활성화 시켰다

 

 

 

여기서 보면 Auth와 Unauth 역할이 두개 생성되는 것을 알 수 있다. 다음으로 넘어가자

 

 

 

 

여기 보이는 자격 증명 얻기에 있는 코드를 실제로 입력할 것이다

(따로 적어놓을 필요는 없음)

// Amazon Cognito 인증 공급자를 초기화합니다
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
    getApplicationContext(),
    "ap-northeast-2:~", // 자격 증명 풀 ID
    Regions.AP_NORTHEAST_2 // 리전
);

이렇게 Cognito 생성은 끝났다!

 

 


 

2. S3 접근 권한 주기

이제 위에서 생성된 역할에 S3 접근 권한을 부여해줄 것이다

 

IAM > 역할로 들어가면 이렇게 아까 생성된 역할들이 얌전히 기다리고 있다

우린 인증되지 않은 사용자로 사용할 거니까 Unauth를 수정!

 

 

 

Unauth_Role로 들어가서 인라인 정책을 생성해줄 것이다

 

 

 

서비스 : S3

읽기 : GetObject

쓰기 : PutObject

우리는 사진을 읽고 쓰고 다 할 거니까 둘 다 추가해주었다

 

 

 

리소스 > 특정 > ARN 추가

우리가 사용할 버킷에 대한 ARN을 추가해준다. (특정 버킷, 모든 파일)

 

 

 

나머지는 그대로 두고 정책 검토로 넘어간다!

 

 

 

 

이제 정책 이름을 입력하고 요약을 보고 잘 됐는지 검토하면 끝~~

 

 

 

 

그럼 이렇게 역할에 권한 부여가 끝난다!

 

 


 

3. 안드로이드 스튜디오 설정 및 코드

먼저 build.gradle파일 dependency에 세가지를 추가해준다

(추가하고 Sync Now 꼭 누르기!!)

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

 

 

다음은 Manifest파일에서 퍼미션을 준다

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

 

그리고 서비스도 추가해줘야 함!

<service android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
                 android:enabled="true" />

 

 

 

마지막으로 코드를 작성해주면 끝!

File img;

AmazonS3 s3;
TransferUtility transferUtility;

CognitoCachingCredentialsProvider credentialsProvider;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rekog);
        
        // Amazon Cognito 인증 공급자 초기화
        credentialsProvider = new CognitoCachingCredentialsProvider(
                getApplicationContext(),
                "ap-northeast-2:~", // 자격 증명 풀 ID
                Regions.AP_NORTHEAST_2 // 리전
        );

        s3 = new AmazonS3Client(credentialsProvider);
        transferUtility = new TransferUtility(s3, getApplicationContext());

        s3.setRegion(Region.getRegion(Regions.AP_NORTHEAST_2));
        s3.setEndpoint("s3.ap-northeast-2.amazonaws.com");
}

(여기서 img는 앱에서 촬영한 이미지이다)

 

 

 

public void upload() {

        String imgName = "uploadImg";

        SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putString("curImg", imgName);
        editor.commit();
        if (img == null) {
            Log.i("ERROR", "The file is empty");
        } else {
            TransferObserver observer = transferUtility.upload(
                    "cloud-test-hyun",     // The bucket to upload to
                    "upload_test.jpg",    // The key for the uploaded object
                    img,
                    CannedAccessControlList.PublicRead
            );
            observer.setTransferListener(new TransferListener() {
                public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
                    Log.i(TAG, "progress changed");
                }

                public void onStateChanged(int id, TransferState state) {
                    if (state == TransferState.COMPLETED) {
                        Log.i(TAG, "state changed");
                        DetectText();

                    }
                }

                public void onError(int id, Exception ex) {
                    Log.e("ERROR", ex.getMessage(), ex);
                }
            });
        }
    }
728x90
LIST