全部產品
Search
文件中心

Object Storage Service:OSS Python SDK V1

更新時間:May 20, 2026

推薦使用新發布的OSS Python SDK V2,相較V1版本在架構設計上進行了重大最佳化,簡化了身分識別驗證、請求重試、錯誤處理等底層操作邏輯,提供更靈活的參數配置方式和豐富的進階介面(如分頁器、傳輸管理器、File-like介面等),顯著提升開發效率和使用體驗。

快速接入

通過以下步驟快速接入OSS Python SDK V1。

準備環境

安裝Python

OSS Python SDK V1適用於Python 2.6、2.7、3.3、3.4、3.5、3.6、3.7、3.8及以上版本。

Windows環境中安裝Python SDK時,需確保Visual C++版本為15.0或以上。

安裝python-devel

OSS Python SDK V1需要crcmod計算CRC校正碼,而crcmod依賴python-devel包中的Python.h檔案。如果系統缺少Python.h檔案,雖然SDK安裝不會失敗,但crcmod的C擴充模式安裝將失敗。當crcmod的C擴充模式安裝失敗時,上傳、下載過程中會使用純Python模式進行CRC資料校正。純Python模式的效能遠低於C擴充模式,會顯著降低上傳、下載等操作的效率。

Windows

Windows系統安裝Python時會將Python依賴的標頭檔一併安裝,無需單獨安裝python-devel。

macOS

macOS系統安裝Python時會將Python依賴的標頭檔一併安裝,無需單獨安裝python-devel。

CentOS

執行以下命令安裝python-devel。

yum install python-devel

RHEL

執行以下命令安裝python-devel。

yum install python-devel

Fedora

執行以下命令安裝python-devel。

yum install python-devel

Debian

執行以下命令安裝python-devel。

apt-get install python-dev

Ubuntu

執行以下命令安裝python-devel。

apt-get install python-dev

安裝SDK

根據開發環境選擇合適的安裝方式。建議使用最新版本的SDK,確保程式碼範例正常運行。

通過pip安裝(推薦)

  1. 安裝pip。Python 2.7.9+或者Python 3.4+以上版本預設已安裝pip。

  2. 執行以下命令安裝最新版本的SDK。

    pip install oss2                   

通過源碼安裝

  1. 從GitHub下載最新版本的SDK,解壓後進入目錄,確認目錄下有setup.py檔案。

    如需下載歷史版本的OSS Python SDK V1,請參見歷史版本。

  2. 執行以下命令安裝SDK。

    python setup.py install                   

配置訪問憑證

使用 RAM 使用者的 AccessKey 配置訪問憑證。

  1. 在 RAM 控制台,建立使用永久 AccessKey 訪問的 RAM 使用者,儲存 AccessKey,然後為該使用者授予 AliyunOSSFullAccess 許可權。

  2. 使用 RAM 使用者的 AccessKey 配置環境變數。

    Linux

    1. 在命令列介面執行以下命令,將環境變數設定追加到~/.bashrc 檔案中。

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. 執行以下命令使變更生效。

      source ~/.bashrc
    3. 執行以下命令檢查環境變數是否生效。

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. 在終端中執行以下命令,查看預設Shell類型。

      echo $SHELL
    2. 根據預設Shell類型進行操作。

      Zsh
      1. 執行以下命令,將環境變數設定追加到 ~/.zshrc 檔案中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. 執行以下命令使變更生效。

        source ~/.zshrc
      3. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
      Bash
      1. 執行以下命令,將環境變數設定追加到 ~/.bash_profile 檔案中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. 執行以下命令使變更生效。

        source ~/.bash_profile
      3. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD
    1. 在CMD中運行以下命令。

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. 運行以下命令,檢查環境變數是否生效。

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%
    PowerShell
    1. 在PowerShell中運行以下命令。

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. 運行以下命令,檢查環境變數是否生效。

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)

初始化用戶端

使用Python SDK V1時,大部分操作通過oss2.Service和oss2.Bucket兩個類進行。

  • oss2.Service類用於列舉儲存空間,不支援自訂網域名訪問。

  • oss2.Bucket類用於上傳、下載、刪除檔案以及對儲存空間進行各種配置。

重要

根據策略調整,為提升OSS服務的合規性和安全性,自2025年3月20日起,新開通OSS服務的使用者在中國內地地區的Bucket將無法通過預設外網網域名稱調用資料操作類API(如上傳、下載檔案),需通過自訂網域名(CNAME)方式訪問OSS服務。使用HTTPS協議訪問(如控制台)時,還需為自訂網域名配置SSL認證。

初始化Bucket執行個體

運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# OSS Python SDK V1 初始化用戶端範例程式碼

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

def main():

    # 從環境變數中載入訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    # 設定OSS服務地區
    region = "<region-id>"
    # 設定Endpoint
    endpoint = "<endpoint>"
    # 設定Bucket名稱
    bucket_name = "example-bucket"

    # 初始化OSS Bucket執行個體
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 列舉Bucket下的檔案清單
    print("=== 列舉Bucket下的檔案 ===")
    try:
        # 使用list_objects方法列舉檔案
        result = bucket.list_objects()
        
        # 遍曆檔案清單,只輸出檔案名
        for obj in result.object_list:
            print(obj.key)
        
        # 輸出統計資訊
        print(f"\n共列舉檔案數: {len(result.object_list)}")
        if result.is_truncated:
            print("注意: 結果被截斷,還有更多檔案未列出")
            
    except oss2.exceptions.OssError as e:
        print(f"OSS錯誤: {e}")
        raise
    except Exception as e:
        print(f"發生錯誤: {e}")
        raise

if __name__ == "__main__":
    # 程式進入點
    try:
        main()
    except Exception as e:
        print(f"運行過程中發生錯誤: {e}")
        raise

初始化Service執行個體

運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# OSS Python SDK V1 初始化Service用戶端範例程式碼

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

