获取botocore.exceptions.NoCredentialsError:无法找到凭据,尤其是在使用CronTab时

时间:2018-04-24 14:30:38

标签: python amazon-s3 cron raspbian boto3

我知道我们对此错误有几个答案。但是,我的问题因此而有所不同。

我正在将覆盆子pi中的音频文件推送到AWS-S3实例。手动运行脚本时,上传工作没有任何问题。但是,当通过crontab实例运行时,相同的脚本会引发上述错误。

我的python代码如下:

import boto3
import argparse
import os
ap=argparse.ArgumentParser()
ap.add_argument("-f","--filetoupload", required=True, help="file to upload")
args=vars(ap.parse_args())
file = os.path.basename(args['filetoupload'])
client=boto3.client('s3', region_name='ap-south-1')
print("[INFO:] Uploading file to cloud")
client.upload_file(args['filetoupload'],'MyS3Bucket',file)
print("[INFO:] File upload completed successfully")

我在bash脚本中调用这个python脚本。

python /home/pi/s3upload.py --filetoupload /home/pi/upload/${FILENAME}.mp3

创建了mp3文件,如上所述,当我手动运行时,它运行没有任何问题。

我检查了config文件夹中的credentials.aws个文件。如SO中的其他响应所示,它们以默认开头并设置了正确的凭据。

完整的错误消息如下:

[INFO:] Uploading file to cloud
Traceback (most recent call last):
  File "/home/pi/s3upload.py", line 10, in <module>
    client.upload_file(args['filetoupload'],'MyS3Bucket',file)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/inject.py", line 110, in upload_file
    extra_args=ExtraArgs, callback=Callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 279, in upload_file
    future.result()
  File "/usr/local/lib/python2.7/dist-packages/s3transfer/futures.py", line 73, in result
    return self._coordinator.result()
  File "/usr/local/lib/python2.7/dist-packages/s3transfer/futures.py", line 233, in result
    raise self._exception
botocore.exceptions.NoCredentialsError: Unable to locate credentials
script finished

1 个答案:

答案 0 :(得分:2)

默认情况下,当crontab运行脚本时,它会将$HOME变量设置为/

AWS在解析为$HOME/.aws的位置查找其凭据。

因此,您需要将.aws目录移动到根目录,这可能不是一个好主意,或者重新定义$HOME以指向包含您的.aws目录的文件夹。< / p>

如果从shell脚本运行python脚本,最简单的方法是添加:

export /HOME=/home/pi/

到shell脚本的开头。