0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Alibaba CloudAdvent Calendar 2018

Day 15

[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デモの紹介]
(https://jp.alibabacloud.com/help/doc-detail/31941.htm?spm=a21mg.p38356.b99.100.33ed6d34ruoWh3)
を参照して

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デモの紹介]
(https://jp.alibabacloud.com/help/doc-detail/31941.htm?spm=a21mg.p38356.b99.100.33ed6d34ruoWh3)
の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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?