def main():

    # 從環境變數中載入訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    # 設定OSS服務地區
    region = "<region-id>"
    # 設定Endpoint
    endpoint = "<endpoint>"

    # 初始化OSS Service執行個體
    service = oss2.Service(auth, endpoint, region=region)
    
    # 列舉所有Bucket
    print("=== 列舉所有Bucket ===")
    try:
        # 使用BucketIterator列舉Bucket
        buckets = [b.name for b in oss2.BucketIterator(service)]
        
        # 遍曆Bucket列表,只輸出Bucket名稱
        for bucket in buckets:
            print(bucket)
        
        # 輸出統計資訊
        print(f"\n共列舉Bucket數: {len(buckets)}")
            
    except oss2.exceptions.OssError as e:
        print(f"OSS錯誤: {e}")
        raise
    except Exception as e:
        print(f"發生錯誤: {e}")
        raise

if __name__ == "__main__":
    # 程式進入點
    try:
        main()
    except Exception as e:
        print(f"運行過程中發生錯誤: {e}")
        raise

用戶端配置

初始化用戶端時,可自訂Endpoint類型、設定逾時時間和串連池大小等配置參數,以滿足不同網路環境和效能需求。

使用內網網域名稱

初始化OSS用戶端時,將Endpoint指定為內網訪問網域名稱即可實現內網訪問。

請將代碼中的 <region-id>預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
endpoint = "oss-<region-id>-internal.aliyuncs.com"

# 初始化OSS用戶端執行個體
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

使用自訂網域名

將Endpoint指定為自訂網域名,並在初始化用戶端時通過is_cname=True參數啟用CNAME選項,即可實現自訂網域名訪問。

使用自訂網域名前,需確保已將自訂網域名綁定到Bucket。具體操作參見通過自訂網域名訪問OSS。
# 設定自訂網域名
endpoint = "http://example.com"

# 初始化OSS用戶端執行個體
bucket = oss2.Bucket(auth, endpoint, bucket_name, is_cname=True, region=region)

逾時控制

初始化OSS用戶端時,使用connect_timeout參數設定逾時時間長度,單位為秒,預設值為60秒。

# 初始化OSS Bucket執行個體
bucket = oss2.Bucket(auth, endpoint, bucket_name, connect_timeout=30, region=region)

設定串連池大小

初始化OSS用戶端時,通過配置session的pool_size參數調整串連池大小。

# 設定串連池的大小,預設值為10
session = oss2.Session(pool_size=20)

# 初始化OSS Bucket執行個體
bucket = oss2.Bucket(auth, endpoint, bucket_name, session=session, region=region)

指定TLS版本

可通過自訂SSLAdapter建立Session來指定特定的TLS版本。

Python SDK 2.18.1及以上版本支援指定TLS版本。
import ssl
from requests.adapters import HTTPAdapter

# 自訂配接器,用於指定TLS版本
class SSLAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **http_client_config):
        # 指定TLS版本為1.2
        http_client_config["ssl_version"] = ssl.PROTOCOL_TLSv1_2
        return super(SSLAdapter, self).init_poolmanager(*args, **http_client_config)
        
# 通過SSLAdapter建立Session
session = oss2.Session(adapter=SSLAdapter())

# 初始化OSS Bucket執行個體
bucket = oss2.Bucket(auth, endpoint, bucket_name, session=session, region=region)

關閉CRC資料校正

可通過enable_crc=False參數關閉CRC資料校正功能。

重要

強烈建議保持CRC資料校正功能開啟。關閉此功能後,OSS無法保證上傳和下載過程中資料的完整性。

# 初始化OSS Bucket執行個體
bucket = oss2.Bucket(auth, endpoint, bucket_name, enable_crc=False, region=region)

簽名版本

重要

阿里雲Object Storage Service V1 簽名將按以下時間錶停止使用,建議儘快升級為V4簽名,確保服務不受影響。

  • 自 2025 年 3 月 1 日起,新註冊使用者無法使用 V1 簽名。

  • 自 2025 年 9 月 1 日起,逐步停止 V1 簽名的更新維護,且新建立的 Bucket 無法使用 V1 簽名。

以下範例程式碼採用V1簽名初始化用戶端。V4簽名用戶端初始化範例程式碼參見初始化用戶端。

運行範例程式碼前,請將代碼中的 <endpoint>等預留位置替換為實際的地區和Endpoint,如 https://oss-ap-southeast-1.aliyuncs.com。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# OSS Python SDK V1 初始化用戶端範例程式碼

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

def main():

    # 從環境變數中載入訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())

    # 設定Endpoint
    endpoint = "<endpoint>"
    # 設定Bucket名稱
    bucket_name = "example-bucket"

    # 初始化OSS Bucket執行個體
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    
    # 列舉Bucket下的檔案清單
    print("=== 列舉Bucket下的檔案 ===")
    try:
        # 使用list_objects方法列舉檔案
        result = bucket.list_objects()
        
        # 遍曆檔案清單,只輸出檔案名
        for obj in result.object_list:
            print(obj.key)
        
        # 輸出統計資訊
        print(f"\n共列舉檔案數: {len(result.object_list)}")
        if result.is_truncated:
            print("注意: 結果被截斷,還有更多檔案未列出")
            
    except oss2.exceptions.OssError as e:
        print(f"OSS錯誤: {e}")
        raise
    except Exception as e:
        print(f"發生錯誤: {e}")
        raise

if __name__ == "__main__":
    # 程式進入點
    try:
        main()
    except Exception as e:
        print(f"運行過程中發生錯誤: {e}")
        raise

自訂應用程式名稱

通過設定應用程式名稱可在User Agent中添加自訂標識。初始化OSS用戶端時,通過app_name參數設定應用程式名稱,預設為空白。

應用程式名稱作為HTTP Header值進行傳輸,必須符合HTTP標準規範。
# 初始化OSS Bucket執行個體
bucket = oss2.Bucket(auth, endpoint, bucket_name, app_name="client_test", region=region)

