如何使用 boto3 连接到 Amazon Keyspaces?
How to connect to Amazon Keyspaces using boto3?
我正在尝试利用 Assume role provider
连接到 Amazon Keyspaces,它会在凭据过期时刷新凭据。我已经按照文档所述设置了我的 aws 配置文件
[profile cassandra]
role_arn=role_to_assume
source_profile=default
role_session_name=testingCassandraConnection
duration_seconds=900
然后,在代码中我使用该配置文件启动会话
boto_session = boto3.Session(profile_name='cassandra', region_name='us-east-1')
auth_provider = SigV4AuthProvider(boto_session)
cluster = Cluster(
[CASSANDRA_CLUSTER],
ssl_context=ssl_context,
auth_provider=auth_provider,
port=9142
)
session = cluster.connect()
但我收到错误 Error from server: code=0100 [Bad credentials] message="Authentication failure: SessionId mismatch
我也尝试过使用 sts_client.assume_role
并将凭据直接传递给 boto3.Session()
并且它以这种方式工作,但是当它们过期时我将无法刷新凭据。
有人遇到过这个问题吗?
我找到了方法,原来 botocore
库有一种处理可刷新凭据的方法。
def assumed_role_session(role_arn: str,
base_session: botocore.session.Session = None):
# Default session
base_session = base_session or boto3.session.Session()._session
fetcher = botocore.credentials.AssumeRoleCredentialFetcher(
client_creator=base_session.create_client,
source_credentials=base_session.get_credentials(),
role_arn=role_arn,
extra_args={
# set this if you want something non-default
# 'RoleSessionName': None
# 'DurationSeconds': 3600
}
)
creds = botocore.credentials.DeferredRefreshableCredentials(
method='assume-role',
refresh_using=fetcher.fetch_credentials,
time_fetcher=lambda: datetime.datetime.now(tzlocal())
)
botocore_session = botocore.session.Session()
botocore_session._credentials = creds
return boto3.Session(botocore_session=botocore_session)
首先,我们需要传递要使用 fetcher
创建的客户端的信息,然后我们使用该获取器对象指定如何在 creds
中刷新凭据,最后,返回一个 boto3 会话,并以 botocore
会话(此会话已经设置了轮换凭据)为基础。
此返回的会话然后按如下方式传递给身份验证提供程序:
auth_provider = SigV4AuthProvider(session)
而且有效。
取自
的函数
完整 botocore.credentials 文档 here
我正在尝试利用 Assume role provider
连接到 Amazon Keyspaces,它会在凭据过期时刷新凭据。我已经按照文档所述设置了我的 aws 配置文件
[profile cassandra]
role_arn=role_to_assume
source_profile=default
role_session_name=testingCassandraConnection
duration_seconds=900
然后,在代码中我使用该配置文件启动会话
boto_session = boto3.Session(profile_name='cassandra', region_name='us-east-1')
auth_provider = SigV4AuthProvider(boto_session)
cluster = Cluster(
[CASSANDRA_CLUSTER],
ssl_context=ssl_context,
auth_provider=auth_provider,
port=9142
)
session = cluster.connect()
但我收到错误 Error from server: code=0100 [Bad credentials] message="Authentication failure: SessionId mismatch
我也尝试过使用 sts_client.assume_role
并将凭据直接传递给 boto3.Session()
并且它以这种方式工作,但是当它们过期时我将无法刷新凭据。
有人遇到过这个问题吗?
我找到了方法,原来 botocore
库有一种处理可刷新凭据的方法。
def assumed_role_session(role_arn: str,
base_session: botocore.session.Session = None):
# Default session
base_session = base_session or boto3.session.Session()._session
fetcher = botocore.credentials.AssumeRoleCredentialFetcher(
client_creator=base_session.create_client,
source_credentials=base_session.get_credentials(),
role_arn=role_arn,
extra_args={
# set this if you want something non-default
# 'RoleSessionName': None
# 'DurationSeconds': 3600
}
)
creds = botocore.credentials.DeferredRefreshableCredentials(
method='assume-role',
refresh_using=fetcher.fetch_credentials,
time_fetcher=lambda: datetime.datetime.now(tzlocal())
)
botocore_session = botocore.session.Session()
botocore_session._credentials = creds
return boto3.Session(botocore_session=botocore_session)
首先,我们需要传递要使用 fetcher
创建的客户端的信息,然后我们使用该获取器对象指定如何在 creds
中刷新凭据,最后,返回一个 boto3 会话,并以 botocore
会话(此会话已经设置了轮换凭据)为基础。
此返回的会话然后按如下方式传递给身份验证提供程序:
auth_provider = SigV4AuthProvider(session)
而且有效。
取自
完整 botocore.credentials 文档 here