全部產品
Search
文件中心

ApsaraDB RDS:RDS搭配OSS實現多結構資料存放區

更新時間:Apr 02, 2025

RDS可以和OSS搭配使用,組成多類型資料存放區解決方案。

OSS是阿里雲對外提供的海量、安全、低成本、高可靠的雲端儲存體服務。RDS可以和OSS搭配使用,例如當業務應用為論壇時,RDS搭配OSS使用,註冊使用者的映像、文章內容的映像等資源可以儲存在OSS中,以減少RDS的儲存壓力。

程式碼範例

OSS與RDS搭配使用樣本,基於Python 3.6編寫。

OSS Python SDK安裝指導,請參見安裝

  1. 配置環境變數。

    Linux/macOS系統

    export OSS_ACCESS_KEY_ID=STS.****************
    export OSS_ACCESS_KEY_SECRET=yourAccessKeySecret
    export OSS_SESSION_TOKEN=xxxxxx

    Windows系統

    set OSS_ACCESS_KEY_ID=STS.****************
    set OSS_ACCESS_KEY_SECRET=yourAccessKeySecret
    set OSS_SESSION_TOKEN=xxxxxx
    說明

    臨時憑證需通過STS服務擷取,有效期間通常為1小時,建議通過RAM角色自動輪轉憑證。

  2. 初始化oss2.Bucket類。

    #!/usr/bin/env python
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 使用V4簽名和環境變數憑證
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # 填寫實際Endpoint(需包含HTTPS協議)
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'  # 華東1樣本
    
    # 必須指定Region並建立Bucket執行個體
    bucket = oss2.Bucket(
        auth,
        endpoint,
        'examplebucket',
        region='cn-hangzhou'  # 與Endpoint對應的地區
    )
  3. 上傳Object。

    # 填寫Object完整路徑和本地檔案的完整路徑。Object完整路徑中不能包含Bucket名稱。
    # 如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
    # 上傳info_old.txt檔案對象
    res1 = bucket.put_object_from_file("info_key.txt", "info_old.txt")
    print("res1-{0}".format(res1.status))
        
    # 上傳picture_old.png圖片對象
    res2 = bucket.put_object_from_file("picture_key.png", "picture_old.png")
    print("res2-{0}".format(res2.status))
  4. 擷取對應Object。

    # 填寫Object完整路徑,完整路徑中不包含Bucket名稱,例如info_key.txt。
    # 下載Object到本地檔案,並儲存到指定的本地路徑D:\\info_new.txt。如果指定的本地檔案存在,則會覆蓋該檔案,不存在則建立檔案。
    res3 = bucket.get_object_to_file("info_key.txt", "D:\\info_new.txt")
    print("res2-{0}".format(res3.status))
    
    res4 = bucket.get_object_to_file("picture_key.png", "D:\\picture_new.png")
    print("res4-{0}".format(res4.status))

ECS應用代碼中,RDS中儲存了每個使用者的id,而使用者對應的頭像資源儲存於OSS中,以簡單的Python代碼為例:

#!/usr/bin/env python
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import mysql_client

def conn_client():
    sql = "SELECT id FROM users LIMIT 1"  # 假設從users表擷取使用者ID
    # 使用V4簽名和標準憑證提供器
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"  # 修正協議頭
    bucket = oss2.Bucket(auth, endpoint, 'oss-wwjtest', region='cn-hangzhou')

    # 執行資料庫查詢
    user_id = mysql_client.fetch_one(sql)  # 確保fetch_one返回單個值
    object_path = f"{user_id}.png"  # 需正確定義object名稱
    local_path = f"your_path/{object_path}"  # 需替換實際路徑

    # 下載對象
    bucket.get_object_to_file(object_path, local_path)
    # 上傳對象
    bucket.put_object_from_file(object_path, local_path)

if __name__ == '__main__':
    conn_client()