我正在努力找出如何从我的代码中动态获取aws_access_key_id和aws_secret_access_key。
在boto2中,我可以通过以下方式执行:boto.config.get_value('Credentials', 'aws_secret_access_key')
但是在boto3中似乎找不到类似的方法。如果我查看boto3.Session()._session._credentials
,我能够找到密钥,但那似乎是一个“大杀器”,我宁愿不走这条路。
我正在努力找出如何从我的代码中动态获取aws_access_key_id和aws_secret_access_key。
在boto2中,我可以通过以下方式执行:boto.config.get_value('Credentials', 'aws_secret_access_key')
但是在boto3中似乎找不到类似的方法。如果我查看boto3.Session()._session._credentials
,我能够找到密钥,但那似乎是一个“大杀器”,我宁愿不走这条路。
通常最佳实践是只使用临时凭证。您可以使用STS.get_session_token
获取临时凭证。
编辑:自此PR起,您可以通过以下方式访问当前会话凭证:
import boto3
session = boto3.Session()
credentials = session.get_credentials()
# Credentials are refreshable, so accessing your access key / secret key
# separately can lead to a race condition. Use this to get an actual matched
# set.
credentials = credentials.get_frozen_credentials()
access_key = credentials.access_key
secret_key = credentials.secret_key
redshift = session.client('redshift')
...
我仍然建议使用临时凭据,范围仅限于redshift所需的内容。
get_frozen_credentials()
,令牌会再次过期吗?还是它会继续工作而无需刷新令牌? - Manish Kakati使用 botocore
>>> import botocore.session
>>> session = botocore.session.get_session()
>>> session.get_credentials().access_key
'AKIAABCDEF6RWSGI234Q'
>>> session.get_credentials().secret_key
'abcdefghijkl+123456789+qbcd'
>>> session.get_config_variable('region')
'us-east-1'
我可以建议使用boto3访问键是错误的:
import boto3
session = boto3.Session(profile_name="my-profile")
dynamodb = session.resource(
"dynamodb",
region_name=session.region_name,
# aws_access_key_id=session.get_credentials().access_key,
# aws_secret_access_key=session.get_credentials().secret_key,
)
注意,我注释掉了访问密钥的部分,因为1:
从此会话创建的任何客户端都将使用来自
~/.aws/credentials
中[my-profile]
部分的凭证。
import boto3
from botocore import session
def get_credentials():
credentials = boto3.client(
'sts',
region_name="us-east-1",
aws_access_key_id='123',
aws_secret_access_key='123',
).assume_role(
RoleArn="arn:aws-cn:iam::123", # Your RoleArn
RoleSessionName='boto3_client')
return credentials
def db_conn():
credentials = get_credentials()
db = boto3.resource(
'dynamodb',
region_name="us-east-1",
aws_access_key_id=credentials['Credentials']['AccessKeyId'],
aws_secret_access_key=credentials['Credentials']['SecretAccessKey'],
aws_session_token=credentials['Credentials']['SessionToken'],
)
# table = db.Table(your_table_name)
# response = table.query(
# IndexName='age',
# KeyConditionExpression=Key('age').eq(11)
# )
if __name__ == "__main__":
db_conn()
aws_access_key_id
和aws_secret_access_key
。我宁愿不编写代码来进入配置/凭证文件并在Boto已经执行此操作时找到它们。 - Mo.