本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
Github | OSS Python SDK V2开发者指南|OSS Python SDK V2 Docs
快速接入
接入OSS Python SDK V2的流程如下:
环境准备
要求 Python 3.8 及以上版本。
可以通过 Python -version 命令查看 Python 版本。如果当前环境没有 Python 或版本低于 Python 3.8,请下载并安装Python。安装SDK
- 执行以下命令安装OSS Python SDK V2代码包。请根据需求选择合适的OSS Python SDK V2版本,推荐使用最新的版本,确保本文中的代码示例可以正常运行。关于版本功能的更多信息,请参见Releases。 - pip install alibabacloud-oss-v2
- 使用以下代码引入OSS Python SDK V2包。 - import alibabacloud_oss_v2 as oss
配置访问凭证
使用 RAM 用户的 AccessKey 配置访问凭证。
- 在 RAM 控制台,创建使用永久 AccessKey 访问的 RAM 用户,保存 AccessKey,然后为该用户授予 - AliyunOSSFullAccess权限。
- 使用 RAM 用户 AccessKey 配置环境变量。 - Linux- 在命令行界面执行以下命令来将环境变量设置追加到 - ~/.bashrc文件中。- echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc- 执行以下命令使变更生效。 - source ~/.bashrc
- 执行以下命令检查环境变量是否生效。 - echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
 
 - macOS- 在终端中执行以下命令,查看默认Shell类型。 - echo $SHELL- 根据默认Shell类型进行操作。 - Zsh- 执行以下命令来将环境变量设置追加到 - ~/.zshrc文件中。- echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
- 执行以下命令使变更生效。 - source ~/.zshrc
- 执行以下命令检查环境变量是否生效。 - echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
 - Bash- 执行以下命令来将环境变量设置追加到 - ~/.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
