AWS Boto3 - 用户无权对资源执行 sts::AssumeRole?
AWS Boto3 - User is not authorized to perform sts::AssumeRole on resource?
我正在创建一个 URL,使联合用户能够通过 sts:AssumeRole 访问 AWS 管理控制台,并使用 python Boto3 AWS SDK -
我可以通过 AWS CLI 成功担任角色。但是,我完全不明白为什么当我使用 Boto 库并通过 PHP 和 shell_exe 调用 python 脚本时,我收到以下错误:
botocore.exceptions.ClientError:调用AssumeRole操作时发生错误(AccessDenied):用户arn:aws:iam::xxx:user/admin无权执行:sts:AssumeRole 在资源上:arn:aws:iam::xxx/(角色名称)
这里的 admin 用户拥有完全的管理权限,同样的脚本 运行 成功并通过 CLI 登录 link :-
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --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 也不会连接。
有什么建议吗?
我终于找到了解决方案,我按如下方式更新了连接对象,它对我有效 -
sts_connection = boto3.client('sts')
assumed_role_object =
sts_connection.assume_role(RoleArn=my_role_arn,RoleSessionName=str(rolid))
我们需要在 boto3 客户端对象中传递 "sts" 并且在 sts 连接对象中需要传递您的角色 arn 和 roleId 以创建联合登录 link.
我也遇到了上面提到的同样问题,我也尝试了上面提到的建议,但没有成功。然后我意识到我用于测试的 AWS 帐户未被授权。所以我在 AWS 控制台的角色摘要页面下的信任关系中添加了以下内容以验证 AWS 帐户。
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole"
}
它开始工作了。我相信它可能对像我这样的 AWS 新手有所帮助。
我正在创建一个 URL,使联合用户能够通过 sts:AssumeRole 访问 AWS 管理控制台,并使用 python Boto3 AWS SDK -
我可以通过 AWS CLI 成功担任角色。但是,我完全不明白为什么当我使用 Boto 库并通过 PHP 和 shell_exe 调用 python 脚本时,我收到以下错误:
botocore.exceptions.ClientError:调用AssumeRole操作时发生错误(AccessDenied):用户arn:aws:iam::xxx:user/admin无权执行:sts:AssumeRole 在资源上:arn:aws:iam::xxx/(角色名称)
这里的 admin 用户拥有完全的管理权限,同样的脚本 运行 成功并通过 CLI 登录 link :-
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --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 也不会连接。
有什么建议吗?
我终于找到了解决方案,我按如下方式更新了连接对象,它对我有效 -
sts_connection = boto3.client('sts')
assumed_role_object =
sts_connection.assume_role(RoleArn=my_role_arn,RoleSessionName=str(rolid))
我们需要在 boto3 客户端对象中传递 "sts" 并且在 sts 连接对象中需要传递您的角色 arn 和 roleId 以创建联合登录 link.
我也遇到了上面提到的同样问题,我也尝试了上面提到的建议,但没有成功。然后我意识到我用于测试的 AWS 帐户未被授权。所以我在 AWS 控制台的角色摘要页面下的信任关系中添加了以下内容以验证 AWS 帐户。
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole"
}
它开始工作了。我相信它可能对像我这样的 AWS 新手有所帮助。