以编程方式与AWS SSO建立boto3会话



我正试图与boto3.session.Session(profile_name='foo')建立boto3会话,但遇到UnauthorizedSSOTokenError错误:

botocore.exceptions.UnauthorizedSSOTokenError:与此配置文件关联的SSO会话已过期或无效。要刷新此SSO会话,请使用相应的配置文件运行aws-SSO-login。

我尝试使用subprocess.run("aws sso login --profile foo")登录,但这会打开我的web浏览器并提示手动确认。

如果您使用AWS SSO,是否有任何方法可以通过编程方式建立boto3会话?

换句话说,有没有办法避免人工确认?

我想在脚本中自动处理到期时的SSO重新身份验证,并且可以在打开浏览器窗口并(可能(提示用户授权设备访问的情况下使用。

最终得到:

def establishSession(retry = True):
session = boto3.Session(profile_name=AWS_PROFILE)
sts = session.client('sts')
try:
identity = sts.get_caller_identity()
print(f"Authorized as {identity['UserId']}")
return session
except botocore.exceptions.UnauthorizedSSOTokenError:
if retry:
subprocess.run(['aws','sso', 'login', '--profile', AWS_PROFILE])
return establishSession(False)
else:
raise

get_caller_identity api调用很快,不需要任何特殊权限。https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sts.html#STS.Client.get_caller_identity

只有boto3,没有。正如您已经发现的,您将希望让CLI参与AWS SSO的解决方案。

您可以按照此处的步骤使用AWS SSO设置AWS CLI。这将打开一个浏览器供您手动确认。我的建议是将SSO会话持续时间增加到12小时。实际上,你每天登录一次,在一天的剩余时间里都很好。这是安全性和便利性的最佳组合。不建议使用其他解决方案,如创建IAM角色或完全自动化登录。

这里有一个指向Gist的链接,我发现它无论如何都会帮助你。它仍然会打开一个网络浏览器,但根据你的身份验证提供者的登录过程,你应该能够使用python请求库来填充网络浏览器调用。

https://gist.github.com/jcalvento/92861eb7ebda3fa064f3fbbb71acba41

@coin-graham的答案现在已经过时了。有关如何通过boto3建立sso会话,请参阅此示例。

最新更新