本文主要介紹如何基於STS服務在30分鐘內快速搭建一個行動裝置 App資料直傳服務,讓您的行動裝置 App資料上傳與下載直接對接OSS,僅需通過應用伺服器管理控制資訊,實現資料轉送的高效與安全。
為什麼選擇直傳服務
在移動互聯的時代,手機App上傳的資料越來越多。作為開發人員,您可以利用OSS處理各種資料存放區需求,從而更加專註於自己的應用邏輯。基於OSS的行動裝置 App資料直傳服務具有以下優勢:
-
資料安全:使用靈活的許可權管理機制進行資料的上傳和下載,更加安全。
-
成本低廉:您不需要準備很多伺服器。行動裝置 App直接連接雲端儲存OSS,只有控制流程串連應用伺服器。
-
高並發:輕鬆應對高並發訪問,保證使用者體驗。
-
彈性擴容:儲存空間隨需擴充,滿足業務增長需求。
-
資料處理:無縫整合圖片處理與音視頻轉碼功能,資料處理更靈活。
前提條件
如何進行行動裝置 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返回成功響應給用戶端。
操作步驟
步驟一:開通STS服務並配置應用伺服器
一、在存取控制建立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。
角色的 ARN 值格式為 acs:ram::<accountId>:role/oss-web-upload,其中 accountId 為當前雲帳號 ID。
四、在存取控制建立上傳檔案的權限原則
按照最小授權原則,為RAM角色建立一個自訂權限原則,限制只能向指定OSS的儲存空間進行上傳操作。
-
在左側導覽列,選擇許可權管理 > 權限原則。
-
單擊創建權限策略。
-
在創建權限策略頁面,單擊腳本編輯,將以下指令碼中的
<Bucket名稱>替換為準備工作中建立的Bucket名稱web-direct-upload。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": "acs:oss:*:*:<Bucket名稱>/*" } ] } -
策略配置完成後,單擊繼續編輯基本信息。
-
在基本信息地區,填寫策略名稱稱,然後單擊确定。
五、在存取控制為RAM角色授予許可權
為RAM角色授予建立的自訂許可權,以便該RAM角色被扮演時能擷取所需的許可權。
-
在左側導覽列,選擇身份管理 > 角色。
-
在角色頁面,找到目標RAM角色,然後單擊RAM角色右側的新增授權。
-
在新增授權頁面下,選擇{key},選擇已建立的自訂權限原則。
其中資源範圍選擇帳號層級,在策略類型下拉框中選擇自訂策略進行篩選。
-
單擊确定。
六、建立ECS執行個體作為商務服務器
建立一台ECS執行個體作為商務服務器,用於產生臨時身份憑證。
在實際部署時,您可以將調用STS服務的介面整合到自己的商務服務器的介面中,而無需建立該ECS執行個體。
|
參數 |
樣本值 |
|
付費類型 |
隨用隨付 |
|
地區 |
華東1(杭州) |
|
公網 IP |
分配公網 IPv4 地址 |
|
安全性群組 |
開放HTTP (TCP:80)連接埠 |
具體步驟,請參見控制台購買Linux執行個體並搭建Wordpress網站。
七、在商務服務器擷取臨時身份憑證
在Web應用中,通過在商務服務器整合STS SDK,實現一個擷取臨時STS身份憑證的介面。當這個介面(/get_sts_token)通過HTTP GET方法被訪問時,它會產生一個臨時身份憑證,並將其返回給要求者。
在ECS執行個體上,使用Flask架構快速搭建Web應用,實現一個擷取臨時STS身份憑證的介面的操作樣本如下:
-
串連ECS執行個體。
具體操作,請參見控制台購買Linux執行個體並搭建Wordpress網站。
-
安裝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="127.0.0.1", port=8000) # 如果需要監聽其他地址如0.0.0.0,需要您自行在服務端添加認證機制 -
將代碼中的
<YOUR_ROLE_ARN>替換為第三步擷取的角色ARN。 -
將代碼中的
<YOUR_ROLE_SESSION_NAME>設定為自訂的會話名稱,例如role_session_test。
-
-
使用第一步擷取的存取金鑰啟動應用程式。
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。成功返回樣本如下:
{"AccessKeyId": "STS.NUDRy4pc4PrizHtBYxxx", "AccessKeySecret": "H3gq6ZP2fsapnuDmGcRBxoVfiakxxx", "Expiration": "2024-05-07T09:05:19Z", "SecurityToken": "CAISywJ1q6Ft5B2yfSjIr5bxGcOAnbwV57CCeG7FplkGX9VYnqDliTz2IHhMf3ltAu0ftPUxnxxx"} -
按
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:配置應用伺服器中部署的應用伺服器位址。
#ifndef OSSTestMacros_h #define OSSTestMacros_h #define OSS_ACCESSKEY_ID @"AccessKeyID" // 子帳號id #define OSS_SECRETKEY_ID @"AccessKeySecret" // 子帳號secret #define OSS_BUCKET_PUBLIC @"public-bucket" // bucket名稱 #define OSS_BUCKET_PRIVATE @"private-bucket" // bucket名稱 #define OSS_ENDPOINT @"http://oss-cn-region.aliyuncs.com" // 訪問的阿里雲endpoint #define OSS_IMG_ENDPOINT @"http://img-cn-region.aliyuncs.com" // 舊版本圖片服務的endpoint #define OSS_MULTIPART_UPLOADKEY @"multipart_key" // 分區上傳的object key #define OSS_RESUMABLE_UPLOADKEY @"resumable_key" // 斷點續傳的object key #define OSS_CALLBACK_URL @"http://oss-demo.aliyuncs.com:23450" // 對象上傳成功時回調的商務服務器地址 #define OSS_CNAME_URL @"http://www.cnametest.com/" // cname, 用於替換bucket.endpoint的訪問網域名稱 #define OSS_STSTOKEN_URL @"http://*.*.*.*:*/sts/getsts" // sts授權伺服器的地址 #define OSS_IMAGE_KEY @"testImage.png" // 測試圖片的名稱 #define OSS_DOWNLOAD_FILE_NAME @"OSS_DOWNLOAD_FILE_NAME" // 用於下載的object key #endif /* OSSTestMacros_h */ -
運行該執行個體。
運行成功後,Demo 應用介面頂部展示已選圖片預覽,下方提供 imageName 輸入框及 Select 按鈕用於選取圖片,Put 按鈕上傳圖片,Get 按鈕下載圖片,GetResizeImage 按鈕擷取指定寬高的縮圖,Watermark 按鈕添加浮水印文字,triggerCallback 觸發回調,uploadBigFile 上傳大檔案,底部提供進度條及 download、cancel 按鈕。
步驟三:體驗行動裝置 App直傳服務
-
設定OSS的object名。點擊上傳,選擇需要上傳的圖片。
-
上傳成功後,通過控制台查看上傳結果。