如何在Windows EC2实例上定时调度运行AWS CLI脚本
方案说明
你当前场景不需要套用「启动实例-跑脚本-销毁实例」的临时实例方案,这台Windows EC2本身长期运行,直接用Windows原生的任务计划程序托管脚本即可,和你手动在MobaXterm里跑AWS CLI的逻辑完全一致,不会影响实例上部署的Dbeaver等工具,配置步骤如下:
前置准备:给EC2配置对应S3操作权限
先给这台EC2绑定的IAM实例角色添加目标S3路径的操作权限,不要把访问密钥硬编码在脚本里:
- 允许的操作至少包含
s3:ListBucket、s3:DeleteObject - 权限范围限定到你需要定期删除的S3桶和对应文件夹前缀即可,遵循最小权限原则
配置完可以在EC2里开cmd跑一句aws s3 ls 你的目标S3路径验证权限是否正常。
第一步:编写可独立运行的批处理脚本
把你手动执行的AWS CLI删除逻辑存为.bat批处理文件,注意所有路径都写绝对路径——定时任务运行时的系统环境变量和你手动开MobaXterm/CMD的环境不一样,用相对路径大概率报错。
示例脚本(存为C:\aws_scripts\s3_daily_clean.bat):
@echo off :: 先执行 where aws 命令查询本机AWS CLI的实际安装路径,替换下面的路径 set AWS_EXE="C:\Program Files\Amazon\AWSCLIV2\aws.exe" :: 替换为你要清理的目标S3文件夹路径 set TARGET_S3_PATH="s3://your-bucket-name/temp-upload-folder/" :: 日志输出路径,方便后续排查问题 set LOG_FILE="C:\aws_scripts\clean_log.txt" echo %date% %time% 清理任务启动 >> %LOG_FILE% :: 下面这行替换成你平时手动跑、确认能正常生效的AWS CLI删除命令 :: 示例为递归删除目标路径下所有内容,如果要删指定天数的老文件直接替换对应命令即可 %AWS_EXE% s3 rm %TARGET_S3_PATH% --recursive >> %LOG_FILE% 2>&1 echo %date% %time% 任务执行结束,返回码:%errorlevel% >> %LOG_FILE%
脚本写完先手动双击运行一次,确认S3对应内容能正常删除、日志文件能正常写入,没有报错再进行下一步。
第二步:配置Windows任务计划程序定时触发
- 开始菜单搜索打开
任务计划程序(Task Scheduler) - 右侧操作栏选择「创建基本任务」,填写任务名称(比如「每日S3自动清理」)后点下一步
- 触发器选择「每天」,设置你需要的早间运行时间,下一步
- 操作选择「启动程序」,下一步
- 程序路径选择你刚才保存的bat文件,「起始于(可选)」输入框必须填写脚本所在的文件夹路径,也就是
C:\aws_scripts\,否则会出现工作目录错误 - 勾选「点击完成时打开任务属性面板」,点完成
- 在弹出的属性面板里调整几个关键配置,避免任务不触发:
- 安全选项里选择「不管用户是否登录都要运行」,勾选「使用最高权限运行」
- 切到「条件」标签页,取消勾选「只有在计算机使用交流电源时才启动此任务」(云服务器无电池逻辑,这个选项会拦截任务触发)
- 切到「设置」标签页,可以勾选「任务失败时自动重试」,设置1分钟间隔重试3次,规避偶发网络波动导致的执行失败
验证配置
在任务计划程序的任务库找到刚创建的任务,右键选择「运行」,等待执行完成后查看之前配置的日志文件,确认执行结果符合预期,后续到设定时间任务就会自动运行,不需要手动操作。
常见踩坑提醒
- 所有路径必须写绝对路径,包括AWS CLI的执行路径、脚本路径、日志路径,不要依赖系统PATH
- 不要硬编码AK/SK在脚本里,用EC2实例角色的凭证既安全也不用定期轮换密钥
- 如果删除逻辑有调整,直接修改bat脚本里的AWS CLI命令即可,不需要重新配置定时任务
内容的提问来源于stack exchange,提问作者whatsinthename
相关产品推荐
相关产品推荐

