快速搭建移动应用直传服务

更新时间:

本文主要介绍如何基于STS服务在30分钟内快速搭建一个移动应用数据直传服务,让您的移动应用数据上传与下载直接对接OSS,仅需通过应用服务器管理控制信息,实现数据传输的高效与安全。

为什么选择直传服务

在移动互联的时代,手机App上传的数据越来越多。作为开发者,您可以利用OSS处理各种数据存储需求,从而更加专注于自己的应用逻辑。基于OSS的移动应用数据直传服务具有以下优势:

  • 数据安全:使用灵活的权限管理机制进行数据的上传和下载,更加安全。

  • 成本低廉:您不需要准备很多服务器。移动应用直接连接云存储OSS,只有控制流连接应用服务器。

  • 高并发:轻松应对高并发访问,保证用户体验。

  • 弹性扩容:存储空间随需扩展,满足业务增长需求。

  • 数据处理:无缝集成图片处理与音视频转码功能,数据处理更灵活。

前提条件

如何进行移动应用直传

移动应用直传服务的开发流程如下:

image

实现步骤如下:

  1. 移动应用向业务服务器请求临时访问凭证。

    说明

    Android和iOS应用不能直接存储AccessKey,这样会存在数据泄露的风险。因此,应用可以向用户的应用服务器申请一个STS凭证。这个STS凭证是有时效性的,如果STS凭证的过期时间是30分钟(由应用服务器指定),那么在这30分钟里,该Android、iOS应用可以使用此Token从OSS上传和下载数据,30分钟后需要重新获取STS凭证。

  2. 业务服务器使用STS SDK调用AssumeRole接口,获取临时访问凭证。

  3. STS生成并返回临时访问凭证给业务服务器。

  4. 业务服务器返回临时访问凭证给客户端。

  5. 移动应用使用OSS SDK通过该临时访问凭证上传文件到OSS。

  6. OSS返回成功响应给客户端。

操作步骤

本方案使用的ROS模板:mobile-application-direct-transmission-service.yml

步骤一:开通STS服务并配置应用服务器

一键部署

您可以点击一键部署通过ROS快速开通STS服务并配置应用服务器。在资源编排 ROS控制台,输入资源栈名称,设置新购ECS的可用区、实例类型、系统盘类型、实例密码。部署完成后,复制输出页签下一键部署的应用服务器地址。

手动部署

步骤1:在访问控制创建RAM用户

首先,创建一个调用方式为OpenAPI调用的RAM用户,并获取对应的访问密钥,作为业务服务器的应用程序的长期身份凭证。

  1. 使用云账号或账号管理员登录RAM控制台

  2. 在左侧导航栏,选择身份管理 > 用户

  3. 单击创建用户

  4. 输入登录名称显示名称

  5. 调用方式区域下,选择OpenAPI调用,然后单击确定

  6. 单击操作下的复制,保存调用密钥(AccessKey ID和AccessKey Secret)。

步骤2:在访问控制为RAM用户授予调用AssumeRole接口的权限

创建RAM用户后,需要授予RAM用户调用STS服务的AssumeRole接口的权限,使其可以通过扮演RAM角色来获取临时身份凭证。

  1. 在左侧导航栏,选择身份管理 > 用户

  2. 用户页面,找到目标RAM用户,然后单击RAM用户右侧的添加权限

  3. 新增授权页面,选择AliyunSTSAssumeRoleAccess系统策略。

    说明

    授予RAM用户调用STS服务AssumeRole接口的固定权限是AliyunSTSAssumeRoleAccess,与后续获取临时访问凭证以及通过临时访问凭证发起OSS请求所需权限无关。

  4. 单击确认新增授权

步骤3:在访问控制创建RAM角色

为当前云账号创建一个RAM角色,并获取对应的角色的ARN(Aliyun Resource Name,阿里云资源名称),用于RAM用户之后进行扮演。

  1. 在左侧导航栏,选择身份管理 > 角色

  2. 单击创建角色,可信实体类型选择阿里云账号,单击下一步

  3. 填写角色名称,选择当前云账号

  4. 单击完成。完成角色创建后,单击关闭

  5. 在RAM角色管理页面,搜索框输入角色名称,例如oss-web-upload

  6. 单击复制,保存角色的ARN。

    1.png

