download_ossobject_from_aliyun.py

从指定的阿里云OSS Bucket下载所有对象到本地指定的目录。

主要脚本

#!/usr/bin/python3
# download_ossobject_from_aliyun.py

import oss2
import os

def download_objects(bucket_name, endpoint, access_key_id, access_key_secret, local_dir):
    # 配置认证信息
    auth = oss2.Auth(access_key_id, access_key_secret)

    # 初始化Bucket实例
    bucket = oss2.Bucket(auth, endpoint, bucket_name)

    # 如果本地目录不存在,则创建
    if not os.path.exists(local_dir):
        os.makedirs(local_dir)

    # 列出bucket中的所有object并下载
    for obj in oss2.ObjectIterator(bucket):
        # 构建完整的本地文件路径
        local_file_path = os.path.join(local_dir, obj.key)

        # 如果是目录,则创建目录结构
        if obj.key[-1] == '/':
            os.makedirs(local_file_path, exist_ok=True)
        else:
            # 下载文件
            bucket.get_object_to_file(obj.key, local_file_path)
            print(f'Downloaded {obj.key} to {local_file_path}')

# 配置参数
bucket_name = 'bucketname'
endpoint = 'oss-cn-shanghai.aliyuncs.com'
access_key_id = 'AccessKey ID for OSS'
access_key_secret = 'AccessKey Secret for OSS '
local_dir = '/data/app/oss_from_aliyun/data/xxx'

# 调用函数下载文件
download_objects(bucket_name, endpoint, access_key_id, access_key_secret, local_dir)

脚本测试

[root@dev-rocky9-shanghai-area1 ~]# python3 /data/python/download_ossobject_from_aliyun.py # 下载阿里云OSS Bucket 'xxx' 中的所有对象至本地目录 '/data/app/oss_from_aliyun/data/xxx'
Downloaded data/test_txt_for_zhupengfei.txt to /data/app/oss_from_aliyun/data/xxx/data/test_txt_for_zhupengfei.txt

注意检查 OSS 权限

我在首次运行下载脚本的时候遇到了错误信息,根据报错看到可能是AccessKey ID和AccessKey Secret可能没有被赋予下载对象的权限,要么检查并调整RAM对应用户或角色是否具有OSS的GetObject权限。要么检查调整Bucket的ACL(Access Control List)限制了公开访问或者特定用户的访问。

Traceback (most recent call last): File "/data/python/download_ossobject_from_aliyun.py", line 39, in <module> download_objects(bucket_name, endpoint, access_key_id, access_key_secret, local_dir) File "/data/python/download_ossobject_from_aliyun.py", line 28, in download_objects bucket.get_object_to_file(obj.key, local_file_path) File "/usr/local/lib/python3.9/site-packages/oss2/api.py", line 931, in get_object_to_file result = self.get_object(key, byte_range=byte_range, headers=headers, progress_callback=progress_callback, File "/usr/local/lib/python3.9/site-packages/oss2/api.py", line 841, in get_object resp = self.__do_object('GET', key, headers=headers, params=params) File "/usr/local/lib/python3.9/site-packages/oss2/api.py", line 2991, in __do_object return self._do(method, self.bucket_name, key, **kwargs) File "/usr/local/lib/python3.9/site-packages/oss2/api.py", line 241, in _do raise e oss2.exceptions.AccessDenied: {'status': 403, 'x-oss-request-id': 'xxx', 'details': {'Code': 'AccessDenied', 'Message': 'You have no right to access this object because of bucket acl.', 'RequestId': 'xxx', 'HostId': 'xxx.oss-cn-shanghai.aliyuncs.com', 'EC': '0003-00000001', 'RecommendDoc': 'https://api.aliyun.com/troubleshoot?q=0003-00000001'}}

上一篇
下一篇