範例程式碼

OSS Python SDK V1提供豐富的範例程式碼,涵蓋儲存空間管理、檔案操作、許可權控制、加密傳輸等核心功能,便於參考或直接使用。範例程式碼包括以下內容:

Github範例程式碼

官網文檔範例程式碼

bucket.py

bucket_cname.py

綁定自訂網域名(Python SDK V1)

bucket_cors.py

跨域資源共用(Python SDK V1)

bucket_inventory.py

儲存空間清單(Python SDK V1)

bucket_logging.py

日誌轉存(Python SDK V1)

bucket_meta_query.py

資料索引(Python SDK V1)

bucket_policy.py

授權策略

bucket_referer.py

防盜鏈(Python SDK V1)

bucket_replication.py

資料複製(Python SDK V1)

bucket_symlink.py

管理軟連結(Python SDK V1)

bucket_tagging.py

儲存空間標籤(Python SDK V1)

bucket_transfer_acceleration.py

傳輸加速(Python SDK V1)

bucket_versioning.py

管理版本控制(Python SDK V1)

bucket_website.py

靜態網站託管

bucket_worm.py

合規保留原則

download.py

image.py

圖片處理(Python SDK V1)

object_basic.py

object_callback.py

上傳回調(Python SDK V1)

object_check.py

資料校正(Python SDK V1)

object_crypto.py

用戶端加密(Python SDK V1)

object_extra.py

設定自訂中繼資料

object_forbid_overwrite.py

禁止覆蓋同名檔案(Python SDK V1)

object_operation.py

object_post.py

表單上傳

object_progress.py

object_request_payment.py

要求者付費模式(Python SDK V1)

object_restore.py

解凍檔案(Python SDK V1)

server_side_encryption.py

服務端加密(Python SDK V1)

object_storage_type.py

轉換檔儲存類型(Python SDK V1)

sts.py

授權訪問(Python SDK V1)

object_tagging.py

select_csv.py

查詢檔案(Python SDK V1)

traffic_limit.py

單連結限速(Python SDK V1)

upload.py

查詢Endpoint資訊

OSS Python SDK V1支援查詢所有地區或指定地區對應的Endpoint資訊,包括外網訪問(IPv4)Endpoint、內網訪問(傳統網路或VPC網路)Endpoint和傳輸加速網域名稱(全地區上傳下載加速)Endpoint。

說明

Python SDK 2.18.0及以上版本支援查詢Endpoint資訊功能。

運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# OSS Python SDK V1 查詢Endpoint資訊範例程式碼

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

def main():

    print("=== 查詢所有支援地區對應的Endpoint資訊 ===\n")
    
    # 從環境變數中擷取訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # 填寫Bucket所在地區對應的Endpoint。
    endpoint = "<endpoint>"
    
    # 填寫Endpoint對應的Region資訊。注意,v4簽名下,必須填寫該參數
    region = "<region-id>"
    
    # 初始化OSS Service執行個體
    service = oss2.Service(auth, endpoint, region=region)
    
    try:
        # 查詢所有支援地區對應的Endpoint資訊
        result = service.describe_regions()
        
        # 遍曆所有地區資訊
        for r in result.regions:
            print(f"地區: {r.region}")
            print(f"  外網訪問(IPv4)Endpoint: {r.internet_endpoint}")
            print(f"  內網訪問(傳統網路或VPC網路)Endpoint: {r.internal_endpoint}")
            print(f"  傳輸加速網域名稱(全地區上傳下載加速)Endpoint: {r.accelerate_endpoint}")
            print("-" * 80)
        
        # 輸出統計資訊
        print(f"\n共查詢到 {len(result.regions)} 個地區的Endpoint資訊")
            
    except oss2.exceptions.OssError as e:
        print(f"OSS錯誤: {e}")
        raise
    except Exception as e:
        print(f"發生錯誤: {e}")
        raise

if __name__ == "__main__":
    # 程式進入點
    try:
        main()
    except Exception as e:
        print(f"運行過程中發生錯誤: {e}")
        raise

若需查詢指定地區的Endpoint資訊,在describe_regions方法中指定OSS專用地區ID即可。

result = service.describe_regions("oss-<region-id>")

訪問憑證配置

OSS 支援多種憑證初始化方式,需根據認證和授權需求選擇合適的初始化方式。

使用的alibabacloud-credentials版本需大於或等於0.3.5,低於此版本將導致程式報錯。

單擊查看如何選擇訪問憑證

憑證提供者初始化方式

適用情境

是否需要提供前置的AK或STS Token

底層實現基於的憑證

憑證有效期間

憑證輪轉或重新整理方式

使用RAM使用者的AK

部署運行在安全、穩定且不易受外部攻擊的環境的應用程式,無需頻繁輪轉憑證就可以長期訪問雲端服務

是

AK

長期

手動輪轉

使用STS臨時訪問憑證

部署運行在不可信的環境的應用程式,希望能控制訪問的有效期間、許可權

是

STS Token

臨時

手動重新整理

使用RAMRoleARN

需要授權訪問雲端服務,例如跨阿里雲帳號訪問雲端服務的應用程式

是

STS Token

臨時

自動重新整理

使用ECSRAMRole

部署運行在阿里雲的ECS執行個體、ECI執行個體、Container ServiceKubernetes版的Worker節點中的應用程式

否

STS Token

臨時

自動重新整理

使用OIDCRoleARN

部署運行在阿里雲的Container ServiceKubernetes版的Worker節點中的不可信應用程式

否

STS Token

臨時

自動重新整理

使用Function Compute上下文中的Credentials

部署運行在阿里雲Function Compute中的應用程式的函數

否

STS Token

臨時

無需重新整理

使用CredentialsURI

需要通過外部系統擷取訪問憑證的應用程式

否

STS Token

