繁体   English   中英

Boto3 使用旧凭据

[英]Boto3 uses old credentials

我正在使用tkinter创建返回安全组的 gui 应用程序。 目前,如果您想更改您的凭据(例如,如果您不小心输入了错误的凭据),则必须重新启动应用程序,否则boto3将继续使用旧凭据。

我不确定为什么它一直使用旧凭据,因为我正在使用当前输入的凭据再次运行所有内容。

这是设置环境变量并启动boto3的代码片段。 如果您第一次输入正确的凭据,它就可以正常工作。

os.environ['AWS_ACCESS_KEY_ID'] = self.accessKey
os.environ['AWS_SECRET_ACCESS_KEY'] = self.secretKey

self.sts_client = boto3.client('sts')

self.assumedRoleObject = self.sts_client.assume_role(
    RoleArn=self.role,
    RoleSessionName="AssumeRoleSession1"
)

self.credentials = self.assumedRoleObject['Credentials']

self.ec2 = boto3.resource(
    'ec2',
    region_name=self.region,
    aws_access_key_id=credentials['AccessKeyId'],
    aws_secret_access_key=credentials['SecretAccessKey'],
    aws_session_token=credentials['SessionToken'],
)

凭证变量使用以下方法设置:

self.accessKey = str(self.AWS_ACCESS_KEY_ID_Form.get())
self.secretKey = str(self.AWS_SECRET_ACCESS_KEY_Form.get())
self.role = str(self.AWS_ROLE_ARN_Form.get())
self.region = str(self.AWS_REGION_Form.get())
self.instanceID = str(self.AWS_INSTANCE_ID_Form.get())

有没有办法在不重新启动程序的情况下在boto3使用不同的凭据?

您需要 boto3.session.Session 来覆盖访问凭据。

只需做这个参考http://boto3.readthedocs.io/en/latest/reference/core/session.html

import boto3

# Assign you own access 
mysession = boto3.session.Session(aws_access_key_id='foo1', aws_secret_access_key='bar1')

# If you want to use different profile call foobar inside .aws/credentials
mysession = boto3.session.Session(profile_name="fooboar")

# Afterwards, just declare your AWS client/resource services    
sqs_resource=mysession.resource("sqs")

# or client 
s3_client=mysession.client("s3")

基本上,您的代码几乎没有变化。 您只需传入会话而不是直接 boto3.client/boto3.resource

self.sts_client = mysession.client('sts')

当然,只需为每组凭据从botocore.session.Session对象创建不同的sessions

import boto3
s1 = boto3.session.Session(aws_access_key_id='foo1', aws_secret_access_key='bar1')
s2 = boto3.session.Session(aws_access_key_id='foo2', aws_secret_access_key='bar2')

您也可以利用set_credentials方法来保持 1 个会话的动态更改set_credentials

import botocore
session - botocore.session.Session()

session.set_credentials('foo', 'bar')
client = session.create_client('s3')
client._request_signer._credentials.access_key
u'foo'

session.set_credentials('foo1', 'bar')
client = session.create_client('s3')
client._request_signer._credentials.access_key
u'foo1'

@mootmoot 和 @Vor 给出的答案清楚地说明了使用会话处理多个凭据的方式。

@Vor 的回答

import boto3
s1 = boto3.session.Session(aws_access_key_id='foo1', aws_secret_access_key='bar1')
s2 = boto3.session.Session(aws_access_key_id='foo2', aws_secret_access_key='bar2')

但是你们中的一些人会好奇为什么 boto3 客户端或资源首先会以这种方式运行?

让我们澄清一些关于 Session 和 Client 的要点,因为它们实际上会引导我们找到上述问题的答案。

会话

  • “会话”存储配置状态并允许您创建服务客户端和资源

客户

  • 如果凭据未作为参数显式传递给boto3.client方法,则将自动使用为会话配置的凭据。 如果要覆盖用于此特定客户端的凭据,则只需提供凭据作为参数

现在让我们来看看代码,看看当你调用boto3.client()时实际发生了什么

def client(*args, **kwargs):
    return _get_default_session().client(*args, **kwargs)

def _get_default_session():
    if DEFAULT_SESSION is None:
        setup_default_session()
    return DEFAULT_SESSION

def setup_default_session(**kwargs):
    DEFAULT_SESSION = Session(**kwargs)

从以上学习

  1. 函数boto3.client()实际上只是 boto3.Session.client() 方法的代理
  2. 如果您曾经使用过客户端,则会设置DEFAULT_SESSION并且在下一次连续创建客户端时,它将继续使用DEFAULT_SESSION
  3. 如果在创建 boto3 客户端时凭据未显式作为参数传递,则使用为DEFAULT_SESSION配置的凭据。

回答

  • boto3.client()的第一次调用设置DEFAULT_SESSION并使用oldCredsAccessKeyoldCredsSecretKey配置会话,分别为环境变量AWS_ACCESS_KEY_IDAWS_SECRET_ACESS_KEY设置了值。

  • 因此,即使您在环境中设置新的凭据值,即执行此操作

os.environ['AWS_ACCESS_KEY_ID'] = newCredsAccessKey
os.environ['AWS_SECRET_ACCESS_KEY'] = newCredsSecretKey
  • 即将到来的boto3.client()调用仍会获取为DEFAULT_SESSION配置的旧凭据

注意

  • boto3.client()在整个答案中调用意味着没有参数传递给客户端方法。

参考文献

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM