如何使用 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