臨時

自動重新整理

使用自動輪轉的AK

部署運行在面臨AK泄露風險的環境的應用程式,需要頻繁輪轉憑證才長期能訪問雲端服務

否

AK

長期

自動輪轉

使用自訂訪問憑證

如果以上憑證配置方式都不滿足要求時,您可以自訂擷取憑證的方式

自訂

自訂

自訂

自訂

使用RAM使用者的AK

適用於應用程式部署運行在安全、穩定且不易受外部攻擊的環境中,需要長期訪問OSS且無法頻繁輪轉憑證的情境。通過阿里雲主帳號或RAM使用者的AK(Access Key ID、Access Key Secret)初始化憑證提供者。該方式需要手動維護AK,存在安全性風險和維護複雜度增加的風險。

重要
  • 阿里雲帳號擁有資源的全部許可權,AK一旦泄露,會給系統帶來巨大風險,不建議使用。推薦使用最小化授權的RAM使用者的AK。

  • 如需建立RAM使用者的AK,請直接存取建立AccessKey。RAM使用者的Access Key ID、Access Key Secret資訊僅在建立時顯示,如若遺忘請建立新的AK進行替換。

環境變數

  1. 使用RAM使用者AccessKey配置環境變數。

    Linux

    1. 在命令列介面執行以下命令,將環境變數設定追加到~/.bashrc 檔案中。

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. 執行以下命令使變更生效。

      source ~/.bashrc
    3. 執行以下命令檢查環境變數是否生效。

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. 在終端中執行以下命令,查看預設Shell類型。

      echo $SHELL
    2. 根據預設Shell類型進行操作。

      Zsh

      1. 執行以下命令,將環境變數設定追加到 ~/.zshrc 檔案中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. 執行以下命令使變更生效。

        source ~/.zshrc
      3. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

      Bash

      1. 執行以下命令,將環境變數設定追加到 ~/.bash_profile 檔案中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. 執行以下命令使變更生效。

        source ~/.bash_profile
      3. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD

    1. 在CMD中運行以下命令。

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. 運行以下命令,檢查環境變數是否生效。

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%

    PowerShell

    1. 在PowerShell中運行以下命令。

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. 運行以下命令,檢查環境變數是否生效。

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. 參考上述方式修改系統內容變數後,需重啟或重新整理編譯運行環境,包括IDE、命令列介面、其他傳統型應用程式及後台服務,以確保最新的系統內容變數成功載入。

  3. 使用環境變數傳遞憑證資訊。

    運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    # OSS Python SDK V1 初始化用戶端範例程式碼
    
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    def main():
    
        # 從環境變數中載入訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
        auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
        # 設定OSS服務地區
        region = "<region-id>"
        # 設定Endpoint
        endpoint = "<endpoint>"
        # 設定Bucket名稱
        bucket_name = "example-bucket-hz"
    
        # 初始化OSS Bucket執行個體
        bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
        
        # 列舉Bucket下的檔案清單
        print("=== 列舉Bucket下的檔案 ===")
        try:
            # 使用list_objects方法列舉檔案
            result = bucket.list_objects()
            
            # 遍曆檔案清單,只輸出檔案名
            for obj in result.object_list:
                print(obj.key)
            
            # 輸出統計資訊
            print(f"\n共列舉檔案數: {len(result.object_list)}")
            if result.is_truncated:
                print("注意: 結果被截斷,還有更多檔案未列出")
                
        except oss2.exceptions.OssError as e:
            print(f"OSS錯誤: {e}")
            raise
        except Exception as e:
            print(f"發生錯誤: {e}")
            raise
    
    if __name__ == "__main__":
        # 程式進入點
        try:
            main()
        except Exception as e:
            print(f"運行過程中發生錯誤: {e}")
            raise
    

靜態憑證

以下範例程式碼展示了對訪問憑據直接進行寫入程式碼,顯式設定要使用的存取金鑰的方法。

重要

請勿將訪問憑據嵌入到生產環境的應用程式中,此方法僅用於測試目的。

運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# OSS Python SDK V1 初始化用戶端範例程式碼

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

def main():

    # 填寫RAM使用者的AccessKey ID和AccessKey Secret
    access_key_id = 'yourAccessKeyID'
    access_key_secret = 'yourAccessKeySecret'
    # 使用RAM使用者的存取金鑰配置訪問憑證
    auth = oss2.AuthV4(access_key_id, access_key_secret)
    # 設定OSS服務地區
    region = "<region-id>"
    # 設定Endpoint
    endpoint = "<endpoint>"
    # 設定Bucket名稱
    bucket_name = "example-bucket-hz"

    # 初始化OSS Bucket執行個體
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 列舉Bucket下的檔案清單
    print("=== 列舉Bucket下的檔案 ===")
    try:
        # 使用list_objects方法列舉檔案
        result = bucket.list_objects()
        
        # 遍曆檔案清單,只輸出檔案名
        for obj in result.object_list:
            print(obj.key)
        
        # 輸出統計資訊
        print(f"\n共列舉檔案數: {len(result.object_list)}")
        if result.is_truncated:
            print("注意: 結果被截斷,還有更多檔案未列出")
            
    except oss2.exceptions.OssError as e:
        print(f"OSS錯誤: {e}")
        raise
    except Exception as e:
        print(f"發生錯誤: {e}")
        raise

if __name__ == "__main__":
    # 程式進入點
    try:
        main()
    except Exception as e:
        print(f"運行過程中發生錯誤: {e}")
        raise

使用STS臨時訪問憑證

適用於應用程式需要臨時訪問OSS的情境。通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token)初始化憑證提供者。該方式需要手動維護STS Token,存在安全性風險和維護複雜度增加的風險。如果需要多次臨時訪問OSS,需要手動重新整理STS Token。

重要