步骤4:在访问控制创建自定义权限策略

按照最小授权原则,为RAM角色创建一个自定义权限策略,限制只能向指定OSS的存储空间进行XX操作。

  1. 在左侧导航栏,选择权限管理 > 权限策略

  2. 单击创建权限策略

  3. 创建权限策略页面,单击脚本编辑,将以下脚本中的<Bucket名称>替换为准备工作中创建的Bucket名称。

    重要

    以下示例仅供参考。您需要根据实际需求配置更细粒度的授权策略,防止出现权限过大的风险。关于更细粒度的授权策略配置详情,请参见对象存储自定义权限策略参考

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "oss:PutObject",
          "Resource": "acs:oss:*:*:<Bucket名称>/uploads/*"
        }
      ]
    }
  4. 策略配置完成后,单击继续编辑基本信息

  5. 基本信息区域,填写策略名称,然后单击确定

步骤5:在访问控制为RAM角色授予权限

为RAM角色授予创建的自定义权限,以便该RAM角色被扮演时能获取所需的权限。

  1. 在左侧导航栏,选择身份管理 > 角色

  2. 角色页面,找到目标RAM角色,然后单击RAM角色右侧的新增授权

  3. 新增授权页面下的自定义策略页签,选择已创建的自定义权限策略。

  4. 单击确定

步骤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身份凭证的接口的操作示例如下:

  1. 连接ECS实例。

    具体操作,请参见连接ECS实例

  2. 安装Python3

  3. 创建项目文件夹,然后切换到项目目录。

    mkdir my_web_sample
    cd my_web_sample
  4. 安装依赖。

    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
  5. 编写后端代码。

    1. 创建一个main.py文件。

    2. 在这个文件中,添加以下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)
    3. 将代码中的<YOUR_ROLE_ARN>替换为步骤三获取的角色ARN。

    4. 将代码中的<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称,例如role_session_test

  6. 使用步骤1获取的访问密钥启动应用程序。

    ALIBABA_CLOUD_ACCESS_KEY_ID=<YOUR_AK_ID> ALIBABA_CLOUD_ACCESS_KEY_SECRET=<YOUR_AK_SECRET> python3 main.py
  7. 在浏览器中访问http://<ECS实例公网IP地址>/get_sts_token

    成功返回示例如下:

    sts token.png

  8. Ctrl + C停止应用程序。

步骤二:下载并安装移动应用

Android

  1. 下载移动应用源码

    您可以通过此移动应用上传图片到OSS。上传的方法支持普通上传和断点续传上传。在网络环境差的情况下,推荐使用断点续传上传。您还可以利用图片处理服务,对要上传的图片进行缩略和加水印处理。

  2. 打开移动应用,配置应用参数

    20240919140109

    1. STS鉴权服务器:填写步骤一:配置应用服务器中部署的应用服务器地址。

    2. 上传Bucket:该移动应用要把数据上传到哪个Bucket。

    3. 区域:上传Bucket所在的地域。

  3. 单击设置

iOS

  1. 下载移动应用源码

    您可以通过此移动应用上传图片到OSS。上传的方法支持普通上传和断点续传上传。在网络环境差的情况下,推荐使用断点续传上传。您还可以利用图片处理服务,对要上传的图片进行缩略和加水印处理。

  2. 打开移动应用,配置应用参数。

    运行demo前,您需要在OSSTestMacros.h文件中配置必要参数。OSS_BUCKET_PRIVATE、OSS_ENDPOINT、OSS_STSTOKEN_URL。OSS_STSTOKEN_URL:配置为步骤1:配置应用服务器中部署的应用服务器地址。

    image

  3. 运行该实例。

    image

步骤三:体验移动应用直传服务

  1. 设置OSS的object名。单击上传,选择需要上传的图片。

  2. 上传成功后,通过控制台查看上传结果。