
# 快速入门(Python SDK)
#### 创建AK、SK
OBS通过用户账户中的AK和SK进行签名验证，确保通过授权的账户才能访问指定的OBS资源。以下是对AK和SK的解释说明：
- AK：Access Key ID，接入键标识，用户在对象存储服务系统中的接入键标识，一个接入键标识唯一对应一个用户，一个用户可以同时拥有多个接入键标识。对象存储服务系统通过接入键标识识别访问系统的用户。
- SK：Secret Access Key，安全接入键，用户在对象存储服务系统中的安全接入键，是用户访问对象存储服务系统的密钥，用户根据安全接入键和请求头域生成鉴权信息。安全接入键和接入键标识一一对应。
访问密钥分永久访问密钥（AK/SK）和临时访问密钥（AK/SK和SecurityToken）两种。每个用户最多可创建两个有效的永久访问密钥。临时访问密钥只在设置的有效期内能够访问OBS，过期后需要重新获取。出于安全性考虑，建议您使用临时访问密钥访问OBS，或使用永久访问密钥访问OBS时，定期更新您的访问密钥（AK/SK）。两种密钥的获取方式如下所示。
- 永久访问密钥：
  1. 登录[管理控制台](https://console.huaweicloud.com)。
  
  2. 单击页面右上角的用户名，并选择"我的凭证"。
  
  3. 在"我的凭证"页面，单击左侧导航栏的"访问密钥"。
  
  4. 在"访问密钥"页面，单击"新增访问密钥"。
     ![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
     每个用户最多可创建两个有效的访问密钥。
     
  
  5. 在弹出的"新增访问密钥"对话框中，输入描述内容（建议），单击"确定"。
  
  6. （可选）在弹出的"身份验证"对话框中，选择合适的验证方式进行验证，单击"确定"。
  
  7. 在弹出的"创建成功"提示框中，单击"立即下载"后，密钥会直接保存到浏览器默认的下载文件夹中。
  
  8. 打开下载下来的"credentials.csv"文件即可获取到访问密钥（AK和SK）。
  
  
  ![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
  - 在密钥文件中，Access Key ID列对应的值即AK，Secret Access Key列对应的值即SK。
  
  - 为防止访问密钥泄露，建议您将其保存到安全的位置。如果用户在此提示框中单击"取消"，则不会下载密钥，后续也将无法重新下载。如果需要使用访问密钥，可以重新创建新的访问密钥。
    
 
- 临时访问密钥： 临时AK/SK和SecurityToken是系统颁发给用户的临时访问令牌，通过接口设置有效期，范围为15分钟至24小时，过期后需要重新获取。临时AK/SK和SecurityToken遵循权限最小化原则。使用临时AK/SK鉴权时，临时AK/SK和SecurityToken必须同时使用。
  获取临时访问密钥的接口请参考[获取临时AK/SK和securitytoken](https://support.huaweicloud.com/api-iam/iam_04_0002.html)。
  ![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
  OBS属于全局级服务，所以在获取临时访问密钥时，需要设置Token的使用范围取值为domain，表示获取的Token可以作用于全局服务，全局服务不区分项目或者区域。
  
#### 获取服务地址
- 您可以从[这里](https://developer.huaweicloud.com/endpoint?OBS)查看OBS当前开通的服务地址和区域信息。
![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
SDK支持带协议名和不带协议名两种方式传入服务地址，例如获取到的服务地址为"your-endpoint"，则初始化OBS客户端时传入的服务地址可以为"http://your-endpoint"、"https://your-endpoint"和"your-endpoint"三种形式。
#### 初始化OBS客户端
向OBS发送任一HTTP/HTTPS请求之前，必须先创建一个ObsClient实例：
```
# 引入模块
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) 
# 使用访问OBS
# 关闭obsClient
obs_client.close()
```
![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
更多关于OBS客户端初始化的内容请参考"[初始化](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0600.html)"章节。
日志配置详见[日志初始化](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0603.html)
#### 创建桶
桶是OBS全局命名空间，相当于数据的容器、文件系统的根目录，可以存储若干对象。
本示例用于创建名为examplebucket的桶，并设置所在区域在华北-北京四（cn-north-4），桶ACL是私有桶，存储类型是标准存储，多AZ方式存储。
```
import os
import traceback
from obs import CreateBucketHeader, HeadPermission
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)
try:
    # 创建桶的附加头域，桶ACL是私有桶，存储类型是标准访问存储，多AZ方式存储
    header = CreateBucketHeader(aclControl=HeadPermission.PRIVATE, storageClass="STANDARD", availableZone="3az")
    # 指定存储桶所在区域，此处以“cn-north-4”为例，必须跟传入的Endpoint中Region保持一致
    location = "cn-north-4"
    bucket_name = "examplebucket"
    # 创建桶
    resp = obs_client.createBucket(bucket_name, header, location)
    # 返回码为2xx时，接口调用成功，否则接口调用失败
    if resp.status < 300:
        print('Create Bucket Succeeded')
        print('requestId:', resp.requestId)
    else:
        print('Create Bucket Failed')
        print('requestId:', resp.requestId)
        print('errorCode:', resp.errorCode)
        print('errorMessage:', resp.errorMessage)
except Exception:
    print('Create Bucket Failed')
    print(traceback.format_exc())
```
![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
- 桶的名字是全局唯一的，所以您需要确保不与已有的桶名称重复。
- 桶命名规则如下：
  - 3～63个字符，数字或字母开头，支持小写字母、数字、"-"、"."。
  
  - 禁止使用类IP地址。
  
  - 禁止以"-"或"."开头及结尾。
  
  - 禁止两个"."相邻（如："my..bucket"）。
  
  - 禁止"."和"-"相邻（如："my-.bucket"和"my.-bucket"）。
   
- 同一用户多次创建同名桶不会报错，创建的桶属性以第一次请求为准。
- 更多创建桶的信息，请参见[创建桶](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0801.html)。
 
![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
- 创建桶时，如果使用的终端节点归属于默认区域华北-北京一（cn-north-1），则可以不指定区域；如果使用的终端节点归属于其他区域，则必须指定区域，且指定的区域必须与终端节点归属的区域一致。当前有效的区域名称可从[这里](https://developer.huaweicloud.com/endpoint?OBS)查询。
- 您可以使用带参数创建方式，在创建桶时，指定桶的区域位置，详情请参考[创建桶](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0801.html)
 
#### 上传对象
本示例用于上传文本对象。
```
import os
import traceback
from obs import ObsClient
# 推荐通过环境变量获取AK/SK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险
# 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
# 运行本代码示例之前，请确保已设置环境变量AccessKeyID和SecretAccessKey
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) 
try: 
    bucket_name = "examplebucket" 
    object_key = "objectname" 
    # 设置待上传的文本内容 
    content = 'Hello OBS' 
    # 上传文本对象 
    resp = obs_client.putContent(bucket_name, object_key, content) 
    # 返回码为2xx时，接口调用成功，否则接口调用失败 
    if resp.status < 300: 
        print('Put Content Succeeded') 
        print('requestId:', resp.requestId) 
        print('etag:', resp.body.etag) 
    else: 
        print('Put Content Failed') 
        print('requestId:', resp.requestId) 
        print('errorCode:', resp.errorCode) 
        print('errorMessage:', resp.errorMessage) 
except Exception: 
    print('Put Content Failed') 
    print(traceback.format_exc())
```
![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
更多上传对象的信息，请参见[上传对象](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0501.html)。