環境變數

  1. 使用臨時身份憑證設定環境變數。

    Mac OS/Linux/Unix

    重要
    • 請注意,此處使用的是通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token),而非RAM使用者的Access Key和Access Key Secret。

    • 請注意區分STS服務擷取的Access Key ID以STS開頭,例如“STS.****************”。

    export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>

    Windows

    重要
    • 請注意,此處使用的是通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token),而非RAM使用者的AK(Access Key ID、Access Key Secret)。

    • 請注意區分STS服務擷取的Access Key ID以STS開頭,例如“STS.****************”。

    set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
  2. 通過環境變數傳遞憑證資訊。

    運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # yourEndpoint填寫Bucket所在地區對應的Endpoint
    endpoint = '<endpoint>'
    
    # yourBucketName填寫儲存空間名稱。
    bucket_name = 'yourBucketName'
    
    # 填寫Bucket所在地區
    region = '<region-id>'
    
    # 使用環境變數中擷取的STS AK、SK和Security Token配置訪問憑證,請注意,此處使用ProviderAuthV4表示使用V4簽名。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # 使用Auth執行個體初始化bucket。注意,使用V4簽名時,region參數必須指定,否則會報錯。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 使用bucket對象進行後續操作...

靜態憑證

可以在應用程式中對憑據直接進行寫入程式碼,顯式設定要使用的臨時存取金鑰。

運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
# -*- coding: utf-8 -*-
import oss2

# 填寫擷取的臨時存取金鑰AccessKey ID和AccessKey Secret,非阿里雲帳號AccessKey ID和AccessKey Secret。
# 請注意區分STS服務擷取的Access Key ID是以STS開頭,。。
sts_access_key_id = 'STS.****************'
sts_access_key_secret = 'yourAccessKeySecret'
# 填寫擷取的STS安全性權杖(SecurityToken)。
security_token = 'yourSecurityToken'

# yourEndpoint填寫Bucket所在地區對應的Endpoint
endpoint = '<endpoint>'

# yourBucketName填寫儲存空間名稱。
bucket_name = 'yourBucketName'

# 填寫Bucket所在地區
region = '<region-id>'

# 初始化StsAuth執行個體。注意,auth_version設定為"v4",表示使用OSS V4版本簽名。
auth = oss2.StsAuth(sts_access_key_id,
                    sts_access_key_secret,
                    security_token,
                    auth_version="v4")

# 使用StsAuth執行個體初始化bucket。注意,使用V4簽名時,region參數必須指定,否則會報錯。
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

# 使用bucket對象進行後續操作...

使用RAMRoleARN

適用於應用程式需要授權訪問OSS,例如跨阿里雲帳號訪問OSS的情境。通過指定RAM角色的ARN(Alibabacloud Resource Name)初始化憑證提供者,底層實現基於STS Token。Credentials工具會前往STS服務擷取STS Token,並在會話到期前調用AssumeRole介面申請新的STS Token。還可以通過為policy賦值來限制RAM角色到一個更小的許可權集合。

重要
  • 阿里雲帳號擁有資源的全部許可權,AK一旦泄露,會給系統帶來巨大風險,不建議使用。推薦使用最小化授權的RAM使用者的AK。

  • 如需建立RAM使用者的AK,請直接存取建立AccessKey。RAM使用者的Access Key ID、Access Key Secret資訊僅在建立時顯示,請及時儲存,如若遺忘請建立新的AK進行輪換。

  • 如需擷取RAMRoleARN,請直接存取建立角色。

  1. 添加credentials依賴。

    pip install alibabacloud_credentials
  2. 配置AK和RAMRoleARN作為訪問憑證。

    運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
    # -*- coding: utf-8 -*-
    import oss2
    from alibabacloud_credentials.client import Client
    from alibabacloud_credentials.models import Config
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    import os
    
    class CredentialProviderWrapper(CredentialsProvider):
        def __init__(self, client):
            self.client = client
    
        def get_credentials(self):
            credential = self.client.get_credential()
            access_key_id = credential.access_key_id
            access_key_secret = credential.access_key_secret
            security_token = credential.security_token
            return Credentials(access_key_id, access_key_secret, security_token)
    
    config = Config(
        # 從環境變數中擷取RAM使用者的存取金鑰(AccessKey ID和AccessKey Secret)
        access_key_id=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        access_key_secret=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        type='ram_role_arn',
        # 要扮演的RAM角色ARN,樣本值:acs:ram::123456789012****:role/adminrole,可以通過環境變數ALIBABA_CLOUD_ROLE_ARN設定RoleArn
        role_arn='<RoleArn>',
        # 角色會話名稱,可以通過環境變數ALIBABA_CLOUD_ROLE_SESSION_NAME設定RoleSessionName
        role_session_name='<RoleSessionName>',
        # 設定更小的權限原則,非必填。樣本值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
        policy='<Policy>',
        # 設定角色會話有效期間,非必填
        role_session_expiration=3600
    )
    
    cred = Client(config)
    
    credentials_provider = CredentialProviderWrapper(cred)
    
    # 請注意,此處使用ProviderAuthV4表示使用V4簽名。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # yourEndpoint填寫Bucket所在地區對應的Endpoint
    endpoint = '<endpoint>'
    
    # yourBucketName填寫儲存空間名稱。
    bucket_name = 'yourBucketName'
    
    # 填寫Bucket所在地區
    region = '<region-id>'
    
    # 使用Auth執行個體初始化bucket。注意,使用V4簽名時,region參數必須指定,否則會報錯。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 使用bucket對象進行後續操作...

使用ECSRAMRole

