我正在尝试使用 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 查询,而不使用假设角色方法?
处理这种情况的最佳方法是为每个账户创建单独的 AWS 会话。这可以让您的代码独立地对每个帐户进行身份验证,同时仍然保持整洁和易于管理。
这个想法是为每个账户使用单独的 AWS 会话。每个会话将独立处理身份验证和权限。要实现此目的,您需要:
~/.aws/config 文件中每个账户的 SSO 配置文件。
一个小型 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')