#目的
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デモの紹介]
(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.関数を作成
#!/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に一つだけ追加してします。
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のエンドポイントはサブドメインにパスを追加
Logcatで
2018-12-14 18:08:25.755 2652-3947/net.zaisan.alibabaosssamle D/MainActivity: success
きちんと取得できてることを確認できた☆
PUTしたりDeleteしたりすることができる環境のベースができたので、
これを応用していきたい。
#まとめ
API GatewayとComputeFunctionを使うことでSTS認証にてOSSをコントロールすることができた。
ECSを使わないことで、サーバーレスにて簡単に構築できるのはよいと思う。