本文主要介绍如何基于STS服务在30分钟内快速搭建一个移动应用数据直传服务,让您的移动应用数据上传与下载直接对接OSS,仅需通过应用服务器管理控制信息,实现数据传输的高效与安全。
为什么选择直传服务
在移动互联的时代,手机App上传的数据越来越多。作为开发者,您可以利用OSS处理各种数据存储需求,从而更加专注于自己的应用逻辑。基于OSS的移动应用数据直传服务具有以下优势:
数据安全:使用灵活的权限管理机制进行数据的上传和下载,更加安全。
成本低廉:您不需要准备很多服务器。移动应用直接连接云存储OSS,只有控制流连接应用服务器。
高并发:轻松应对高并发访问,保证用户体验。
弹性扩容:存储空间随需扩展,满足业务增长需求。
数据处理:无缝集成图片处理与音视频转码功能,数据处理更灵活。
前提条件
如何进行移动应用直传
移动应用直传服务的开发流程如下:
实现步骤如下:
移动应用向业务服务器请求临时访问凭证。
说明Android和iOS应用不能直接存储AccessKey,这样会存在数据泄露的风险。因此,应用可以向用户的应用服务器申请一个STS凭证。这个STS凭证是有时效性的,如果STS凭证的过期时间是30分钟(由应用服务器指定),那么在这30分钟里,该Android、iOS应用可以使用此Token从OSS上传和下载数据,30分钟后需要重新获取STS凭证。
业务服务器使用STS SDK调用AssumeRole接口,获取临时访问凭证。
STS生成并返回临时访问凭证给业务服务器。
业务服务器返回临时访问凭证给客户端。
移动应用使用OSS SDK通过该临时访问凭证上传文件到OSS。
OSS返回成功响应给客户端。
操作步骤
本方案使用的ROS模板:mobile-application-direct-transmission-service.yml
步骤一:开通STS服务并配置应用服务器
一键部署
您可以点击一键部署通过ROS快速开通STS服务并配置应用服务器。在资源编排 ROS控制台,输入资源栈名称,设置新购ECS的可用区、实例类型、系统盘类型、实例密码。部署完成后,复制输出页签下一键部署的应用服务器地址。
手动部署
步骤1:在访问控制创建RAM用户
首先,创建一个调用方式为OpenAPI调用的RAM用户,并获取对应的访问密钥,作为业务服务器的应用程序的长期身份凭证。
使用云账号或账号管理员登录RAM控制台。
在左侧导航栏,选择身份管理 > 用户。
单击创建用户。
输入登录名称和显示名称。
在调用方式区域下,选择OpenAPI调用,然后单击确定。
单击操作下的复制,保存调用密钥(AccessKey ID和AccessKey Secret)。
步骤2:在访问控制为RAM用户授予调用AssumeRole接口的权限
创建RAM用户后,需要授予RAM用户调用STS服务的AssumeRole接口的权限,使其可以通过扮演RAM角色来获取临时身份凭证。
在左侧导航栏,选择身份管理 > 用户。
在用户页面,找到目标RAM用户,然后单击RAM用户右侧的添加权限。
在新增授权页面,选择AliyunSTSAssumeRoleAccess系统策略。
说明授予RAM用户调用STS服务AssumeRole接口的固定权限是AliyunSTSAssumeRoleAccess,与后续获取临时访问凭证以及通过临时访问凭证发起OSS请求所需权限无关。
单击确认新增授权。
步骤3:在访问控制创建RAM角色
为当前云账号创建一个RAM角色,并获取对应的角色的ARN(Aliyun Resource Name,阿里云资源名称),用于RAM用户之后进行扮演。
在左侧导航栏,选择身份管理 > 角色。
单击创建角色,可信实体类型选择阿里云账号,单击下一步。
填写角色名称,选择当前云账号。
单击完成。完成角色创建后,单击关闭。
在RAM角色管理页面,搜索框输入角色名称,例如
oss-web-upload
。单击复制,保存角色的ARN。
步骤4:在访问控制创建自定义权限策略
按照最小授权原则,为RAM角色创建一个自定义权限策略,限制只能向指定OSS的存储空间进行XX操作。
在左侧导航栏,选择权限管理 > 权限策略。
单击创建权限策略。
在创建权限策略页面,单击脚本编辑,将以下脚本中的
<Bucket名称>
替换为准备工作中创建的Bucket名称。重要以下示例仅供参考。您需要根据实际需求配置更细粒度的授权策略,防止出现权限过大的风险。关于更细粒度的授权策略配置详情,请参见对象存储自定义权限策略参考。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": "acs:oss:*:*:<Bucket名称>/uploads/*" } ] }
策略配置完成后,单击继续编辑基本信息。
在基本信息区域,填写策略名称,然后单击确定。
步骤5:在访问控制为RAM角色授予权限
为RAM角色授予创建的自定义权限,以便该RAM角色被扮演时能获取所需的权限。
在左侧导航栏,选择身份管理 > 角色。
在角色页面,找到目标RAM角色,然后单击RAM角色右侧的新增授权。
在新增授权页面下的自定义策略页签,选择已创建的自定义权限策略。
单击确定。
步骤6:在业务服务器获取临时身份凭证
创建一台ECS实例作为业务服务器,用于生成临时身份凭证。
在实际部署时,您可以将调用STS服务的接口集成到自己的业务服务器的接口中,而无需创建该ECS实例。
参数 | 示例值 |
付费类型 | 按量付费 |
地域 | 华东1(杭州) |
公网 IP | 分配公网 IPv4 地址 |
安全组 | 开放HTTP (TCP:80)端口 |
具体步骤,请参见通过控制台使用ECS实例(快捷版)。
步骤7:在业务服务器获取临时身份凭证
在Web应用中,通过在业务服务器集成STS SDK,实现一个获取临时STS身份凭证的接口。当这个接口(/get_sts_token
)通过HTTP GET方法被访问时,它会生成一个临时身份凭证,并将其返回给请求者。
在ECS实例上,使用Flask框架快速搭建Web应用,实现一个获取临时STS身份凭证的接口的操作示例如下:
连接ECS实例。
具体操作,请参见连接ECS实例。
安装Python3。
创建项目文件夹,然后切换到项目目录。
mkdir my_web_sample cd my_web_sample
安装依赖。
pip3 install Flask pip3 install attr pip3 install yarl pip3 install async_timeout pip3 install idna_ssl pip3 install attrs pip3 install aiosignal pip3 install charset_normalizer pip3 install alibabacloud_tea_openapi pip3 install alibabacloud_sts20150401 pip3 install alibabacloud_credentials
编写后端代码。
创建一个
main.py
文件。在这个文件中,添加以下Python代码。
import json from flask import Flask, render_template from alibabacloud_tea_openapi.models import Config from alibabacloud_sts20150401.client import Client as Sts20150401Client from alibabacloud_sts20150401 import models as sts_20150401_models from alibabacloud_credentials.client import Client as CredentialClient app = Flask(__name__) # 将<YOUR_ROLE_ARN>替换为RAM角色的ARN。 role_arn_for_oss_upload = '<YOUR_ROLE_ARN>' # 设置为STS服务的地域,例如cn-hangzhou。 region_id = 'cn-hangzhou' @app.route("/") def hello_world(): return render_template('index.html') @app.route('/get_sts_token', methods=['GET']) def get_sts_token(): # 初始化 CredentialClient 时不指定参数,代表使用默认凭据链。 # 在本地运行程序时,可以通过环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET 指定 AK; # 在 ECS\ECI\容器服务上运行时,可以通过环境变量 ALIBABA_CLOUD_ECS_METADATA 来指定绑定的实例节点角色,SDK 会自动换取 STS 临时凭证。 config = Config(region_id=region_id, credential=CredentialClient()) sts_client = Sts20150401Client(config=config) assume_role_request = sts_20150401_models.AssumeRoleRequest( role_arn=role_arn_for_oss_upload, # 将<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称。 role_session_name='<YOUR_ROLE_SESSION_NAME>' ) response = sts_client.assume_role(assume_role_request) token = json.dumps(response.body.credentials.to_map()) return token app.run(host="0.0.0.0", port=80)
将代码中的
<YOUR_ROLE_ARN>
替换为步骤三获取的角色ARN。将代码中的
<YOUR_ROLE_SESSION_NAME>
设置为自定义的会话名称,例如role_session_test
。
使用步骤1获取的访问密钥启动应用程序。
ALIBABA_CLOUD_ACCESS_KEY_ID=<YOUR_AK_ID> ALIBABA_CLOUD_ACCESS_KEY_SECRET=<YOUR_AK_SECRET> python3 main.py
在浏览器中访问
http://<ECS实例公网IP地址>/get_sts_token
。成功返回示例如下:
按
Ctrl + C
停止应用程序。
步骤二:下载并安装移动应用
Android
下载移动应用源码。
您可以通过此移动应用上传图片到OSS。上传的方法支持普通上传和断点续传上传。在网络环境差的情况下,推荐使用断点续传上传。您还可以利用图片处理服务,对要上传的图片进行缩略和加水印处理。
打开移动应用,配置应用参数
STS鉴权服务器:填写步骤一:配置应用服务器中部署的应用服务器地址。
上传Bucket:该移动应用要把数据上传到哪个Bucket。
区域:上传Bucket所在的地域。
单击设置。
iOS
下载移动应用源码。
您可以通过此移动应用上传图片到OSS。上传的方法支持普通上传和断点续传上传。在网络环境差的情况下,推荐使用断点续传上传。您还可以利用图片处理服务,对要上传的图片进行缩略和加水印处理。
打开移动应用,配置应用参数。
运行demo前,您需要在OSSTestMacros.h文件中配置必要参数。OSS_BUCKET_PRIVATE、OSS_ENDPOINT、OSS_STSTOKEN_URL。OSS_STSTOKEN_URL:配置为步骤1:配置应用服务器中部署的应用服务器地址。
运行该实例。
步骤三:体验移动应用直传服务
设置OSS的object名。单击上传,选择需要上传的图片。
上传成功后,通过控制台查看上传结果。