0

我正在尝试连接到 Amazon Keyspaces,利用Assume role provider它在凭证过期时刷新凭证。如文档所述,我已经设置了我的 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()它,它以这种方式工作,但是当它们过期时我将无法刷新凭据。

有没有人遇到过这个问题?

4

1 回答 1

0

我发现了如何做到这一点,原来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,然后我们使用该 fetcher 对象来指定如何刷新凭据creds,最后,与会话一起返回一个 boto3botocore会话(该会话已经轮换凭证集)作为基础。

然后将此返回的会话传递给身份验证提供程序,如下所示:

auth_provider = SigV4AuthProvider(session)

它有效。

这里获取的功能

完整的 botocore.credentials 文档在这里

于 2021-08-11T23:39:12.823 回答