Получение botocore.exceptions.NoCredentialsError: Невозможно найти учетные данные, особенно когда я использую CronTab - PullRequest
0 голосов
/ 24 апреля 2018

Я понимаю, у нас есть пара ответов на эту ошибку. Тем не менее, моя проблема другая, поэтому вопрос.

Я загружаю аудиофайлы из файла 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")

Я вызываю этот скрипт на python в скрипте bash.

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 голосов
/ 24 апреля 2018

По умолчанию, когда crontab запускает скрипт, он устанавливает переменную $HOME равной /.

AWS ищет свои учетные данные в месте, которое разрешается до $HOME/.aws.

Итак, вам нужно либо переместить каталог .aws в корневой каталог, что, вероятно, не очень хорошая идея, либо переопределить $HOME, чтобы он указывал на папку, в которой находится каталог .aws.

Самый простой способ сделать это, если вы запускаете скрипт python из скрипта оболочки, это добавить:

export /HOME=/home/pi/

К началу вашего сценария оболочки.

...