如何使用 Python Boto3 库对两个不同账户上的 AWS Secret Manager 和 AWS Athena Python 进行身份验证

问题描述 投票:0回答:1

我正在尝试使用 Boto3 库来顺序且独立地验证我的 Python 应用程序,以便它可以从 aws-account-1 上的 AWS 秘密管理器提取秘密,并从我的本地开发计算机在 aws-account-2 上查询 AWS Athena。

使用此命令通过 account-1 从命令行进行身份验证

aws sso login—-profile aws-account-1
,秘密管理器的客户端代码可以正确提取秘密。但是,Athena 查询失败,因为它未通过正确的用户/配置文件进行身份验证。

执行

aws sso login—-profile aws-account-2
将允许我执行 Athena 查询,但由于权限不足,提取机密将失败。

从单个账户进行身份验证的一种不良方法是创建一个 AWS 角色,该角色从 aws-account-2 中承担 aws-account-1。

到目前为止,代码看起来与此类似:

def __local_authentication(self, account, resource):
   try:
      session = boto3.Session(profile_name=account)
      client = self.__session.client(resource, region_name = self.__region)
      return (session, client)
   except Exception as e:
      raise "Authentication error."

。 。 .

session, client = __local_authentication(self,'aws-account-1', 'secretmanager')
response = client.get_secret_value(SecretId=secret_name)

。 。 .

session, client = __local_authentication(self,'aws-account-2', 'athena')
resultset = wr.athena.query("", session=session)

是否有更好的方法来验证我的代码以从 AWS Secret Manager 提取机密,然后再次进行身份验证以执行 Athena 查询,而不使用假设角色方法?

python amazon-web-services boto3 amazon-athena aws-secrets-manager
1个回答
0
投票

处理这种情况的最佳方法是为每个账户创建单独的 AWS 会话。这可以让您的代码独立地对每个帐户进行身份验证,同时仍然保持整洁和易于管理。

这个想法是为每个账户使用单独的 AWS 会话。每个会话将独立处理身份验证和权限。要实现此目的,您需要:

  1. ~/.aws/config 文件中每个账户的 SSO 配置文件。

  2. 一个小型 Python 实用程序,用于切换配置文件并使用适当的服务。

这是一个代码示例:

class MultiAccountAWSClient:
    def __init__(self, region):
        self.region = region
    def authenticate(self, account_profile, service_name):
        try:
            # Create a session for the specific profile
            session = boto3.Session(profile_name=account_profile)
            client = session.client(service_name, region_name=self.region)
            return session, client
        except Exception as e:
            raise RuntimeError(f"Error authenticating with profile '{account_profile}': {e}")

然后就:

aws_client = MultiAccountAWSClient(region="us-east-1")
session_account1, secrets_client = aws_client.authenticate('aws-account-1', 'secretsmanager')
session_account2, athena_client = aws_client.authenticate('aws-account-2', 'athena')
© www.soinside.com 2019 - 2024. All rights reserved.