Boto3 использует старые учетные данные

Я использую tkinter для создания графического приложения, которое возвращает группы безопасности. В настоящее время, если вы хотите изменить свои учетные данные (например, если вы случайно ввели неправильные), вам придется перезапустить приложение, иначе 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 без перезапуска программы?


person Farhan.K    schedule 27.04.2016    source источник
comment
Это неправильный способ назначить изменяемый доступ для модуля boto3. Поскольку boto API предполагает и использует кешированный ключ доступа @Vor, ответ — это явный способ сообщить boto .   -  person mootmoot    schedule 28.04.2016
comment
@mootmoot Если я перезагружу модуль с помощью importlib.reload, он должен «очистить» кеш, верно?   -  person Farhan.K    schedule 28.04.2016


Ответы (3)


Вам нужно 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')
person mootmoot    schedule 28.04.2016

Конечно, просто создайте разные объекты sessions из botocore.session.Session для каждого набора учетных данных:

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'
person Vor    schedule 27.04.2016
comment
Спасибо за Ваш ответ! Это для настройки нескольких сессий одновременно? Я хотел бы иметь только 1 сеанс и, если возможно, завершить старый сеанс. - person Farhan.K; 27.04.2016
comment
Я не совсем уверен, как это реализовать, поскольку я не уверен, где будет установлен role. Кроме того, будет ли это работать с моим текущим кодом или мне придется переписать self.ec2 = boto3.resource часть моего кода? - person Farhan.K; 27.04.2016
comment
Новый пример кода после примера boto3.session.Session должен прояснить вашу проблему. например s1_s3 = s1.ресурс (s3) - person mootmoot; 28.04.2016

Ответы, данные @mootmoot и @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 вообще ведет себя таким образом?

Давайте проясним несколько моментов о сеансе и клиенте, поскольку они фактически приведут нас к ответу на вышеупомянутый вопрос.

Сеанс

  • «Сеанс» хранит состояние конфигурации и позволяет создавать сервисные клиенты и ресурсы.

Клиент

  • если учетные данные не передаются явно в качестве аргументов методу 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. Учетные данные, настроенные для DEFAULT_SESSION, используются, если учетные данные не передаются явно в качестве аргументов при создании клиента boto3.

Ответить

  • Первый вызов boto3.client() устанавливает DEFAULT_SESSION и настраивает сеанс с oldCredsAccessKey, oldCredsSecretKey, уже установленными значениями для переменных env 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() во всем этом ответе означает, что клиентскому методу не переданы аргументы.

Ссылки

person Aashish gaba    schedule 11.04.2021