我试图创建一个Python脚本来连接到我的AWS帐户并与之交互。我在这里阅读它https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html
我看到它从~/.aws/credentials(在Linux机器上)读取您的凭据。然而,我没有与IAM用户连接,而是与SSO用户连接。因此,我使用的配置文件连接数据位于~/.aws/sso/cache目录。
在该目录中,我看到两个json文件。其中一个具有以下键:
- startUrl
- 区域
- accessToken
- AmmoresAt
第二个具有以下键:
- clientId
- clientSecret
- AmmoresAt
我在文档中没有看到任何关于如何告诉它使用我的SSO用户的地方。
因此,当我尝试运行我的脚本时,我会得到如下错误:
botocore.exceptions.ClientError: An error occurred (AuthFailure) when calling the DescribeSecurityGroups operation: AWS was not able to validate the provided access credentials
字符串
即使我可以从命令提示符运行相同的命令。
6条答案
按热度按时间eyh26e7m1#
这在boto3 1.14中得到了修复。
因此,如果您在
~/.aws/config
中有这样的配置文件:字符串
然后用
$ aws sso login --profile sso_profile
登录您可以创建一个会话:
型
vawmfj5a2#
已于2023.10.23发布最新的boto 3(hat tip commenter @Adam Smith,他的无形之手引导我们在boto 3的新版本中更新提取角色凭据):
下面是在
boto3==1.28.69
上测试的一个冗长而令人毛骨悚然的答案:这是一个八步的过程,其中:
1.使用
sso-oidc.register_client
注册客户端1.使用
sso-oidc.start_device_authorization
启动设备授权流1.使用
webbrowser.open
将用户重定向到sso登录页1.轮询
sso-oidc.create_token
,直到用户完成登录1.使用
sso.list_account_roles
列出并向用户显示帐户角色1.使用
sso.get_role_credentials
获取角色凭据1.使用来自(6)的会话凭证创建新的boto 3会话
1.吃饼干
第8步是真正的关键,不应该被忽视,作为任何成功的授权流程的一部分。
在下面的示例中,
account_id
应该是您试图获取凭据的帐户的帐户ID。start_url
应该是AWS为您生成的用于启动SSO流的URL(在AWS SSO管理控制台中,在设置下)。字符串
hmmo2u0o3#
您当前的.aws/sso/cache文件夹结构如下所示:
字符串
这两个json文件包含3个不同的有用参数。
型
使用cXXXXXXXXXXXXXXXXX.json中的访问令牌,您可以调用get-role-credentials。此命令的输出可用于创建新会话。
你的Python文件应该看起来像这样:
型
ibps3vxo4#
一个格式良好的基于
boto3
的脚本应该基于配置文件名透明地进行身份验证。不建议您自己处理缓存的文件或密钥或令牌,因为官方代码方法可能会在将来更改。要查看您的配置文件的状态,请运行aws configure list
--examples:字符串
rsaldnfx5#
对我有效的方法如下:
字符串
使用
boto3==1.20.18
。如果您之前已为aws(即
aws configure sso
)配置了SSO,则此操作将有效。有趣的是,如果我使用
ipython
,我不必经历这些,我只是事先调用aws sso login
,然后调用boto3.Session()
。我试图弄清楚我的方法是否有问题-我完全同意上面关于透明度的说法,尽管它是一个可行的解决方案,但我并不喜欢它。编辑:有一些错误,下面是我如何修复它:
1.运行
aws configure sso
(如上所述);1.安装
aws-vault
-它基本上取代了aws sso login --profile <profile-name>
;1.运行
aws-vault exec <profile-name>
创建一个子shell,并将AWS凭据导出到环境变量中。这样,就可以交互地(例如iPython)或从脚本运行任何
boto3
命令,就像我的例子一样。型
Here,了解有关AWS存储库的更多详细信息。
btxsgosb6#
如果您以前在终端中执行过
aws sso configure
命令并按照提示操作,那么您的~/.aws/config
文件中应该有以下内容。字符串
在使用
aws sso login --profile <profile_name>
登录终端后,其中<profile_name>
必须与上面~/.aws/config
文件中的一个配置文件匹配,您需要将AWS_PROFILE
环境变量设置为与上面相同的配置文件名称。如果您只想为当前终端设置环境变量,(在这里运行Python脚本),在终端中运行export AWS_PROFILE=<profile_name>
。或者如果它是你经常使用的配置文件,将上面相同的export
语句添加到类似~/.bashrc
的文件中。