Я не могу загрузить учетные данные AWS с помощью скрипта CGI-Python - PullRequest
0 голосов
/ 23 января 2019

не может получить доступ к учетным данным AWS при выполнении сценария Python CGI в браузере.

dynamicodb = boto3.resource ('dynamodb') Используя приведенную выше строку в файле Python, я могу получить учетные данные из ~/.aws и запустите его в CONSOLE.

Но когда я выполняю тот же код в веб-браузере, я получаю сообщение об ошибке (учетные данные отсутствуют)

Я попытался установить переменные среды и попытался использоватьфайлы конфигурации и учетных данных.Но не сработало.

dynamodb = boto3.resource ('Dynamodb') *

ERRORRRR !!!!

raise NoCredentialsError

NoCredentialsError: Невозможно найти учетные данные

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Как правило, такие среды, как CGI, запускаются как пользователь root.Однако это зависит от того, как настроена служба.

У вас есть несколько вариантов:

  1. Если служба работает как root, домашний каталог для root - /root.Создайте каталог /root/.aws.Затем скопируйте содержимое каталога ~/.aws в /root/.aws.Вам нужно будет su, чтобы иметь права.
  2. Создать каталог, такой как /AWS.Скопируйте свои учетные данные в этот каталог.Теперь в вашем коде укажите путь к файлу учетных данных /AWS/credentials.
  3. Укажите aws_access_key и aws secret_access_key в вашей программе.Это не рекомендуется, поскольку каждый раз, когда вы вводите свои учетные данные в программу, вы открываете риски безопасности.
  4. Если ваша служба работает в EC2, назначьте роль экземпляру и получите ключи доступа AWS из метаданных.

В этом документе AWS подробно объясняется, как управляются учетные данные.Потратьте время, чтобы прочитать его сверху вниз.

Учетные данные

Я также рекомендую переключиться с использования boto3 resource на boto3 client.Это даст вам гораздо больше возможностей в вашем коде.

Пример: укажите свои учетные данные с помощью жестко закодированных учетных данных (не рекомендуется):

import boto3

session = boto3.Session(
    # Hard coded strings as credentials, not recommended.
    aws_access_key_id='AKIAIO5FODNN7EXAMPLE',
    aws_secret_access_key='ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYEXAMPLE',
)

dynamodb = boto3.resource('dynamodb')

Вы можете хранить свои учетные данные AWS в любом формате файлачто вы хотите, а затем прочитайте этот файл обратно, чтобы загрузить ключи доступа AWS в ваш код.

0 голосов
/ 30 января 2019

На основании Ответ Марк Б Мне удалось решить аналогичную проблему, которую я пытался неделями ..

Мой скрипт на Python работает без ошибок локально из IDEL на сервере Windows

Однако при вызове веб-клиентом (java-скриптом) выдается ошибка

botocore.exceptions.NoCredentialsError: Unable to locate credentials

Проблема была точно такой же, как указал Марк в отношении домашнего каталога, когда скрипт запускается локально, например, в Windows, это C: \ Users \ USER_NAME, поэтому он может найти учетные данные в расположении по умолчанию C: \ Users \ USER_NAME \ .aws \ credentials as В документации указано , однако при запуске с использованием CGI домашний каталог отличается

Итак, чтобы это исправить:

1 - знать, что ваш домашний каталог (во время выполнения)

from pathlib import Path

разместите эти строки перед попыткой доступа к сервису AWS

home = str(Path.home())
print('Home %s'%home)

скопировать полный домашний путь

2- Перейдите в этот каталог и поместите в него копию каталога .aws.

3 - Дать разрешение на чтение файлов внутри .aws

Для сервера IIS

cd {full_home_path} + \.aws  //Remove {} and + 
icacls . /grant "NT AUTHORITY\IUSR:(OI)(CI)(R)"
icacls . /grant "Builtin\IIS_IUSRS:(OI)(CI)(R)"

4 - перезагрузить сервер

5 - Попробуйте скрипт Python из веб-клиента

6 - должно работать.

0 голосов
/ 23 января 2019

~ в ~/.aws представляет домашний каталог текущего пользователя. Когда скрипт выполняется из консоли, которая работает, потому что вы являетесь текущим пользователем. Когда скрипт выполняется через CGI, текущий пользователь является другой учетной записью в вашей системе, поэтому ~ указывает на другой домашний каталог, в котором нет файла учетных данных.

Если вы запускаете это на сервере EC2, я бы предложил переключиться на профиль экземпляра IAM вместо файла учетных данных. В противном случае вам нужно будет поместить файл учетных данных в правильный домашний каталог учетной записи пользователя или установить учетные данные в качестве переменных среды для процесса CGI.

...