求助:通过PowerShell上传S3时偶尔出现0KB文件的问题
问题排查与解决方案
核心问题分析
你的自动化任务在非7点时段出现S3上传0KB文件、后续归档任务不执行的问题,手动运行脚本正常,说明问题大概率出在任务执行上下文差异、文件生成完整性校验缺失或脚本错误处理不足上。
具体解决步骤
1. 确保源文件生成完成后再触发上传
非7点时段可能存在文件生成未完成就启动上传的情况(比如任务1的写入耗时更长),导致上传空文件。在任务2开头添加文件完整性校验:
$sourceFile = "c:\temp\exportfile.txt" # 等待文件非空且5秒内大小无变化,确认写入完成 do { $prevSize = (Get-Item $sourceFile -ErrorAction Stop).Length Start-Sleep -Seconds 5 $currSize = (Get-Item $sourceFile).Length } while ($currSize -eq 0 -or $currSize -ne $prevSize)
2. 完善脚本的错误捕获与日志记录
当前脚本没有错误处理,上传失败可能返回错误码但未被捕获,导致任务调度工具误判任务完成。修改脚本添加日志和错误校验:
$KeyID = "###############" $AccessKey = "################" $SourceFile = "c:\temp\exportfile.txt" $Destination = "s3://bucket-name-here/Folder1/Folder2/exportfile.txt" $logPath = "c:\temp\s3_upload_$(Get-Date -Format 'yyyyMMddHHmmss').log" # 使用独立配置文件避免污染全局AWS配置 aws configure set aws_access_key_id $KeyID --profile upload-task aws configure set aws_secret_access_key $AccessKey --profile upload-task # 执行上传并记录所有输出 aws s3 cp $SourceFile $Destination --profile upload-task *>&1 | Out-File $logPath # 检查上传退出码,失败则终止后续任务 if ($LASTEXITCODE -ne 0) { Write-Error "S3上传失败,详细日志:$logPath" exit 1 }
注意:硬编码密钥存在安全风险,建议改用IAM角色(若部署在AWS资源上)或AWS Secrets Manager存储密钥。
3. 添加上传重试机制
非7点时段可能存在网络波动导致上传中断,添加重试逻辑提升稳定性:
$retryMax = 3 $retryDelay = 10 # 秒 $uploadSuccess = $false for ($i=1; $i -le $retryMax; $i++) { aws s3 cp $SourceFile $Destination --profile upload-task *>&1 | Out-File $logPath -Append if ($LASTEXITCODE -eq 0) { $uploadSuccess = $true break } Write-Host "上传失败,第$i次重试,等待$retryDelay秒..." Start-Sleep -Seconds $retryDelay } if (-not $uploadSuccess) { Write-Error "经$retryMax次重试仍上传失败,日志路径:$logPath" exit 1 }
4. 检查任务调度的执行上下文
- 确认所有时段的任务使用相同用户身份执行,避免权限差异导致的AWS配置读取问题;
- 检查调度工具(如Windows任务计划程序)的设置:是否勾选了**"只有前一个任务成功完成时才执行此任务"**,确保任务3仅在任务2成功后启动;
- 对比7点与其他时段的网络环境,确认非高峰时段是否存在S3访问延迟或限流。
内容的提问来源于stack exchange,提问作者Tom Camish
相关产品推荐
相关产品推荐