適用於應用程式運行在ECS執行個體、ECI執行個體、Container ServiceKubernetes版的Worker節點中的情境。建議使用ECSRAMRole初始化憑證提供者,底層實現基於STS Token。ECSRAMRole允許將一個角色關聯到ECS執行個體、ECI執行個體或Container Service Kubernetes 版的Worker節點,實現在執行個體內部自動重新整理STS Token。該方式無需提供AK或STS Token,消除了手動維護AK或STS Token的風險。如何擷取ECSRAMRole,請參見建立角色。如何將一個角色關聯到ECS執行個體,請參見執行個體RAM角色。

  1. 添加credentials依賴。

    pip install alibabacloud_credentials
  2. 配置ECSRAMRole作為訪問憑證。

    運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
    # -*- coding: utf-8 -*-
    import oss2
    from alibabacloud_credentials.client import Client
    from alibabacloud_credentials.models import Config
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    
    class CredentialProviderWrapper(CredentialsProvider):
        def __init__(self, client):
            self.client = client
    
        def get_credentials(self):
            credential = self.client.get_credential()
            access_key_id = credential.access_key_id
            access_key_secret = credential.access_key_secret
            security_token = credential.security_token
            return Credentials(access_key_id, access_key_secret, security_token)
    
    config = Config(
        type='ecs_ram_role',      # 訪問憑證類型。固定為ecs_ram_role。
        role_name='<RoleName>'    # 為ECS授予的RAM角色的名稱。選擇性參數。如果不設定,將自動檢索。強烈建議設定,以減少請求。
    )
    
    cred = Client(config)
    
    credentials_provider = CredentialProviderWrapper(cred)
    
    # 請注意,此處使用ProviderAuthV4表示使用V4簽名。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # yourEndpoint填寫Bucket所在地區對應的Endpoint
    endpoint = '<endpoint>'
    
    # yourBucketName填寫儲存空間名稱。
    bucket_name = 'yourBucketName'
    
    # 填寫Bucket所在地區
    region = '<region-id>'
    
    # 使用Auth執行個體初始化bucket。注意,使用V4簽名時,region參數必須指定,否則會報錯。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 使用bucket對象進行後續操作...

使用OIDCRoleARN

在Container ServiceKubernetes版中設定了Worker節點RAM角色後,對應節點內的Pod中的應用也可以像ECS上部署的應用一樣,通過中繼資料服務(Meta Data Server)擷取關聯角色的STS Token。但如果容器叢集上部署的是不可信的應用(比如部署客戶提交的應用,代碼也沒有開放),可能並不希望它們能通過中繼資料服務擷取Worker節點關聯執行個體RAM角色的STS Token。為了避免影響雲上資源的安全,同時又能讓這些不可信的應用安全地擷取所需的STS Token,實現應用層級的許可權最小化,可以使用RRSA(RAM Roles for Service Account)功能。該方式底層實現基於STS Token。阿里雲容器叢集會為不同的應用Pod建立和掛載相應的服務賬戶OIDC Token檔案,並將相關配置資訊注入到環境變數中,Credentials工具通過擷取環境變數的配置資訊,調用STS服務的AssumeRoleWithOIDC介面換取綁定角色的STS Token。該方式無需提供AK或STS Token,消除了手動維護AK或STS Token的風險。詳情請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離。

  1. 添加credentials依賴。

    pip install alibabacloud_credentials
  2. 配置OIDC的RAM角色作為訪問憑證。

    運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
    # -*- coding: utf-8 -*-
    import oss2
    from alibabacloud_credentials.client import Client
    from alibabacloud_credentials.models import Config
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    import os
    
    class CredentialProviderWrapper(CredentialsProvider):
        def __init__(self, client):
            self.client = client
    
        def get_credentials(self):
            credential = self.client.get_credential()
            access_key_id = credential.access_key_id
            access_key_secret = credential.access_key_secret
            security_token = credential.security_token
            return Credentials(access_key_id, access_key_secret, security_token)
    
    config = Config(
        # 指定Credential類型,固定值為oidc_role_arn。
        type='oidc_role_arn',
        # RAM角色名稱ARN,可以通過環境變數ALIBABA_CLOUD_ROLE_ARN設定RoleArn
        role_arn=os.environ.get('<RoleArn>'),
        # OIDC供應商ARN,可以通過環境變數ALIBABA_CLOUD_OIDC_PROVIDER_ARN設定OidcProviderArn
        oidc_provider_arn=os.environ.get('<OidcProviderArn>'),
        # OIDC Token檔案路徑,可以通過環境變數ALIBABA_CLOUD_OIDC_TOKEN_FILE設定OidcTokenFilePath
        oidc_token_file_path=os.environ.get('<OidcTokenFilePath>'),
        # 角色會話名稱,可以通過環境變數ALIBABA_CLOUD_ROLE_SESSION_NAME設定RoleSessionName
        role_session_name='<RoleSessionName>',
        # 設定更小的權限原則,非必填。樣本值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
        policy='<Policy>',
        # 設定session到期時間
        role_session_expiration=3600
    )
    
    cred = Client(config)
    
    credentials_provider = CredentialProviderWrapper(cred)
    
    # 請注意,此處使用ProviderAuthV4表示使用V4簽名。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # yourEndpoint填寫Bucket所在地區對應的Endpoint。
    endpoint = '<endpoint>'
    
    # yourBucketName填寫儲存空間名稱。
    bucket_name = 'yourBucketName'
    
    # 填寫Bucket所在地區。
    region = '<region-id>'
    
    # 使用Auth執行個體初始化bucket。注意,使用V4簽名時,region參數必須指定,否則會報錯。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 使用bucket對象進行後續操作...

使用Function Compute上下文中的Credentials

適用於應用程式的函數部署運行在Function Compute中的情境。可以使用Function Compute上下文中的Credentials初始化憑證提供者,底層實現基於STS Token。Function Compute根據函數配置的角色,通過扮演服務角色擷取一個STS Token,然後通過上下文中的參數Credentials將STS Token傳遞給應用程式。該STS Token的有效期間為36小時,且不支援修改。函數的最大執行時間為24小時,因此,執行函數過程中,STS Token不會到期,無需考慮重新整理問題。該方式無需提供AK或STS Token,消除了手動維護AK或STS Token的風險。如何授予Function Compute訪問OSS的許可權,請參見使用函數角色授予Function Compute訪問其他雲端服務的許可權。

