AWS Boto3 - Пользователь не авторизован для выполнения sts::AssumeRole на ресурсе?
Я создаю URL-адрес, который позволяет федеративным пользователям получать доступ к консоли управления AWS с помощью sts:AssumeRole с приведенной ниже ссылкой с помощью Python Boto3 AWS SDK -
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html
Я могу успешно взять на себя роль через AWS CLI. Но я совсем не понимаю, почему, когда я использую библиотеку Boto и вызываю скрипт python через PHP и shell_exe, я получаю следующую ошибку:
botocore.exceptions.ClientError: Произошла ошибка (AccessDenied) при вызове операции AssumeRole: пользователь arn:aws:iam::xxx: пользователь / администратор не авторизован для выполнения: sts:AssumeRole для ресурса: arn: aws: iam:: хая /(имя роли)
Здесь администратор имеет полный административный доступ, и тот же скрипт успешно работает и дает ссылку для входа через CLI: -
aws sts предположить-роль --role-arn arn:aws:iam::123456789012: роль / имя-роли -role-session-name "RoleSession1"
Это пример Python:
#!/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 также не подключился бы.
Любое предложение?
3 ответа
Я также столкнулся с той же проблемой, которая упоминалась выше, и я также попробовал вышеупомянутые предложения, но не повезло. Затем я понял, что учетная запись AWS, которую я использовал для тестирования, не авторизована. Поэтому я добавил следующее на странице "Доверительные отношения на странице сводки ролей" в консоли AWS для аутентификации учетной записи AWS.
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole"
}
Он начал работать. Я считаю, что это может быть полезно для таких новичков в AWS, как я.
Я столкнулся с похожей проблемой
Перейдите в IAM-> Policies, создайте политику, как показано ниже, и прикрепите ее к роли IAM лямбда-функции.
видео - https://youtu.be/20tr9gUY4i0
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::xxxxxxxxxxxx:role/*"
}
]
}
Наконец, я нашел решение, я обновил объект подключения следующим образом, и он работает со мной -
sts_connection = boto3.client('sts')
assumed_role_object =
sts_connection.assume_role(RoleArn=my_role_arn,RoleSessionName=str(rolid))
Нам нужно передать "sts" в объекте клиента boto3, а в объекте соединения sts нужно передать вашу роль arn и roleId, если вы хотите создать федеративную ссылку для входа в систему.