
# OBS客户端初始化(Python SDK)
#### 功能说明
OBS客户端（ObsClient）是访问OBS服务的Python客户端，它为调用者提供一系列与OBS服务进行交互的接口，用于管理桶和对象等OBS服务上的资源。
#### 方法定义
```
ObsClient(access_key_id, secret_access_key, server)
```
#### 构造函数参数描述
| **参数**                   | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | **建议值**    |
|:---|:---|:---|
| access_key_id            | 访问密钥中的AK。默认为空字符串表示匿名用户。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | N/A        |
| secret_access_key        | 访问密钥中的SK。默认为空字符串表示匿名用户。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | N/A        |
| security_token           | 临时访问密钥中的SecurityToken。 如何获取临时访问密钥和securitytoken请参见[临时访问密钥AK/SK](https://support.huaweicloud.com/api-iam/iam_04_0002.html)获取；                                                                                                                                                                                                                                                                                                                                                                | N/A        |
| server                   | 连接OBS的服务地址。可包含协议类型、域名、端口号。示例：https://your-endpoint:443。（出于安全性考虑，建议使用https协议）                                                                                                                                                                                                                                                                                                                                                                                                                                              | N/A        |
| max_retry_count          | HTTP/HTTPS连接异常时的请求重试次数。默认为3次。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | \[1，5\]    |
| max_redirect_count       | HTTP/HTTPS请求重定向的最大次数。默认为10次                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | \[1, 10\]  |
| timeout                  | HTTP/HTTPS请求超时时间（单位：秒）。默认为60秒。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | \[10， 60\] |
| ssl_verify               | 验证服务端证书参数，即验证服务端证书与客户端证书配置的证书是否一致。可能的取值： - 服务端pem格式根证书文件路径。  - True：从操作系统根证书库中获取服务端证书列表并验证服务端证书（仅支持Windows操作系统）。  - False：表示不验证服务端证书。   默认为False。                                                                                                                 | N/A        |
| custom_ciphers           | 指定https建链时使用的算法套件。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | N/A        |
| chunk_size               | 读写socket流时的块大小（单位：字节），您可以根据自身需求设置块大小。默认为65536字节。                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 默认         |
| long_conn_mode           | 是否启用长连接模式。默认为False。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | N/A        |
| proxy_host               | 代理服务器的主机地址。默认为空。 说明： 请注意，代理服务器的主机地址不要指定http://或https://；                                                                                                                                                                                                                                                                                                                                                                                                        | N/A        |
| proxy_port               | 代理服务器的端口号。默认为空。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | N/A        |
| proxy_username           | 连接代理服务器时使用的用户名。默认为空。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | N/A        |
| proxy_password           | 连接代理服务器时使用的用户密码。默认为空。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | N/A        |
| is_cname                 | 是否通过自定义域名访问OBS服务。默认为False。 更多关于自定义域名相关信息请参见[自定义域名](https://support.huaweicloud.com/usermanual-obs/obs_03_0032.html)。 说明： 为了保护您的业务不受华为云公共域名被相关机构接管的影响，建议优先选择自定义域名。                                                                                                                                                                                                                                     | N/A        |
| security_providers       | 指定允许的访问密钥搜索方式，OBS客户端将使用该参数指定的搜索方式，搜索并获取访问密钥。默认为None。 说明： security_providers参数必须采用列表形式，默认情况下security_providers为None，此时默认提供从环境变量中获取访问密钥，或从ECS服务器获取临时访问密钥两种方式作为security_providers的默认搜索方式。 当指定了security_providers参数时，则不会提供默认搜索方式，此时仅可以使用security_providers中提供的搜索方式。                                                                                                                                                                    | N/A        |
| security_provider_policy | 指定访问密钥搜索策略。默认为None。 说明： - security_provider_policy参数用于设置搜索策略，默认为None，此时需要显示指定访问密钥；同时，在已经指定了访问密钥参数的情况下，security_provider_policy参数将被忽略。  - security_provider_policy设置为OBS_DEFAULT时采用链式搜索方式获取访问密钥；  - 设置security_provider_policy为预定义方式名（ENV，ECS）时采用对应方式获取访问密钥。   | N/A        |
   
![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
- 建议值为N/A的表示需要根据实际情况进行设置。
- 如网络状况不佳，建议增大timeout的值。
- 如果设置的server不带协议类型，则默认使用HTTPS协议。
 
![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
- 如果启用了长连接模式，使用完OBS客户端后必须调用ObsClient.close方法显式关闭，回收连接资源。
- 出于DNS解析性能和OBS服务可靠性的考虑，不允许将server设置为IP，必须使用域名访问OBS服务。
 
#### 代码样例
- 通过构造函数创建OBS客户端，永久访问密钥（AK/SK）创建OBS客户端代码如下：
  ```
  # 引入模块
  import os
  from obs import ObsClient
  # 推荐通过环境变量获取AK/SK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
  # 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
  ak = os.getenv("AccessKeyID")
  sk = os.getenv("SecretAccessKey")
  #  server填写Bucket对应的Endpoint, 这里以华北-北京四为例，其他地区请按实际情况填写。
  server = "https://obs.cn-north-4.myhuaweicloud.com"
  # 创建obsClient实例
  obs_client = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
  # 使用访问OBS
  # 关闭obs_client
  obs_client.close()
  ```
  
- 临时访问密钥（AK/SK和SecurityToken）创建OBS客户端代码如下：
  ```
  # 引入模块
  import os
  from obs import ObsClient
  # 推荐通过环境变量获取AK/SK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
  # 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
  ak = os.getenv("AccessKeyID")
  sk = os.getenv("SecretAccessKey")
  # 【可选】如需使用临时AK/SK和SecurityToken访问OBS，则同样推荐通过环境变量获取
  security_token = os.getenv("SecurityToken")
  #  server填写Bucket对应的Endpoint, 这里以华北-北京四为例，其他地区请按实际情况填写。
  server = "https://obs.cn-north-4.myhuaweicloud.com"
  # 创建obsClient实例
  # 如需使用临时AK/SK和SecurityToken访问OBS，需要在创建实例时通过security_token参数指定securityToken值
  obs_client = ObsClient(
      access_key_id=ak,
      secret_access_key=sk,
      server=server,
      security_token=security_token
  )
  # 使用访问OBS
  # 关闭obs_client
  obs_client.close()
  ```
  
- 指定获取临时访问密钥的方式
  - 使用单一的获取方式，以从环境变量获取访问密钥的方式为例：
    ```
    # 引入模块
    from obs import ObsClient
    from obs import loadtoken
    # 创建ObsClient实例
    # 提供ENV方式获取访问密钥
    obs_client = ObsClient(
        server='https://your-endpoint',
        security_providers=[loadtoken.ENV]
    )
    # 使用访问OBS
    # 关闭obs_client
    obs_client.close()
    ```
    
   
- 通过配置系统环境变量的方式或者通过访问ECS服务器获取临时访问密钥的方式创建OBS客户端。
  - 使用ENV方式创建OBS客户端的代码如下：
    ```
    # 引入模块
    from obs import ObsClient
    # 创建ObsClient实例
    # 提供ENV方式获取访问密钥
    obs_client = ObsClient(
        server='https://your-endpoint',
        security_provider_policy='ENV'
    )
    # 使用访问OBS
    # 关闭obs_client
    obs_client.close()
    ```
    ![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
    以上方式会从当前系统的环境变量中寻找访问密钥，需要对应在环境变量中定义OBS_ACCESS_KEY_ID、OBS_SECRET_ACCESS_KEY字段。同时如果采用临时访问密钥时，还需要在环境变量中定义OBS_SECURITY_TOKEN字段。
    
  
  - 使用ECS方式创建OBS客户端的代码如下：
    ```
    # 引入模块
    from obs import ObsClient
    # 创建ObsClient实例
    # 提供ECS方式获取临时访问密钥
    obs_client = ObsClient(
        server='https://your-endpoint',
        security_provider_policy='ECS'
    )
    # 使用访问OBS
    # 关闭obs_client
    obs_client.close()
    ```
    ![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
    当应用程序部署在ECS服务器上时，可以采用以上方式从ECS服务器上自动获取临时访问密钥和定期自动刷新。
    如果客户端报401错误，则需要排查在创建ECS时是否有添加委托。
    ![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
    在使用该方式获取临时访问密钥时，请确保服务端和应用程序部署所在环境的UTC时间一致，否则可能会导致临时访问密钥无法及时刷新的问题。
    
   
- 除了上述指定一种方式获取访问密钥外，还可以以链式的形式从环境变量及ECS服务器上进行搜索以获取对应的访问密钥。
  - 通过设定security_provider_policy参数为OBS_DEFAULT来指定OBS客户端以链式的方式搜索访问密钥：
    ```
    # 引入模块
    from obs import ObsClient
    # 创建ObsClient实例
    # 以链式的方式从环境变量和ECS中搜索访问密钥 
    obs_client = ObsClient(
        server='https://your-endpoint',
        security_provider_policy='OBS_DEFAULT'
    )
    # 使用访问OBS
    # 关闭obs_client
    obs_client.close()
    ```
    ![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
    以上方式通过设定security_provider_policy为OBS_DEFAULT，可以指定以链式的方式从预定义方式列表中搜索访问密钥。当前默认提供从环境变量中以及从ECS服务器上获取访问密钥两种预定义搜索方式，并按照先从环境变量，再从ECS服务器的顺序进行搜索。链式搜索方式会以第一组成功获取到的访问密钥创建OBS客户端。
    
   
![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
- 工程中可以有多个ObsClient，也可以只有一个ObsClient。

- ObsClient是线程安全的，可在并发场景下使用。
 
