本文主要介紹如何基于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名。單擊上傳,選擇需要上傳的圖片。
上傳成功后,通過控制臺查看上傳結果。