本文主要介紹如何基於STS服務在30分鐘內快速搭建一個行動裝置 App資料直傳服務,讓您的行動裝置 App資料上傳與下載直接對接OSS,僅需通過應用伺服器管理控制資訊,實現資料轉送的高效與安全。
為什麼選擇直傳服務
在移動互聯的時代,手機App上傳的資料越來越多。作為開發人員,您可以利用OSS處理各種資料存放區需求,從而更加專註於自己的應用邏輯。基於OSS的行動裝置 App資料直傳服務具有以下優勢:
資料安全:使用靈活的許可權管理機制進行資料的上傳和下載,更加安全。
成本低廉:您不需要準備很多伺服器。行動裝置 App直接連接雲端儲存OSS,只有控制流程串連應用伺服器。
高並發:輕鬆應對高並發訪問,保證使用者體驗。
彈性擴容:儲存空間隨需擴充,滿足業務增長需求。
資料處理:無縫整合圖片處理與音視頻轉碼功能,資料處理更靈活。
前提條件
如何進行行動裝置 App直傳
行動裝置 App直傳服務的開發流程如下:
實現步驟如下:
行動裝置 App向商務服務器請求臨時訪問憑證。
說明Android和iOS應用不能直接儲存AccessKey,這樣會存在資料泄露的風險。因此,應用可以向使用者的應用伺服器申請一個STS憑證。這個STS憑證是有時效性的,如果STS憑證的到期時間是30分鐘(由應用伺服器指定),那麼在這30分鐘裡,該Android、iOS應用可以使用此Token從OSS上傳和下載資料,30分鐘後需要重新擷取STS憑證。
商務服務器使用STS SDK調用AssumeRole介面,擷取臨時訪問憑證。
STS產生並返回臨時訪問憑證給商務服務器。
商務服務器返回臨時訪問憑證給用戶端。
行動裝置 App使用OSS SDK通過該臨時訪問憑證上傳檔案到OSS。
OSS返回成功響應給用戶端。
操作步驟
本方案使用的ROS模板:mobile-application-direct-transmission-service.yml
步驟一:開通STS服務並配置應用伺服器
一鍵部署
您可以使用Resource Orchestration Service開通STS服務並一鍵配置1個Elastic Compute Service執行個體,然後在Elastic Compute Service執行個體上部署應用伺服器源碼。使用Resource Orchestration Service快速開通STS服務並配置應用伺服器的操作步驟如下。
開啟一鍵配置模板連結。
在Resource Orchestration Service控制台,輸入資源棧名稱,設定新購ECS的可用性區域、執行個體類型、系統硬碟類型、執行個體密碼,然後單擊建立。
資源棧的資源棧資訊頁簽下的狀態顯示建立中。
資源棧的狀態顯示建立成功後,單擊輸出頁簽,查看一鍵部署的應用伺服器位址。
手動部署
一、在存取控制建立RAM使用者
首先,建立一個RAM使用者,並擷取對應的存取金鑰,作為商務服務器的應用程式的長期身份憑證。
使用雲帳號或帳號管理員登入RAM控制台。
在左側導覽列,選擇身份管理 > 使用者。
單擊建立使用者。
輸入登入名稱稱和顯示名稱。
在訪問方式地區下,選擇使用永久 AccessKey 訪問,然後單擊確定。
RAM使用者的AccessKey Secret只在建立時顯示,後續不支援查看,請妥善保管。
單擊操作下的複製,儲存調用密鑰(AccessKey ID和AccessKey Secret)。
二、在存取控制為RAM使用者授予調用AssumeRole介面的許可權
建立RAM使用者後,需要授予RAM使用者調用STS服務的AssumeRole介面的許可權,使其可以通過扮演RAM角色來擷取臨時身份憑證。
在左側導覽列,選擇身份管理 > 使用者。
在使用者頁面,找到目標RAM使用者,然後單擊RAM使用者右側的添加許可權。
在新增授權頁面,選擇AliyunSTSAssumeRoleAccess系統策略。
說明授予RAM使用者調用STS服務AssumeRole介面的固定許可權是AliyunSTSAssumeRoleAccess,與後續擷取臨時訪問憑證以及通過臨時訪問憑證發起OSS請求要求的權限無關。
單擊確認新增授權。
三、在存取控制建立RAM角色
為當前雲帳號建立一個RAM角色,並擷取對應的角色的ARN(Aliyun Resource Name,阿里雲資源名稱),用於RAM使用者之後進行扮演。
在左側導覽列,選擇身份管理 > 角色。
單擊建立角色,可信實體類型選擇雲帳號。
選擇當前雲帳號,單擊確定。
填寫角色名稱,單擊確定。
在RAM角色管理頁面,單擊複製,儲存角色的ARN。
四、在存取控制建立上傳檔案的權限原則
按照最小授權原則,為RAM角色建立一個自訂權限原則,限制只能向指定OSS的儲存空間進行上傳操作。
在左側導覽列,選擇許可權管理 > 權限原則。
單擊建立權限原則。
在建立權限原則頁面,單擊指令碼編輯,將以下指令碼中的
<Bucket名稱>
替換為準備工作中建立的Bucket名稱web-direct-upload
。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": "acs:oss:*:*:<Bucket名稱>/*" } ] }
策略配置完成後,單擊繼續編輯基本資料。
在基本資料地區,填寫策略名稱稱,然後單擊確定。
五、在存取控制為RAM角色授予許可權
為RAM角色授予建立的自訂許可權,以便該RAM角色被扮演時能擷取所需的許可權。
在左側導覽列,選擇身份管理 > 角色。
在角色頁面,找到目標RAM角色,然後單擊RAM角色右側的新增授權。
在新增授權頁面下,選擇自訂策略,選擇已建立的自訂權限原則。
單擊確定。
六、建立ECS執行個體作為商務服務器
建立一台ECS執行個體作為商務服務器,用於產生臨時身份憑證。
在實際部署時,您可以將調用STS服務的介面整合到自己的商務服務器的介面中,而無需建立該ECS執行個體。
參數 | 樣本值 |
付費類型 | 隨用隨付 |
地區 | 華東1(杭州) |
公網 IP | 分配公網 IPv4 地址 |
安全性群組 | 開放HTTP (TCP:80)連接埠 |
具體步驟,請參見通過控制台使用ECS執行個體(快捷版)。
七、在商務服務器擷取臨時身份憑證
在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\Container Service上運行時,可以通過環境變數 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
停止應用程式。
步驟二:下載並安裝行動裝置 App
Android
下載行動裝置 App源碼。
您可以通過此行動裝置 App上傳圖片到OSS。上傳的方法支援普通上傳和斷點續傳。在網路環境差的情況下,推薦使用斷點續傳。您還可以利用圖片處理服務,對要上傳的圖片進行縮減和加浮水印處理。
開啟行動裝置 App,配置應用參數
STS鑒權伺服器:填寫步驟一:配置應用伺服器中部署的應用伺服器位址。
上傳Bucket:該行動裝置 App要把資料上傳到哪個Bucket。
地區:上傳Bucket所在的地區。
點擊設定。
iOS
下載行動裝置 App源碼。
您可以通過此行動裝置 App上傳圖片到OSS。上傳的方法支援普通上傳和斷點續傳上傳。在網路環境差的情況下,推薦使用斷點續傳上傳。您還可以利用圖片處理服務,對要上傳的圖片進行縮減和加浮水印處理。
開啟行動裝置 App,配置應用參數。
運行demo前,您需要在OSSTestMacros.h檔案中配置必要參數。OSS_BUCKET_PRIVATE、OSS_ENDPOINT、OSS_STSTOKEN_URL。OSS_STSTOKEN_URL:配置為步驟1:配置應用伺服器中部署的應用伺服器位址。
運行該執行個體。
步驟三:體驗行動裝置 App直傳服務
設定OSS的object名。點擊上傳,選擇需要上傳的圖片。
上傳成功後,通過控制台查看上傳結果。