지난번에 작성한 AWS lambda 글에서는 S3와 Lambda function을 연결하는 내용을 다뤘었다.
그때 글에서 언급했다시피, 프로젝트의 궁극적 목표는 안드로이드와의 연결인데,
S3 트리거를 활용한 람다 함수가 원활하게 돌아가도록 하려면, 안드로이드에서 S3 버켓으로 텍스트 파일이 업로드되도록 해야한다.
AWS에서는 안드로이드와 S3 스토리지 서비스를 손쉽게 연결하도록 도와주는 서비스가 또 존재하는데 바로 AWS Amplify다.
커맨드창에서 간단하게 amplify 설정 및 타 서비스와의 연결을 할 수 있으며, 안드로이드에서 라이브러리를 추가해주면 업로드/다운로드와 같은 기능을 쉽게 구현할 수 있다.
amplify 시리즈에서는 안드로이드와 amplify를 연결하는 과정과, 그 과정에서 겪은 어려움을 기록해보려고 한다.
1. amplify 시작하기
cli 창을 통해 amplify 서비스를 시작하는 부분이다.
아래 글들을 참고했다.
amplify의 안드로이드 라이브러리에 관한 내용은 (대부분) 공식문서에서 친절하게 알려주고 있으므로 기본은 공식문서를 따라 세팅하고, 코드를 작성해주면 된다.
amplify 프로젝트 생성의 경우 두번째 글을 보고 따라했다.
글에서 작성자분이 친절하게 설명해주시므로 해당 글을 따라 프로젝트를 시작하면 된다.
2. 안드로이드와 Storage 서비스 연결하기
마찬가지로 공식문서에 스토리지를 연결하는 방법이 나와있다.
다만 위의 글에서 알려주는 방법인 amplify add는 새로운 버켓을 cli창을 통해 만들고, 그 버켓과 안드로이드를 연결하는 것이다.
이미 존재하는 버켓과 연결하고 싶을 때에는 add 대신 import를 사용하면 된다.
아래 글을 참고하자
만약 amplify와 연결되어있는 버켓을 도중에 변경했다면, json 파일을 꼭 확인해주어야 한다.
main/res/raw 디렉토리에 보면 json파일이 두개 있는데, 버켓명에 내가 연결하려는 버켓 이름이 있는지 꼭 확인해야 한다.
//amplifyconfiguration.json
"S3TransferUtility": {
"Default": {
"Bucket": "버켓 이름",
"Region": "ap-northeast-2"
}
}
"storage": {
"plugins": {
"awsS3StoragePlugin": {
"bucket": "버켓 이름",
"region": "ap-northeast-2",
"defaultAccessLevel": "guest"
}
}
}
//awsconfiguration.json
"S3TransferUtility": {
"Default": {
"Bucket": "버켓 이름",
"Region": "ap-northeast-2"
}
}
이렇게 두 파일의 해당 부분을 확인하자.
region은 서울을 기준으로 설정해놓았다.
2-1. amplify를 통해 연결할 수 있는 버켓은 1개다
내 경우 aws s3에서 두개의 버켓에 연결하고 싶었고, amplify를 이용하면 그럴 수 있을줄 알았다.
하지만 공식문서는 두개의 버켓에 연결할 수 있는 방법을 어디에도 소개시켜주지 않았고..
찾아보니 amplify와 연결할 수 있는 버켓은 한개 뿐이었다.
람다와 버켓이 연결된 방식을 트리거가 아닌 다른 방법으로 변경해주어도 되겠지만, 현재 상태를 그대로 두고 하나의 버켓에만 연결해야 하는 상황이면 복제규칙을 이용하면 좋다.
복제규칙이란 말 그대로 해당 버켓에 올라온 파일을 다른 버켓으로 복제해서 업로드할 수 있도록 하는 것이다.
버켓에 들어가자마자 보이는 버켓 메뉴에서 관리를 클릭하고 아래로 조금만 내려보면
이렇게 복제규칙이 있는 것을 확인해볼 수 있다.
복제 규칙 생성을 눌렀을 때, 다른 부분은 직관적으로 해결할 수 있기 때문에 넘어가고,
IAM 역할을 연결해달라고 할 것이다.
여기서 복제에 필요한 최소한의 권한을 포함한 역할을 새로 생성해주면 되는데, 해당 권한은 아래와 같다.
모두 S3에 있는 권한들이니 해당 8개의 권한을 추가하여 IAM role을 새로 만들어주고 연결해주면 된다.
참고로 나는 이 방법을 그다지 추천하지는 않는다.
왜냐하면 하나의 버켓에서 다른 버켓으로 복제하는 데에 걸리는 시간이 꽤 길기 때문이다.
복제규칙을 많이 사용하게 될수록 유저는 더 오래 기다리게 된다.
복제규칙을 사용하게 된다면, 최대한 적게 사용할 수 있는 방법을 찾아보자.
3. cognito access 설정하기
amplify에서 storage를 연결할 때에는, 좋던 싫던 cognito를 같이 연결하게 되어있다.
위의 concept 문서에서 확인해보면 cognito를 통해 인증을 받은 후에 S3에 접근할 수 있는 구조이다.
cognito는 안드로이드를 통해 접근하는 사용자들을 식별하는 인증 서비스인데,
사용자가 안드로이드 앱에 접속하면 로그인을 하고 S3에 업로드 및 다운로드를 실행하게 하려는 경우에는 cognito를 연결하는 것이 아주 유용할 수 있다.
그러나 별도의 로그인 기능을 구현하고 싶지 않다면 어떻게 할까?
cognito를 guest access로 설정해주면 된다.
이 방법을 몰라서 공식문서대로 코드를 짜고 아주 해맸던 기억이 난다.
마찬가지로 위의 공식문서를 보고 해결해주면 된다.
설정 완료 후 amplify push해주는 것을 잊지말자.
4. access denied (403) 에러
위의 모든것들을 다 해결하고나서도 여전히 aws s3와 연결이 안될 수 있다.
access denied라고 하면서 403에러가 나는 경우가 있을텐데, 그와 같은 경우에는 아래 글을 참고하여 해결해주면 된다.
위의 글에서는 auth role에만 정책을 연결하라고 되어있지만, 3번처럼 guest access를 설정한 경우에는 unauth role에도 정책을 연결해주어야 한다.
**참고로 나는 aws policy와 보안에 대해 잘 모른다..
만약 보안상으로 중요한 프로젝트에 aws amplify를 연결하는 경우에는 본 게시물의 정책 연결을 그대로 따라하는 것은 추천하지 않는다.
iam policy를 연결할 때는 꼭 주의해서 연결하자!
5. not allowed to start service intent 에러
java.lang.IllegalStateException: Not allowed to start service Intent { act=add_transfer cmp=com.example/com.amazonaws.mobileconnectors.s3.transferutility.TransferService (has extras) }: app is in background uid UidRecord{8c313fc u0a226 TRNB idle change:uncached procs:1 seq(0,0,0)}
간혹 위와 같은 에러가 발생할 때가 있다.
나는 새로운 프로젝트를 만들어서 amplify와 연결해주었을 때 해당 오류가 났다.
그렇지만 기존에 작업하던 프로젝트에서 amplify를 연결해주었을 때는 오류가 나지 않았다.
이유는 잘 모르겠다.
아무튼 구글링을 해보니 startForegroundService메서드를 사용해주라고 하는데, 내 경우에는 관련된 퍼미션을 manifest파일에 추가해주었더니 해결되었다.
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
위 퍼미션을 manifest에 추가해주자.
5번의 과정까지 거치고 나면, 공식문서대로 코드를 작성했을 때 aws의 스토리지 서비스와의 연결에는 문제가 없을 것이다.
예제코드를 활용한 샘플 프로젝트를 깃허브에 업로드해놓았다.
예시코드: https://github.com/hujumee/awsAmplifyStorageExample.git
'AWS' 카테고리의 다른 글
AWS Lambda 개발②) S3 버켓에 새로운 txt 파일 업로드하기 (0) | 2021.08.24 |
---|---|
AWS Lambda 개발①) S3 트리거를 통한 S3 오브젝트 정보 가져오기 (+txt파일) (0) | 2021.08.19 |
Lambda 번외) serverless framework 명령어 정리 (0) | 2021.08.10 |
댓글