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
文件夹中的 config
和 credentials
文件。如 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 脚本的开头。
据我了解,对于此错误,我们有几个答案。然而,我的问题是不同的,因此问题。
我正在将音频文件从 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
文件夹中的 config
和 credentials
文件。如 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 脚本的开头。