Getting botocore.exceptions.NoCredentialsError: Unable to locate credentials especially when I using CronTab

Getting botocore.exceptions.NoCredentialsError: Unable to locate credentials especially when I using CronTab

据我了解,对于此错误,我们有几个答案。然而,我的问题是不同的,因此问题。

我正在将音频文件从 raspberry 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 文件已创建,如上所述,当我手动 运行 它 运行 时没有任何问题。

我检查了 .aws 文件夹中的 configcredentials 文件。如 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

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

AWS 在解析为 $HOME/.aws.

的位置查找其凭据

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

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

export /HOME=/home/pi/

到您的 shell 脚本的开头。