LoginSignup
0
0

More than 5 years have passed since last update.

[Alibaba Cloud] Android端末からOSSへアクセスする

Last updated at Posted at 2018-12-14

目的

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

を実装していきます。
1424_en-US.png

設定

OSSの設定

Alibabaドキュメント
OSSデモの紹介
を参照して

1.OSSにてバケットの作成
2.STSの有効化
*AccessKeyID
*AccessKeySecret
*RoleArm
の保存することを忘れないこと

Fuction 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デモの紹介
のAndroidソースコードを参考にさせてもらいました。

buttonをLayoutに一つだけ追加してします。

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のエンドポイントはサブドメインにパスを追加
API GATEWAY ENDPOINT.png

※S3のエンドポイント
S3 ENDPOINT.png

Logcatで

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

きちんと取得できてることを確認できた☆
PUTしたりDeleteしたりすることができる環境のベースができたので、
これを応用していきたい。

まとめ

API GatewayとComputeFunctionを使うことでSTS認証にてOSSをコントロールすることができた。
ECSを使わないことで、サーバーレスにて簡単に構築できるのはよいと思う。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0