我一直在运行cmd命令:
~/s3curl/s3curl.pl --id mapreduce -- -sf https://$SERVER/$PATH >> $TEMP_FILE
我想将我的脚本移植到Python。
我尝试过:
import boto3
client = boto3.client('s3')
response = client.get_object(Bucket=<server>, Key=<path>)
但是我遇到一个错误:
botocore.exceptions.ClientError: An error occurred (AllAccessDisabled) when calling the GetObject operation: All access to this object has been disabled
我在做什么错了?
谢谢!
答案 0 :(得分:1)
事实证明,有一个名为.s3curl
的文件与s3curl.pl
位于同一目录中,其中包含用户ID和加密密钥。
我将其翻译为名为s3.yaml
的Yaml文件,其中包含:
awsSecretAccessKeys:
mapreduce:
id: <insert id here>
key: <insert key here>
Pythonic解决方案是:
def download_file_from_s3(s3_server, path, export_path):
url = s3_server + path
with open('s3.yaml') as f:
s3_conf = yaml.load(f.read())['awsSecretAccessKeys']['mapreduce']
now = datetime.now().strftime('%a, %d %b %Y %H:%M:%S +0000')
to_sign = 'GET\n\n\n{}\n{}'.format(now, path)
signature = hmac.new(s3_conf['key'], to_sign, sha1).digest().encode("base64").rstrip('\n')
response = requests.get(url, headers={'Date': now, 'Authorization': 'AWS {}:{}'.format(s3_conf['id'], signature)})
response.raise_for_status()
with open(export_path, 'ab') as f:
for block in response.iter_content(4096):
f.write(block)