AWS S3会话过期问题:如何每日自动建立新会话?
解决AWS S3临时会话过期及自动续期问题
核心问题分析
你通过PowerShell生成的是临时安全凭证,这类凭证默认有效期为8小时,因此次日运行脚本必然会触发过期报错。要解决这个问题,要么让Boto3自动获取有效凭证,要么实现凭证的自动定期刷新。
解决方案一:利用AWS凭证链自动加载有效凭证
Boto3内置凭证链机制,无需手动硬编码凭证参数,会自动按优先级查找有效凭证:
- 系统环境变量
~/.aws/credentials文件(你当前使用的凭证存储位置)- EC2实例元数据(若脚本在AWS云服务器运行)
- AWS SSO会话凭证(若使用SSO登录)
优化后的Python代码
移除硬编码的凭证参数,让Boto3自动读取最新有效凭证:
import boto3 from io import StringIO # 无需手动传入凭证,Boto3自动从凭证链获取有效信息 s3_client = boto3.client("s3", region_name='你的实际区域') # 写入S3逻辑 bucket = 'automated-reports' csv_buffer = StringIO() all_active_scraper_counts_df.to_csv(csv_buffer, index=False) put_response = s3_client.put_object( Bucket=bucket, Key="all_active_scrapers.csv", Body=csv_buffer.getvalue() ) status = put_response.get("ResponseMetadata", {}).get("HTTPStatusCode") if status == 200: print(f"Successful S3 put_object response. Status - {status}") else: print(f"Unsuccessful S3 put_object response. Status - {status}")
解决方案二:自动刷新.aws/credentials文件(本地Windows环境适用)
如果必须通过PowerShell登录获取凭证,可以编写脚本实现自动刷新,并借助Windows任务计划每日执行:
1. 编写PowerShell刷新脚本(refresh-aws-creds.ps1)
根据你的实际登录方式选择对应逻辑:
# 方式1:AWS SSO登录(如果用SSO验证) aws sso login --profile your-profile-name # 方式2:STS角色假设(如果通过角色获取临时凭证) # $roleArn = "arn:aws:iam::123456789012:role/your-target-role" # $credResult = (aws sts assume-role --role-arn $roleArn --role-session-name "daily-s3-session").ConvertFrom-Json # $accessKey = $credResult.Credentials.AccessKeyId # $secretKey = $credResult.Credentials.SecretAccessKey # $sessionToken = $credResult.Credentials.SessionToken # # # 覆盖写入credentials文件 # $credFilePath = "$env:USERPROFILE\.aws\credentials" # @" # [default] # aws_access_key_id = $accessKey # aws_secret_access_key = $secretKey # aws_session_token = $sessionToken # "@ | Out-File $credFilePath -Force
2. 设置Windows任务计划自动执行
- 打开「任务计划程序」,创建基本任务
- 触发器设置为每日,比如每天凌晨1点执行
- 操作选择「启动程序」,程序/脚本填
powershell.exe,添加参数:-ExecutionPolicy Bypass -File "C:\你的脚本路径\refresh-aws-creds.ps1" - 确保任务运行的用户账户有修改
.aws/credentials文件的权限
额外注意事项
- 若使用AWS SSO,可在AWS控制台调整SSO会话有效期(最长支持12小时)
- 绝对避免在代码中硬编码凭证,既不安全又会因过期频繁报错
- 测试时可先手动执行刷新脚本,再运行Python脚本验证功能是否正常
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

