如何创建同时使用本地AWS配置文件并假定IAM角色的boto3会话?
解决方案:使用本地AWS配置文件并假定IAM角色拉取Secrets Management密钥
核心逻辑
先通过本地指定的my-profile配置文件建立初始AWS会话,再借助STS服务假定目标IAM角色获取临时凭证,最后用这些凭证创建Secrets Manager客户端拉取受限密钥。
完整代码示例
import boto3 from botocore.exceptions import ClientError # 替换为你的实际参数 LOCAL_PROFILE_NAME = "my-profile" TARGET_ROLE_ARN = "arn:aws:iam::123456789012:role/your-restricted-secrets-role" ROLE_SESSION_NAME = "local-secrets-access-session" # 自定义会话名,用于AWS控制台追踪请求 SECRET_NAME = "your-target-secret-name" def get_restricted_secret(): # 1. 用本地配置文件创建初始会话 initial_session = boto3.Session(profile_name=LOCAL_PROFILE_NAME) # 2. 通过初始会话获取STS客户端,用于执行角色假定 sts_client = initial_session.client("sts") try: # 3. 调用STS接口获取临时凭证 assumed_role_response = sts_client.assume_role( RoleArn=TARGET_ROLE_ARN, RoleSessionName=ROLE_SESSION_NAME ) temp_credentials = assumed_role_response["Credentials"] # 4. 用临时凭证创建Secrets Manager客户端 secrets_client = boto3.client( "secretsmanager", aws_access_key_id=temp_credentials["AccessKeyId"], aws_secret_access_key=temp_credentials["SecretAccessKey"], aws_session_token=temp_credentials["SessionToken"], region_name=initial_session.region_name # 继承本地配置的区域 ) # 5. 拉取目标密钥 get_secret_response = secrets_client.get_secret_value(SecretId=SECRET_NAME) # 根据密钥存储格式调整,这里以明文字符串为例 secret = get_secret_response["SecretString"] return secret except ClientError as e: print(f"获取密钥失败: {e.response['Error']['Message']}") raise # 调用示例 if __name__ == "__main__": secret = get_restricted_secret() print("获取到的密钥内容:", secret)
关键注意事项
- 权限前置检查:确保本地
my-profile对应的IAM实体拥有sts:AssumeRole权限,且目标IAM角色的信任策略已允许该实体进行角色假定。 - 临时凭证有效期:默认有效期1小时,最长可设置至12小时(需在角色信任策略中配置允许)。
- 错误处理扩展:可根据
ClientError的错误码(如AccessDeniedException、ResourceNotFoundException)添加针对性的异常处理逻辑。
内容的提问来源于stack exchange,提问作者user10664542
相关产品推荐
相关产品推荐