使用Function Compute上下文中的Credentials初始化憑證提供者

運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
# -*- coding: utf-8 -*-
import oss2
from oss2 import CredentialsProvider
from oss2.credentials import Credentials

def handler(event, context):

    class CredentialProviderWrapper(CredentialsProvider):
        def get_credentials(self):
            creds = context.credentials
            return Credentials(creds.access_key_id, creds.access_key_secret, creds.security_token)

    credentials_provider = CredentialProviderWrapper()
    # 請注意,此處使用ProviderAuthV4表示使用V4簽名。
    auth = oss2.ProviderAuthV4(credentials_provider)

    # yourEndpoint填寫Bucket所在地區對應的Endpoint。
    endpoint = '<endpoint>'

    # yourBucketName填寫儲存空間名稱。
    bucket_name = 'yourBucketName'

    # 填寫Bucket所在地區。
    region = '<region-id>'

    # 使用Auth執行個體初始化bucket。注意,使用V4簽名時,region參數必須指定,否則會報錯。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

    # 使用bucket對象進行後續操作...

    return 'success'

使用CredentialsURI

適用於應用程式需要通過外部系統擷取阿里雲憑證,從而實現靈活的憑證管理和無密鑰訪問的情境。可以使用CredentialsURI初始化憑證提供者,底層實現基於STS Token。Credentials工具通過提供的URI擷取STS Token,完成憑證用戶端初始化。該方式無需提供AK或STS Token,消除了手動維護AK或STS Token的風險。

重要
  • CredentialsURI指擷取STS Token的伺服器位址。

  • 提供CredentialsURI響應的後端服務需要實現STS Token的自動重新整理邏輯,確保應用程式始終能擷取到有效憑證。

  1. 為了使Credentials工具正確解析和使用STS Token,URI必須遵循以下響應協議:

    • 響應狀態代碼:200

    • 響應體結構:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. 添加credentials依賴。

    pip install alibabacloud_credentials
  3. 配置CredentialsURI作為訪問憑證。

    運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
    # -*- coding: utf-8 -*-
    import oss2
    from alibabacloud_credentials.client import Client
    from alibabacloud_credentials.models import Config
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    
    class CredentialProviderWrapper(CredentialsProvider):
        def __init__(self, client):
            self.client = client
    
        def get_credentials(self):
            credential = self.client.get_credential()
            access_key_id = credential.access_key_id
            access_key_secret = credential.access_key_secret
            security_token = credential.security_token
            return Credentials(access_key_id, access_key_secret, security_token)
    
    config = Config(
        type='credentials_uri',
        # 憑證的 URI,格式為http://local_or_remote_uri/,可以通過環境變數ALIBABA_CLOUD_CREDENTIALS_URI設定CredentialsUri
        credentials_uri='<CredentialsUri>',
    )
    
    cred = Client(config)
    
    credentials_provider = CredentialProviderWrapper(cred)
    
    # 請注意,此處使用ProviderAuthV4表示使用V4簽名。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # yourEndpoint填寫Bucket所在地區對應的Endpoint。
    endpoint = '<endpoint>'
    
    # yourBucketName填寫儲存空間名稱。
    bucket_name = 'yourBucketName'
    
    # 填寫Bucket所在地區。
    region = '<region-id>'
    
    # 使用Auth執行個體初始化bucket。注意,使用V4簽名時,region參數必須指定,否則會報錯。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 使用bucket對象進行後續操作...

使用自動輪轉的AK

適用於應用程式需要長期訪問OSS,但部署啟動並執行環境面臨AK泄露風險,需要頻繁手動輪轉(輪換)AK的情境。可以使用ClientKey初始化憑證提供者,底層實現基於AK。使用ClientKey後,Key Management Service(KMS)可以對託管的RAM使用者AK進行全自動的定期輪轉,將靜態RAM使用者AK動態化,從而降低AK泄漏的風險。除定期輪轉外,KMS還支援立即輪轉,在AK泄漏情況下快速更換AK。該方式無需手動維護AK,從而降低安全性風險和維護複雜度。如何擷取ClientKey,請參見建立應用存取點。

  1. 添加憑據用戶端依賴。

    pip install aliyun-secret-manager-client
  2. 建立設定檔secretsmanager.properties。

    # 訪問憑據類型,固定為client_key
    credentials_type=client_key
    
    # 讀取Client Key的解密密碼:支援從環境變數或者檔案讀取,只需設定一種
    client_key_password_from_env_variable=<your client key private key password environment variable name>
    client_key_password_from_file_path=<your client key private key password file path>
    
    # Client Key的私密金鑰檔案路徑
    client_key_private_key_path=<your client key private key file path>
    
    # 關聯的KMS服務地區
    cache_client_region_id=[{"regionId":"<regionId>"}]
  3. 使用設定檔傳遞憑證資訊。

    運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
    # -*- coding: utf-8 -*-
    import json
    import oss2
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    from alibaba_cloud_secretsmanager_client.secret_manager_cache_client_builder import SecretManagerCacheClientBuilder
    
    class CredentialProviderWrapper(CredentialsProvider):
        def get_credentials(self):
            secret_cache_client = SecretManagerCacheClientBuilder.new_client()
            secret_info = secret_cache_client.get_secret_info("<secretName>")
            secret_value_json = json.loads(secret_info.secret_value)
            return Credentials(secret_value_json["AccessKeyId"], secret_value_json["AccessKeySecret"])
    
    credentials_provider = CredentialProviderWrapper()
    
    # 請注意,此處使用ProviderAuthV4表示使用V4簽名。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # yourEndpoint填寫Bucket所在地區對應的Endpoint。
    endpoint = '<endpoint>'
    
    # yourBucketName填寫儲存空間名稱。
    bucket_name = 'yourBucketName'
    
    # 填寫Bucket所在地區。
    region = '<region-id>'
    
    # 使用Auth執行個體初始化bucket。注意,使用V4簽名時,region參數必須指定,否則會報錯。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 使用bucket對象進行後續操作...

