Boto3 使用旧凭据
Boto3 uses old credentials
我正在使用 tkinter
创建 returns 安全组的 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
中使用不同的凭据而不重新启动程序?
当然,只需为每组凭证从 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 个会话动态更改信用:
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'
您需要 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')
@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 的要点,因为它们实际上会引导我们找到上述问题的答案。
会话
- A 'Session' 存储配置状态并允许您创建服务客户端和资源
客户端
- 如果凭据未作为参数显式传递给
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)
从上面学到的东西
- 函数
boto3.client()
实际上只是boto3.Session.client()方法的代理
- 如果您使用客户端一次,
DEFAULT_SESSION
已设置,下一次连续创建客户端时,它将继续使用 DEFAULT_SESSION
- 如果在创建 boto3 客户端时未明确将凭据作为参数传递,则使用为
DEFAULT_SESSION
配置的凭据。
回答
第一次调用 boto3.client()
设置 DEFAULT_SESSION
并使用 oldCredsAccessKey
、oldCredsSecretKey
配置会话,已设置的值环境变量分别为 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACESS_KEY
。
因此,即使您在环境中设置新的凭据值,即执行此操作
os.environ['AWS_ACCESS_KEY_ID'] = newCredsAccessKey
os.environ['AWS_SECRET_ACCESS_KEY'] = newCredsSecretKey
- 即将到来的
boto3.client()
调用仍会使用为 DEFAULT_SESSION
配置的旧凭据
注意
boto3.client()
在整个答案中调用意味着没有参数传递给客户端方法。
参考资料
我正在使用 tkinter
创建 returns 安全组的 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
中使用不同的凭据而不重新启动程序?
当然,只需为每组凭证从 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 个会话动态更改信用:
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'
您需要 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')
@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 的要点,因为它们实际上会引导我们找到上述问题的答案。
会话
- A 'Session' 存储配置状态并允许您创建服务客户端和资源
客户端
- 如果凭据未作为参数显式传递给
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)
从上面学到的东西
- 函数
boto3.client()
实际上只是boto3.Session.client()方法的代理 - 如果您使用客户端一次,
DEFAULT_SESSION
已设置,下一次连续创建客户端时,它将继续使用DEFAULT_SESSION
- 如果在创建 boto3 客户端时未明确将凭据作为参数传递,则使用为
DEFAULT_SESSION
配置的凭据。
回答
第一次调用
boto3.client()
设置DEFAULT_SESSION
并使用oldCredsAccessKey
、oldCredsSecretKey
配置会话,已设置的值环境变量分别为AWS_ACCESS_KEY_ID
和AWS_SECRET_ACESS_KEY
。因此,即使您在环境中设置新的凭据值,即执行此操作
os.environ['AWS_ACCESS_KEY_ID'] = newCredsAccessKey
os.environ['AWS_SECRET_ACCESS_KEY'] = newCredsSecretKey
- 即将到来的
boto3.client()
调用仍会使用为DEFAULT_SESSION
配置的旧凭据
注意
boto3.client()
在整个答案中调用意味着没有参数传递给客户端方法。
参考资料