- 执行以下命令使变更生效。 - source ~/.bash_profile
- 执行以下命令检查环境变量是否生效。 - echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
 
 
 - Windows- CMD- 在CMD中运行以下命令。 - setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"- 运行以下命令,检查环境变量是否生效。 - echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
 
 - PowerShell- 在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)- 运行以下命令,检查环境变量是否生效。 - [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
 
 
初始化客户端
使用地域和访问域名初始化 OSSClient,并运行测试代码。
import alibabacloud_oss_v2 as oss
def main():
    """
    Python SDK V2 客户端初始化配置说明:
    1. 签名版本:Python SDK V2 默认使用 V4 签名,提供更高的安全性
    2. Region配置:初始化 Client 时,必须指定阿里云 Region ID 作为请求地域标识,例如华东1(杭州)Region ID:cn-hangzhou
    3. Endpoint配置:
       - 可通过Endpoint参数自定义服务请求的访问域名
       - 当不指定 Endpoint 时,将根据 Region 自动构造公网访问域名,例如Region为cn-hangzhou时,构造访问域名为:https://oss-cn-hangzhou.aliyuncs.com
    4. 协议配置:
       - SDK 默认使用 HTTPS 协议构造访问域名
       - 如需使用 HTTP 协议,在指定域名时明确指定:http://oss-cn-hangzhou.aliyuncs.com
    """
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 方式一:只填写Region(推荐)
    # 必须指定Region ID,以华东1(杭州)为例,Region填写为cn-hangzhou,SDK会根据Region自动构造HTTPS访问域名
    cfg.region = 'cn-hangzhou' 
    # # 方式二:同时填写Region和Endpoint
    # # 必须指定Region ID,以华东1(杭州)为例,Region填写为cn-hangzhou
    # cfg.region = 'cn-hangzhou'
    # # 填写Bucket所在地域对应的公网Endpoint。以华东1(杭州)为例,Endpoint填写为'https://oss-cn-hangzhou.aliyuncs.com'
    # cfg.endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 定义要上传的字符串内容
    text_string = "Hello, OSS!"
    data = text_string.encode('utf-8')  # 将字符串编码为UTF-8字节串
    # 执行上传对象的请求,指定存储空间名称、对象名称和数据内容
    result = client.put_object(oss.PutObjectRequest(
        bucket="Your Bucket Name",
        key="Your Object Key",
        body=data,
    ))
    # 输出请求的结果状态码、请求ID、ETag,用于检查请求是否成功
    print(f'status code: {result.status_code}\n'
          f'request id: {result.request_id}\n'
          f'etag: {result.etag}'
    )
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数运行后将会输出上传文件成功的结果:
status code: 200
request id: 6875F95738B0ED3030F086A0
etag: "56AAD346F0899BFE8BDD02C06BBE511E"客户端配置
使用自定义域名
使用OSS默认域名访问时,可能会出现文件禁止访问、文件无法预览等问题;通过通过自定义域名访问OSS,不仅支持浏览器直接预览文件,还可结合CDN加速分发。
import alibabacloud_oss_v2 as oss
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    # 请填写您的自定义域名。例如www.example-***.com
    cfg.endpoint = 'https://www.example-***.com'
    # 请注意,设置true开启CNAME选项,否则无法使用自定义域名
    cfg.use_cname = True
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数超时控制
import alibabacloud_oss_v2 as oss
from typing import Dict, Any
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载默认的配置信息
    cfg = oss.config.load_default()
    # 设置建立连接的超时时间, 默认值 10秒
    cfg.connect_timeout = 30
    # 设置应用读写数据的超时时间, 默认值 20秒
    cfg.readwrite_timeout = 30
    # 设置凭证提供者
    cfg.credentials_provider = credentials_provider
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数重试策略
import alibabacloud_oss_v2 as oss
def main():
    """
    SDK 重试策略配置说明:
    默认重试策略:
    当没有配置重试策略时,SDK 使用 StandardRetryer() 作为客户端的默认实现,其默认配置如下:
    - max_attempts:设置最大尝试次数。默认为3次
    - max_backoff:设置最大退避时间(单位:秒)。默认为20秒
    - base_delay:设置基础延迟时间(单位:秒)。默认为0.2秒
    - backoff_delayer:设置退避算法。默认使用FullJitter退避算法
      计算公式为:[0.0, 1.0) * min(2^attempts * baseDelay, maxBackoff)
    - error_retryables:可重试的错误类型,请参阅https://gosspublic.alicdn.com/sdk-doc/alibabacloud-oss-python-sdk-v2/latest/_modules/alibabacloud_oss_v2/retry/error_retryable.html
    当发生可重试错误时,将使用其提供的配置来延迟并随后重试该请求。
    请求的总体延迟会随着重试次数而增加,如果默认配置不满足您的场景需求时,
    可配置重试参数或者修改重试实现。
    """
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载默认的配置信息
    cfg = oss.config.load_default()
    # 配置重试策略示例:
    # 1. 自定义最大重试次数(默认为3次,这里设置为5次)
    cfg.retryer = oss.retry.StandardRetryer(max_attempts=5)
    # 2. 自定义退避延迟时间
    # 调整基础延迟时间 base_delay 为0.5秒(默认0.2秒),最大退避时间 max_backoff 为25秒(默认20秒)
    # cfg.retryer = oss.retry.StandardRetryer(max_backoff=25, base_delay=0.5)
    # 3. 自定义退避算法
    # 使用固定时间退避算法替代默认的FullJitter算法,每次延迟2秒
    # cfg.retryer = oss.retry.StandardRetryer(backoff_delayer=oss.retry.FixedDelayBackoff(2))
    # 4. 禁用重试策略
    # 如需禁用所有重试尝试时,可以使用retry.NopRetryer实现
    # cfg.retryer = oss.retry.NopRetryer()
    # 设置凭证提供者
    cfg.credentials_provider = credentials_provider
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数设置连接池大小
在http_client中指定max_connections参数即可配置连接池大小。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# OSS Python SDK V2 连接池配置示例
import alibabacloud_oss_v2 as oss
def main():
    # 从环境变量中加载访问凭证(需要设置OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    config = oss.config.load_default()
    config.credentials_provider = credentials_provider
    # 设置OSS服务地域
    config.region = "cn-hangzhou"
    # ============ 自定义HTTPClient配置 ============
    # 创建HTTP客户端配置参数字典
    http_client_config = {}
    
    # 设置连接池大小为100,默认为20
    http_client_config["max_connections"] = 100
    
    # 使用自定义配置创建HTTP客户端
    http_client = oss.transport.RequestsHttpClient(**http_client_config)
    
    # 将自定义的HTTP客户端设置到配置对象中
    config.http_client = http_client
    # ============================================
    
    # 初始化OSS客户端实例
    client = oss.Client(config)
    # 配置Bucket和文件信息
    bucket = "example-bucket"             # Bucket名称
    key = "dest.jpg"                      # OSS中的文件路径
    file_path = "dest.jpg"                # 本地保存路径
    # 将OSS中的文件下载到本地指定路径
    client.get_object_to_file(oss.GetObjectRequest(bucket, key), file_path)
    print(f"文件下载完成: {key} -> {file_path}")
    print(f"连接池大小已设置为: {http_client_config['max_connections']}")
if __name__ == "__main__":
    # 程序入口点
    try:
        main()
    except Exception as e:
        print(f"运行过程中发生错误: {e}")
        raise
HTTP/HTTPS 协议
使用 cfg.disable_ssl = True 设置不使用HTTPS协议。
import alibabacloud_oss_v2 as oss
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    # 设置不使用https请求
    cfg.disable_ssl = True
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数代理服务器
企业安全策略通常限制直接访问公网,配置代理服务器访问 OSS。
import alibabacloud_oss_v2 as oss
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    # 设置user_agent
    cfg.user_agent = 'aliyun-sdk-python'
    # 设置代理服务器
    cfg.proxy_host = 'http://user:passswd@proxy.example-***.com'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数使用内网域名
使用内网域名访问同地域的OSS资源,可以降低流量成本并提高访问速度。
import alibabacloud_oss_v2 as oss
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 方式一: 填写Region并设置use_internal_endpoint为true
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    cfg.use_internal_endpoint = True
    # # 方式二: 直接填写Region和Endpoint
    # # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    # cfg.region = 'cn-hangzhou'
    # # 填写Bucket所在地域对应的内网Endpoint。以华东1(杭州)为例,Endpoint填写为'oss-cn-hangzhou-internal.aliyuncs.com'
    # cfg.endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数使用传输加速域名
import alibabacloud_oss_v2 as oss
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 方式一: 填写Region并设置use_accelerate_endpoint为true
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    cfg.use_accelerate_endpoint = True
    # # 方式二: 直接填写Region和传输加速Endpoint
    # # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    # cfg.region = 'cn-hangzhou'
    # # 填写Bucket所在地域对应的传输加速Endpoint,例如'https://oss-accelerate.aliyuncs.com'
    # cfg.endpoint = 'https://oss-accelerate.aliyuncs.com'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数使用专有域
import alibabacloud_oss_v2 as oss
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    # 请填写您的专有域。例如:https://service.corp.example.com
    cfg.endpoint = 'https://service.corp.example.com'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数使用金融云域名
以下是使用金融云域名配置OSSClient的示例代码。
import alibabacloud_oss_v2 as oss
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 填写Region和Endpoint
    # 填写Bucket所在地域。以华东1 金融云为例,Region填写为cn-hangzhou-finance
    cfg.region = 'cn-hangzhou-finance'
    # 填写Bucket所在地域对应的内网Endpoint。以华东1 金融云为例,Endpoint填写为'https://oss-cn-hzjbp-a-internal.aliyuncs.com',
    # 如需指定为http协议,请在指定域名时填写为'http://oss-cn-hzjbp-a-internal.aliyuncs.com'
    cfg.endpoint = 'https://oss-cn-hzjbp-a-internal.aliyuncs.com'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数使用政务云域名
以下是使用政务云域名配置OSSClient的示例代码。
import alibabacloud_oss_v2 as oss
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 填写Region和Endpoint
    # 填写Bucket所在地域。以华北2 阿里政务云1为例,Region填写为cn-north-2-gov-1
    cfg.region = 'cn-north-2-gov-1'
    # 填写Bucket所在地域对应的内网Endpoint。以华北2 阿里政务云1为例,Endpoint填写为'https://oss-cn-north-2-gov-1-internal.aliyuncs.com',
    # 如需指定为http协议,请在指定域名时填写为'http://oss-cn-north-2-gov-1-internal.aliyuncs.com'
    cfg.endpoint = 'https://oss-cn-north-2-gov-1-internal.aliyuncs.com'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数自定义HTTPClient
当常用配置参数无法满足场景需求时,您可以使用cfg.http_client替换默认的 HTTP 客户端。
import alibabacloud_oss_v2 as oss
from typing import Dict, Any
def main():
    # 从环境变量中加载凭证信息,用于身份验证
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    # 加载默认的配置信息
    cfg = oss.config.load_default()
    # 设置HTTP客户端的参数
    kwargs: Dict[str, Any] = {}
    # 设置session
    # kwargs["session"] = requests.Session()
    # 设置adapter
    # kwargs["adapter"] = HTTPAdapter()
    # 是否跳过证书检查,默认不跳过
    # kwargs["insecure_skip_verify"] = False
    # 是否打开启HTTP重定向,默认不启用
    # kwargs["enabled_redirect"] = False
    # 设置代理服务器
    # kwargs["proxy_host"] = config.proxy_host
    # 设置块大小
    # kwargs["block_size"] = 16 * 1024
    # 连接超时, 默认值 10秒
    kwargs["connect_timeout"] = 30
    # 应用读写数据的超时时间, 默认值 20秒
    kwargs["readwrite_timeout"] = 30
    # 最大连接数,默认值 20
    kwargs["max_connections"] = 1024
    # 创建HTTP客户端,并传入HTTP客户端参数
    cfg.http_client = oss.transport.RequestsHttpClient(**kwargs)
    # 设置凭证提供者
    cfg.credentials_provider = credentials_provider
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数访问凭证配置
OSS 提供多种凭证初始化方式。请根据您的认证和授权需求选择合适的初始化方式。
使用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进行轮换。 
环境变量
- 使用RAM用户AccessKey配置环境变量。 - Linux- 在命令行界面执行以下命令来将环境变量设置追加到 - ~/.bashrc文件中。- echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc- 执行以下命令使变更生效。 - source ~/.bashrc
- 执行以下命令检查环境变量是否生效。 - echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
 
 - macOS- 在终端中执行以下命令,查看默认Shell类型。 - echo $SHELL- 根据默认Shell类型进行操作。 - Zsh- 执行以下命令来将环境变量设置追加到 - ~/.zshrc文件中。- echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
- 执行以下命令使变更生效。 - source ~/.zshrc
- 执行以下命令检查环境变量是否生效。 - echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
 - Bash- 执行以下命令来将环境变量设置追加到 - ~/.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
- 执行以下命令使变更生效。 - source ~/.bash_profile
- 执行以下命令检查环境变量是否生效。 - echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
 
 
 - Windows- CMD- 在CMD中运行以下命令。 - setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"- 运行以下命令,检查环境变量是否生效。 - echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
 
 - PowerShell- 在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)- 运行以下命令,检查环境变量是否生效。 - [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
 
 
- 参考上述方式修改系统环境变量后,请重启或刷新您的编译运行环境,包括IDE、命令行界面、其他桌面应用程序及后台服务,以确保最新的系统环境变量成功加载。 
- 使用环境变量来传递凭证信息。 - import alibabacloud_oss_v2 as oss def main(): # 从环境变量中加载凭证信息,用于身份验证 credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # 加载SDK的默认配置,并设置凭证提供者 cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = 'cn-hangzhou' # 使用配置好的信息创建OSS客户端 client = oss.Client(cfg) # 使用创建好的client执行后续操作... # 当此脚本被直接运行时,调用main函数 if __name__ == "__main__": main() # 脚本入口,当文件被直接运行时调用main函数
静态凭证
以下示例代码展示了如何对访问凭据直接进行硬编码,显式设置要使用的访问密钥。
请勿将访问凭据嵌入到生产环境的应用程序中,此方法仅用于测试目的。
import alibabacloud_oss_v2 as oss
def main():
    # 创建静态凭证提供者,显式设置访问密钥和密钥密码,请替换为您的RAM用户的AccessKey ID和AccessKey Secret
    credentials_provider = oss.credentials.StaticCredentialsProvider(
        access_key_id="RAM AccessKey ID",
        access_key_secret="RAM AccessKey Secret"
    )
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数使用STS临时访问凭证
如果您的应用程序需要临时访问OSS,您可以使用通过STS服务获取的临时身份凭证(Access Key ID、Access Key Secret和Security Token)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个STS Token,存在安全性风险和维护复杂度增加的风险。此外,如果您需要多次临时访问OSS,您需要手动刷新STS Token。
- 如果您希望通过OpenAPI的方式简单快速获取到STS临时访问凭证,请参见AssumeRole - 获取扮演角色的临时身份凭证。 
- 如果您希望通过SDK的方式获取STS临时访问凭证,请参见使用STS临时访问凭证访问OSS。 
- 请注意,STS Token在生成的时候需要指定过期时间,过期后自动失效不能再使用。 
- 如果您希望获取关于STS服务的接入点列表,请参见服务接入点。 
环境变量
- 使用临时身份凭证设置环境变量。 - Mac OS X/Linux/Unix警告- 请注意,此处使用的是通过STS服务获取的临时身份凭证(Access Key ID、Access Key Secret和Security Token),而非RAM用户的Access Key和Access Key Secret。 
- 请注意区分STS服务获取的Access Key ID以STS开头,例如“STS.L4aBSCSJVMuKg5U1****”。 
 - 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.L4aBSCSJVMuKg5U1****”。 
 - 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>
- 通过环境变量来传递凭证信息。 - import alibabacloud_oss_v2 as oss def main(): # 从环境变量中加载访问OSS所需的认证信息,用于身份验证 credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # 加载SDK的默认配置,并设置凭证提供者 cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = 'cn-hangzhou' # 使用配置好的信息创建OSS客户端 client = oss.Client(cfg) # 使用创建好的client执行后续操作... # 当此脚本被直接运行时,调用main函数 if __name__ == "__main__": main() # 脚本入口,当文件被直接运行时调用main函数
静态凭证
以下示例代码展示了如何对访问凭据直接进行硬编码,显式设置要使用的临时访问密钥。
请勿将访问凭据嵌入到生产环境的应用程序中,此方法仅用于测试目的。
import alibabacloud_oss_v2 as oss
def main():
    # 填写获取的临时访问密钥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)。
    sts_security_token = 'yourSecurityToken'
    # 创建静态凭证提供者,显式设置临时访问密钥AccessKey ID和AccessKey Secret,以及STS安全令牌
    credentials_provider = oss.credentials.StaticCredentialsProvider(
        access_key_id=sts_access_key_id,
        access_key_secret=sts_access_key_secret,
        security_token=sts_security_token,
    )
    # 加载SDK的默认配置,并设置凭证提供者
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou
    cfg.region = 'cn-hangzhou'
    # 使用配置好的信息创建OSS客户端
    client = oss.Client(cfg)
    # 使用创建好的client执行后续操作...
# 当此脚本被直接运行时,调用main函数
if __name__ == "__main__":
    main()  # 脚本入口,当文件被直接运行时调用main函数使用RAMRoleARN
如果您的应用程序需要授权访问OSS,例如跨阿里云账号访问OSS,您可以使用RAMRoleARN初始化凭证提供者。该方式底层实现是STS Token。通过指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具会前往STS服务获取STS Token,并在会话到期前调用AssumeRole接口申请新的STS Token。此外,您还可以通过为policy赋值来限制RAM角色到一个更小的权限集合。
- 阿里云账号拥有资源的全部权限,AK一旦泄露,会给系统带来巨大风险,不建议使用。推荐使用最小化授权的RAM用户的AK。 
- 如需创建RAM用户的AK,请直接访问创建AccessKey。RAM用户的Access Key ID、Access Key Secret信息仅在创建时显示,请及时保存,如若遗忘请考虑创建新的AK进行轮换。 
- 如需获取RAMRoleARN,请直接访问CreateRole - 创建角色。 
- 添加alibabacloud_credentials依赖。 - pip install alibabacloud_credentials
- 配置AK和RAMRoleARN作为访问凭证。 - # -*- coding: utf-8 -*- import os from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config import alibabacloud_oss_v2 as oss def main(): 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>', # 设置角色会话有效期,单位为秒,默认值为3600秒(1小时),非必填 role_session_expiration=3600 ) cred_client = Client(config) def get_credentials_wrapper(): cred = cred_client.get_credential() return oss.credentials.Credentials(access_key_id=cred.access_key_id, access_key_secret=cred.access_key_secret, security_token=cred.security_token) # 创建凭证提供者,用于动态加载凭证 credentials_provider = oss.credentials.CredentialsProviderFunc(func=get_credentials_wrapper) # 加载OSS SDK的默认配置 cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = 'cn-hangzhou' # 创建OSS客户端实例 client = oss.Client(cfg) # 使用client进行后续操作... # 当此脚本被直接运行时,调用main函数 if __name__ == "__main__": main() # 脚本入口,当文件被直接运行时调用main函数
使用ECSRAMRole
如果您的应用程序运行在ECS实例、ECI实例、容器服务Kubernetes版的Worker节点中,建议您使用ECSRAMRole初始化凭证提供者。该方式底层实现是STS Token。ECSRAMRole允许您将一个角色关联到ECS实例、ECI实例或容器服务 Kubernetes 版的Worker节点,实现在实例内部自动刷新STS Token。该方式无需您提供一个AK或STS Token,消除了手动维护AK或STS Token的风险。如何获取ECSRAMRole,请参见CreateRole - 创建角色。
- 添加alibabacloud_credentials依赖。 - pip install alibabacloud_credentials
- 配置ECSRAMRole作为访问凭证。 - from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config import alibabacloud_oss_v2 as oss def main(): config = Config( type='ecs_ram_role', # 访问凭证类型。固定为ecs_ram_role。 role_name='EcsRoleExample' # 为ECS授予的RAM角色的名称。可选参数。如果不设置,将自动检索。强烈建议设置,以减少请求。 ) cred_client = Client(config) def get_credentials_wrapper(): cred = cred_client.get_credential() return oss.credentials.Credentials(access_key_id=cred.access_key_id, access_key_secret=cred.access_key_secret, security_token=cred.security_token) # 创建凭证提供者,用于动态加载凭证 credentials_provider = oss.credentials.CredentialsProviderFunc(func=get_credentials_wrapper) # 加载OSS SDK的默认配置 cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。 cfg.region = 'cn-hangzhou' # 创建OSS客户端实例 client = oss.Client(cfg) # 使用client进行后续操作... # 当此脚本被直接运行时,调用main函数 if __name__ == "__main__": main() # 脚本入口,当文件被直接运行时调用main函数
使用OIDCRoleARN
在容器服务Kubernetes版中设置了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权限隔离。
- 添加alibabacloud_credentials依赖。 - pip install alibabacloud_credentials
- 配置OIDCRoleArn作为访问凭证。 - # -*- coding: utf-8 -*- import os from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config import alibabacloud_oss_v2 as oss def main(): 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>', # 设置角色会话有效期,单位为秒,默认值为3600秒(1小时),非必填 role_session_expiration=3600 ) cred_client = Client(config) def get_credentials_wrapper(): cred = cred_client.get_credential() return oss.credentials.Credentials(access_key_id=cred.access_key_id, access_key_secret=cred.access_key_secret, security_token=cred.security_token) # 创建凭证提供者,用于动态加载凭证 credentials_provider = oss.credentials.CredentialsProviderFunc(func=get_credentials_wrapper) # 加载OSS SDK的默认配置 cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。 cfg.region = 'cn-hangzhou' # 创建OSS客户端实例 client = oss.Client(cfg) # 使用client进行后续操作... # 当此脚本被直接运行时,调用main函数 if __name__ == "__main__": main() # 脚本入口,当文件被直接运行时调用main函数
使用自定义访问凭证
当以上凭证配置方式不满足要求时,您可以自定义获取凭证的方式。SDK 支持多种实现方式。
- 通过credentials.CredentialsProviderFunc接口 - import argparse import alibabacloud_oss_v2 as oss import os def main(): def get_credentials_wrapper(): # 返回长期凭证 return oss.credentials.Credentials(access_key_id='access_key_id', access_key_secret='access_key_security') # 返回STS临时凭证 # return oss.credentials.Credentials(access_key_id='access_key_id', access_key_secret='access_key_security', security_token='security_token') credentials_provider = oss.credentials.CredentialsProviderFunc(func=get_credentials_wrapper) # 加载SDK的默认配置,并设置凭证提供者 cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = "cn-hangzhou" # 使用配置好的信息创建OSS客户端 client = oss.Client(cfg) # 使用client进行后续操作... if __name__ == "__main__": main() # 脚本入口,当文件被直接运行时调用main函数
- 实现credentials.CredentialsProvider接口 - # -*- coding: utf-8 -*- import alibabacloud_oss_v2 as oss class CredentialProviderWrapper(oss.credentials.CredentialsProvider): def get_credentials(self): # TODO # 自定义访问凭证的获取方法 # 返回长期凭证access_key_id, access_key_secrect return oss.credentials.Credentials('<access_key_id>', '<access_key_secrect>') # 返回 STS临时凭证access_key_id, access_key_secrect, token # 对于临时凭证,需要根据过期时间,刷新凭证。 # return oss.credentials.Credentials('<access_key_id>', '<access_key_secrect>', '<token>'); def main(): # 创建凭证提供者,用于动态加载凭证 credentials_provider = CredentialProviderWrapper() # 加载OSS SDK的默认配置 cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou cfg.region = 'cn-hangzhou' client = oss.Client(cfg) # 使用client进行后续操作... if __name__ == "__main__": main() # 脚本入口,当文件被直接运行时调用main函数
错误自助排查
使用OSS Python SDK V2访问OSS出现错误时,OSS会返回HTTP Code、Message、RequestId、EC错误码等信息,其中EC码对应一个具体的错误原因,您可以使用EC码自助进行错误排查。
- 例如,当您使用以下代码下载一个并不存在的文件时。 - import alibabacloud_oss_v2 as oss def main(): # 从环境变量中加载凭证信息,用于身份验证 credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # 加载SDK的默认配置,并设置凭证提供者 cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # 设置配置中的区域信息 cfg.region = 'cn-hangzhou' # 使用配置好的信息创建OSS客户端 client = oss.Client(cfg) # 执行获取对象的请求,指定存储空间名称和对象名称 result = client.get_object(oss.GetObjectRequest( bucket="Your Bucket Name", # 指定存储空间名称 key="Your Object Key", # 指定对象键名 )) # 输出获取对象的结果信息,用于检查请求是否成功 print(f'status code: {result.status_code},' f' request id: {result.request_id},' ) # 使用上下文管理器确保资源释放 with result.body as body_stream: data = body_stream.read() print(f"文件读取完成,数据长度:{len(data)} bytes") path = "./get-object-sample.txt" with open(path, 'wb') as f: f.write(data) print(f"文件下载完成,保存至路径:{path}") # 当此脚本被直接运行时,调用main函数 if __name__ == "__main__": main() # 脚本入口,当文件被直接运行时调用main函数
- 返回示例如下,返回结果中包含'EC': '0026-00000001',作为该错误原因的唯一标识。  
- 通过以上错误请求示例返回的EC错误码查找问题原因及对应解决方法的操作步骤如下。 - 在搜索框中,输入EC错误码,例如0026-00000001。  
- 在搜索结果中查找问题原因及对应解决方案。  
 
示例代码
OSS Python SDK V2提供丰富的示例代码供参考或直接使用。
| 示例内容 | GitHub示例文件 | 
| - |