使用自訂訪問憑證

當以上憑證配置方式都不滿足要求時,可以通過實現Credential Providers介面的方式自訂憑證提供方式。需要注意,如果底層實現基於STS Token,需要提供憑證的更新支援。

運行範例程式碼前,請將代碼中的 <region-id>等預留位置替換為實際的地區和Endpoint,如 ap-southeast-1。
# -*- coding: utf-8 -*-
import oss2
from oss2 import CredentialsProvider
from oss2.credentials import Credentials

class CredentialProviderWrapper(CredentialsProvider):
    def get_credentials(self):
        # TODO
        # 自訂訪問憑證的擷取方法

        # 返回長期憑證access_key_id, access_key_secrect
        return Credentials('<access_key_id>', '<access_key_secrect>')

        # 返回 臨時憑證access_key_id, access_key_secrect, token
        # 對於臨時憑證,需要根據到期時間,重新整理憑證。
        # return Credentials('<access_key_id>', '<access_key_secrect>', '<token>');

credentials_provider = CredentialProviderWrapper()

# 請注意,此處使用ProviderAuthV4表示使用V4簽名。
auth = oss2.ProviderAuthV4(credentials_provider)

# yourEndpoint填寫Bucket所在地區對應的Endpoint。
endpoint = '<endpoint>'

# yourBucketName填寫儲存空間名稱。
bucket_name = 'yourBucketName'

# 填寫Bucket所在地區。
region = '<region-id>'

# 使用Auth執行個體初始化bucket。注意,使用V4簽名時,region參數必須指定,否則會報錯。
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

# 使用bucket對象進行後續操作...

常見問題

報錯No module named _crcfunext?

使用OSS Python SDK V1調用上傳、下載介面較其他工具如ossutil或其他SDK慢。

  • 問題原因:

    編譯crcmod時,由於_crcfunext.so依賴Python.h檔案,而系統中缺少該標頭檔,導致_crcfunext.so庫產生失敗。關於crcmod的更多資訊,請參見crcmod introduction。

  • 解決方案:

    驗證crcmod的C擴充模式是否安裝成功。

    1. 執行以下命令進入Python環境。

      python
    2. 執行以下命令匯入crcmod模組下的_crcfunext的C擴充模組。

      import crcmod._crcfunext

      出現以下錯誤提示,表明crcmod庫的C擴充模式安裝失敗。

      Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      ImportError: No module named _crcfunext                                 
    3. 根據系統內容選擇解決方案。

      Windows

      1. 下載crcmod-1.7.win32-py2.7.msi或者其他版本的.msi檔案。

        說明

        win32位的crcmod同時相容win32和win64系統。

      2. 安裝.msi檔案並在安裝過程中指定crcmod的安裝路徑到本地python安裝路徑下的Lib\site-packages檔案夾。例如D:\python\Lib\site-packages\。

      3. 安裝完成後,重新執行驗證crcmod的步驟。

      Linux

      Linux系統出現該問題時,執行以下步驟:

      1. 執行以下命令卸載crcmod。

        pip uninstall crcmod
      2. 安裝python-devel。具體操作,請參見準備環境。

      3. 執行以下命令重新安裝crcmod。

        pip install crcmod

        如果執行上述步驟仍然安裝失敗,卸載crcmod,然後執行以下命令查看安裝失敗的詳細原因。

        pip install crcmod -v

報錯No module named 'Crypto'?

  • 問題原因:

    系統中不存在Crypto模組或存在crypto模組(首字母小寫)。

  • 解決方案:

    檢查本地Python安裝路徑下的Crypto模組,例如D:\python3.9\Lib\site-packages。

    • 如果不存在Crypto模組,執行以下命令。

      python -m pip install --upgrade setuptools
    • 如果存在crypto模組(首字母小寫),將首字母改為大寫,然後重新啟動程式。

提示“不是內部或外部命令”?

Windows環境中,如果提示"不是內部或外部命令",需要在環境變數中編輯Path,增加Python和pip的安裝路徑。pip的安裝路徑通常為Python所在目錄的Scripts檔案夾。編輯環境變數後,可能需要重啟電腦使環境變數生效。

安裝OSS Python SDK V1失敗?

如果安裝OSS Python SDK V1失敗,執行以下命令卸載後重新安裝。

pip uninstall oss2            

如何升級OSS Python SDK V1?

執行以下命令升級OSS Python SDK V1。

 pip install --upgrade oss2

當使用SDK時遇到報錯AccessDenied該如何進行排查?

遇到AccessDenied錯誤通常是因為缺少相應的存取權限。排查步驟如下:

  1. 確認AccessKey ID和AccessKey Secret:確保使用了正確的AccessKey ID和AccessKey Secret。

  2. 檢查RAM使用者權限:確認RAM使用者是否擁有Bucket或Object相關操作許可權。

  3. 檢查Bucket Policy:如果錯誤資訊中提到"Access denied by bucket policy",表明訪問被Bucket Policy策略拒絕。

通過與OSS同地區的其他阿里雲產品訪問OSS,如何提升傳輸速度?

當使用情境對上傳速度有要求時,建議通過與OSS同地區的其他阿里雲產品(如ECS伺服器)訪問OSS,並使用內網Endpoint進行訪問。

如何查看RAM使用者的AK,是否可以查看舊的AccessKey Secret?

  1. 查看RAM使用者的AK:直接登入RAM控制台選擇具體使用者查看AK資訊。

  2. RAM使用者的AccessKey Secret僅在建立時顯示,之後無法查看,遺忘後無法找回。可以直接存取RAM控制台選擇具體使用者,建立新的AccessKey進行輪換。具體操作請參見建立AccessKey。