科普|Boto3访问亚马逊S3对象存储范例说明

【关于boto3】

Boto3是亚马逊AWS提供的python SDK,最为常用的功能是S3对象存储的访问。作为标准的S3 SDK,除了访问AWS,也可以访问其他兼容S3 API的云存储厂商。

Boto3的项目地址为:https://github.com/boto/boto3.git

Boto3的AWS doc地址为:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#service-resource


需要指出的是,AWS关于对象存储访问的文档说明较为混乱,现在给大家提供一个简单的使用说明和范例。


【准备】

首先需要安装python,建议使用Python 3.6及以后的版本。

通过pip安装boto3的包即可:

pip install boto3


在你的python脚本直接引用boto3即可:

import boto3


正式使用boto3之前,你还需要具备云存储厂商的access key和secret_key。先给出一对土星云的测试key,有需要的可以去土星云存储官网注册获取。

param_endpoint='https://s3.local-north-1.saturncloud.com.cn:6666'

param_access_key='3ABC8E3ABC387442B3936F9426B11C1B'

param_secret_key='0428D37B0FDC14805AF0153969C272F3'


【创建client】

先初始化一个client对象,我们可以定义一个方法如下:

def setup_client(endpoint, access_key_id, secret_access_key):

return boto3.client(

's3',

aws_access_key_id=access_key_id,

aws_secret_access_key=secret_access_key,

use_ssl=True,

region_name='cn',

endpoint_url=endpoint,

config=Config(s3={"addressing_style": "virtual", "signature_version": 's3v4'}))

再定义一个判断http响应状态的方法:

def is_result_ok(return_obj):

ifcode = return_obj['ResponseMetadata']['HTTPStatusCode']

if ifcode == 200 or ifcode == 204:

return True

else:

return False


然后在main函数中调用创建client的方法:

if __name__ == '__main__':

print('Start SCS testing at '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))


s3=setup_client(param_endpoint, param_access_key, param_secret_key)


【创建存储桶】

以当前时间为名创建一个存储桶:

bucket_id=datetime.datetime.now().strftime('test-%Y%m%d-%H%M%S')

result=cre_bucket(s3, bucket_id)


if is_result_ok(result):

print('bucket ['+bucket_id+'] created ok.')

else:

print('bucket ['+bucket_id+'] created fail.')

print(result)

sys.exit(1)


【上传文件】

定义一个上传文件的方法如下:

def put_obj(s3, bucket_id, filename, local_dir):

return s3.put_object(Bucket=bucket_id, Body=open(local_dir+'/'+filename, 'rb'), Key=filename)

选择一个本地文件上传到刚刚创建的存储桶

param_test_local_dir='/tmp/'

filename='test.txt’

result=put_obj(s3, bucket_id, filename, param_test_local_dir)

if is_result_ok(result):

print('put_obj ['+filename+'] ok.')

else:

print('put_obj ['+filename+'] fail.')

print(result)

return


【下载文件】

定义一个下载文件的方法:

def get_obj(s3, bucket_id, filename):

return s3.get_object(Bucket=bucket_id, Key=filename)

我们再把刚才上传的文件下载下来

result=get_obj(s3, bucket_id, filename)


if is_result_ok(result):

print('get_obj ['+filename+'] ok.')

else:

print('get_obj ['+filename+'] fail.')

print(result)

return


【删除文件】

首先定义一个删除S3存储桶文件的方法

def del_obj(s3, bucket_id, filename):

return s3.delete_object(Bucket=bucket_id, Key=filename)

然后调用此方法即可删除刚刚上传到云端的文件:

result=del_obj(s3, bucket_id, filename)


if is_result_ok(result):

print('del_obj ['+filename+'] ok.')

else:

print('del_obj ['+filename+'] fail.')

print(result)

return


【结语】

上面已经给出了一个简单的使用范例,更多的接口和使用方法,可以查看AWS的文档和云存储厂商的文档。


【附 完整代码】


############################################################################################################

'''

Random test script for saturn cloud systems.


Usage:

1. Change test parameters through modifying param_XXXX in test configurations.

2. Run 'python scs_rand_test.py'

3. For better performance, please set param_test_local_dir to a ramdisk path, such as '/run' in Linux.


Requirement:

1. Python 3.6 or higher version.

2. boto3, use 'pip install boto3 --user' to install.


by sam 2021-10-06

'''

############################################################################################################



