[英]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)
從以上學習
boto3.client()
實際上只是 boto3.Session.client() 方法的代理DEFAULT_SESSION
並且在下一次連續創建客戶端時,它將繼續使用DEFAULT_SESSION
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()
在整個答案中調用意味着沒有參數傳遞給客戶端方法。參考文獻
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.