Я создаю URL-адрес, который позволяет федеративным пользователям получить доступ к консоли управления AWS с помощью sts: AssumeRole со ссылкой ниже, используя python Boto3 AWS SDK -
Я могу успешно взять на себя роль через AWS CLI. Но я вообще не понимаю, почему, когда я использую библиотеку Boto и вызываю скрипт python с помощью PHP и shell_exe, я получаю следующую ошибку:
botocore.exceptions.ClientError: произошла ошибка (AccessDenied) при вызове операции AssumeRole: пользователь arn: aws: iam :: xxx: пользователь / администратор не авторизован для выполнения: sts: AssumeRole на ресурсе: arn: aws: iam :: xxx / (имя-роли)
Здесь пользователь admin имеет полный административный доступ, и тот же сценарий успешно работает и предоставляет ссылку для входа через CLI: -
aws sts accept-role --role-arn arn: aws: iam :: 123456789012: роль / имя-роли --role-имя-сеанса "RoleSession1"
Это образец питона:
#!/usr/bin/python35
import urllib, json
import requests
import boto3
import urllib.parse
import sys
import cgi
import json
sts_connection = boto3.client('sts',aws_access_key_id='my_access_key',aws_secret_access_key='my_secret_key')
assumed_role_object = sts_connection.assume_role(
RoleArn=my_role_arn,
RoleSessionName="AssumeRoleSession"
)
json_string_with_temp_credentials = '{'
json_string_with_temp_credentials += '"sessionId":"' + assumed_role_object.get('Credentials').get('AccessKeyId') + '",'
json_string_with_temp_credentials += '"sessionKey":"' + assumed_role_object.get('Credentials').get('SecretAccessKey') + '",'
json_string_with_temp_credentials += '"sessionToken":"' + assumed_role_object.get('Credentials').get('SessionToken') + '"'
json_string_with_temp_credentials += '}'
request_parameters = "?Action=getSigninToken"
request_parameters += "&SessionDuration=1800"
request_parameters += "&Session=" + urllib.parse.quote(json_string_with_temp_credentials)
request_url = "https://signin.aws.amazon.com/federation" + request_parameters
r = requests.get(request_url)
signin_token = json.loads(r.text)
request_parameters = "?Action=login"
request_parameters += "&Issuer=www.whizlabs.com"
request_parameters += "&Destination=" + urllib.parse.quote("https://console.aws.amazon.com/")
request_parameters += "&SigninToken=" + signin_token["SigninToken"]
request_url = "https://signin.aws.amazon.com/federation" + request_parameters
print (request_url)
Проблема с вызовом того же скрипта веб-сервером с использованием PHP shell_exec следующим образом -:
$output = shell_exec("python3 get_link.py arn=".$arn." 2>&1");
Я не думаю, что проблема связана с ролями и политиками IAM; если бы это было так, AWS CLI также не подключился бы.
Любое предложение?
admin
пользователем IAM. Находятся ли пользователь и роль в одной учетной записи AWS? Кроме того, при запуске из интерфейса командной строки AWS вы используете учетные данные из файла учетных данных, но в вашем коде есть жестко заданные учетные данные. Рекомендуется никогда не указывать учетные данные в исходном коде жестко. Если вы не укажете их, то boto3 также будет использовать файл учетных данных. (Вполне вероятно, что ваше приложение использует учетные данные, отличные от AWS CLI.) - person John Rotenstein   schedule 27.07.2018aws
работает, значит, у вас уже есть работающий файл учетных данных. Ваш код (если он запущен от имени того же пользователя на том же компьютере) автоматически найдет его. Таким образом, нет необходимости вводить учетные данные в командеboto3.client
. См .: Настройка интерфейса командной строки AWS - командная строка AWS Интерфейс - person John Rotenstein   schedule 27.07.2018