import time

import datetime

import os

import sys

import subprocess

import random

import numpy as np

import threading

from queue import Queue


import boto3

from botocore.config import Config


############################################################################################################

'''

Test configurations

'''

############################################################################################################


param_endpoint='https://s3.local-north-1.saturncloud.com.cn:6666'

param_access_key='3ABC8E3ABC387442B3936F9426B11C1B'

param_secret_key='0428D37B0FDC14805AF0153969C272F3'


param_test_local_dir='/tmp/'


param_test_max_blocks=33

param_block_size=256*1024


############################################################################################################

'''

Common used API fuctions

'''

############################################################################################################


def setup_client(endpoint, access_key_id, secret_access_key):

return boto3.client(

's3',

aws_access_key_id=access_key_id,

aws_secret_access_key=secret_access_key,

use_ssl=True,

region_name='cn',

endpoint_url=endpoint,

config=Config(s3={"addressing_style": "virtual", "signature_version": 's3v4'}))


def cre_bucket(s3, bucket_id):

    return s3.create_bucket(Bucket=bucket_id,)


def del_bucket(s3, bucket_id):

return s3.delete_bucket(Bucket=bucket_id,)


def put_obj(s3, bucket_id, filename, local_dir):

    return s3.put_object(Bucket=bucket_id, Body=open(local_dir+'/'+filename, 'rb'), Key=filename)


def get_obj(s3, bucket_id, filename):

return s3.get_object(Bucket=bucket_id, Key=filename)

def del_obj(s3, bucket_id, filename):

    return s3.delete_object(Bucket=bucket_id, Key=filename)


def is_result_ok(return_obj):

ifcode = return_obj['ResponseMetadata']['HTTPStatusCode']

if ifcode == 200 or ifcode == 204:

return True

else:

return False


############################################################################################################

'''

Test applications

'''

############################################################################################################

def create_dummy_file(file_path):

blocks=random.randrange(0, param_test_max_blocks, 1)

last_bytes=random.randrange(1, param_block_size+1, 1)

total_size=blocks*param_block_size+last_bytes


file=open(file_path, mode='wb')

file.write(np.random.bytes(total_size))

file.close()

def test_task(bucket_id):

s3=setup_client(param_endpoint, param_access_key, param_secret_key)


filename='put_obj'

create_dummy_file(param_test_local_dir+'/'+filename)

result=put_obj(s3, bucket_id, filename, param_test_local_dir)


if is_result_ok(result):

print('put_obj ['+filename+'] ok.')

else:

print('put_obj ['+filename+'] fail.')

print(result)

return


result=get_obj(s3, bucket_id, filename)


if is_result_ok(result):

print('get_obj ['+filename+'] ok.')

else:

print('get_obj ['+filename+'] fail.')

print(result)

return


filename_new='get_obj'

file=open(param_test_local_dir+'/'+filename_new, mode='wb')

file.write(result['Body'].read())

file.close()


cmd_string='cmp '+param_test_local_dir+'/'+filename+' '+param_test_local_dir+'/'+filename_new

cmd_result=subprocess.getoutput(cmd_string)


if len(cmd_result)>1:

print('content error at ['+filename+'] and ['+filename_new+']')

return


result=del_obj(s3, bucket_id, filename)


if is_result_ok(result):

print('del_obj ['+filename+'] ok.')

else:

print('del_obj ['+filename+'] fail.')

print(result)

return


cmd_string='rm '+param_test_local_dir+'/'+filename+' '+param_test_local_dir+'/'+filename_new

os.system(cmd_string)




############################################################################################################

'''

Script entrance

'''

############################################################################################################

if __name__ == '__main__':

print('Start SCS random testing at '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))


s3=setup_client(param_endpoint, param_access_key, param_secret_key)


bucket_id=datetime.datetime.now().strftime('test-%Y%m%d-%H%M%S')

result=cre_bucket(s3, bucket_id)


if is_result_ok(result):

print('bucket ['+bucket_id+'] created ok.')

else:

print('bucket ['+bucket_id+'] created fail.')

print(result)

sys.exit(1)

pass


test_task(bucket_id)

result=del_bucket(s3, bucket_id)


if is_result_ok(result):

print('bucket ['+bucket_id+'] deleted ok.')

else:

print('bucket ['+bucket_id+'] deleted fail.')

print(result)

sys.exit(1)

pass


print('End SCS random testing at '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容