[Alibaba Cloud] Android 기기에서 OSS에 액세스

목적



Android 단말에서 Alibaba Cloud의 OSS(S3)에 파일을 업로드, 다운로드한다.

개발 환경



Android 7.0
Windows 10
Alibaba Cloud

Alibaba 구성



Alibaba 문서 대로 구성해 갑니다.
이번에는 App Server (응용 프로그램 서버)에 관해서는 ECS를 사용하지 않고,
· ApiGateway
· Function Compute
를 사용하여 그림

1.Request STS credentials
2.Request AsuumeRole
3.Return STS Credentials
4.Return STS Credentials

를 구현합니다.


설정



OSS 설정



Alibaba 문서
OSS 데모 소개
참조

1.OSS에서 버킷 만들기
2.STS 활성화
*AccessKeyID
*AccessKeySecret
*RoleArm
저장하는 것을 잊지 않는 것

Function Compute 설정



1. 함수 만들기

test.py
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore import client
from aliyunsdksts.request.v20150401 import AssumeRoleRequest
import json

def getSts(event, context):
  AccessKeyID = "Your AccessKey"
  AccessKeySecret = "Your SecretAccessKey"
  roleArn = "Your RoleArn"
  clt = client.AcsClient(AccessKeyID,AccessKeySecret,'ap-northeast-1')
  request = AssumeRoleRequest.AssumeRoleRequest()
  request.set_RoleArn(roleArn)
  request.set_RoleSessionName('external-username')
  try:
    response = clt.do_action_with_exception(request)
    text = json.loads(response)
    stsDict = {}
    stsDict["StatusCode"] = "200"
    stsDict["body"] = {}
    stsDict["body"] = text["Credentials"]
    stsDict["body"]["StatusCode"] = stsDict["StatusCode"]
  except Exception as e:
    errorDict = dict().fromkeys(['StatusCode','ErrorCode','ErrorMessage'])
    errorDict["StatusCode"] = "500"
    errorDict["ErrorMessage"] = e.message
    errorDict["ErrorCode"] = e.error_code
    stsText = json.dumps(errorDict)
  return stsDict
  pass

여기 왜, 출력하는 JSON은 body 안에 기술하지 않으면
Android의 SDK에서는 값을 얻을 수 없었기 때문에 주의가 필요.
(왜 json에서 body 선언이 필요한지 이해하지 못합니다)

ApiGateway 설정



기본 요청



Path: 선택
프로토콜: HTTP
HTTP Method : GET
요청 모드 : 요청 매개 변수 매핑

백엔드 서비스 정보



백엔드 서비스 유형: FunctionCompute
리전: FunctionCompute가 설정된 리전
서비스 이름: FunctionCompute에서 설정한 서비스 이름
함수 이름: FunctionCompute에서 설정한 함수 이름
Role Arn: STS를 활성화할 때 저장한 RoleArn

반환되는 응답



반환되는 유형: JSON (application/json; charset=utf-8)

Android 측 설정



Alibaba 문서
OSS 데모 소개
안드로이드 소스 코드를 참고로했습니다.

버튼을 레이아웃에 하나만 추가합니다.

MainActiviy.kt
class MainActivity : AppCompatActivity() {

    val endPoint = "OSS のエンドポイント"
    val stsServer = "API のエンドポイント"

    fun getOSSCredentialProvider() : OSSCredentialProvider {
        return OSSAuthCredentialsProvider(stsServer)
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            val oss = getOSSClient(getOSSCredentialProvider())

            val get = GetObjectRequest("OSSのバケット名", "取得したいファイル名")
            oss.asyncGetObject(get, object : OSSCompletedCallback<GetObjectRequest, GetObjectResult>{
                override fun onSuccess(request: GetObjectRequest?, result: GetObjectResult?) {
                    Log.d("MainActivity", "success")
                }

                override fun onFailure(
                    request: GetObjectRequest?,
                    clientException: ClientException?,
                    serviceException: ServiceException?
                ) {
                    Log.d("MainActivity", "end")
                }
            })
        }
    }
}

※API Gateway의 엔드포인트는 서브도메인에 패스를 추가


※S3의 엔드 포인트


Logcat에서

2018-12-14 18:08:25.755 2652-3947/net.zaisan.alibabaosssamle D/MainActivity: success

제대로 취득할 수 있는 것을 확인할 수 있었다☆
PUT 또는 Delete 할 수 있는 환경의 베이스가 생겼으므로,
이것을 응용해 가고 싶다.

요약



API Gateway와 ComputeFunction을 사용하여 STS 인증으로 OSS를 제어할 수 있었다.
ECS를 사용하지 않는 것으로, 서버리스로 간단하게 구축할 수 있는 것은 좋다고 생각한다.

좋은 웹페이지 즐겨찾기