簡體   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