如何让Auto Scaling Group中的EC2实例每分钟运行自动化脚本?
可以通过SSM Document结合SSM的定时执行能力实现需求,以下是两种可行思路:
方案1:SSM State Manager + 自定义Command类型Document
SSM State Manager支持对实例进行周期性配置管理,适合固定频率的重复任务:
第一步:创建自定义SSM Document
选择Command类型,内容编写执行脚本的命令。比如Linux实例:bash /opt/your-script.sh >> /var/log/script-exec.log 2>&1如果脚本还未部署到实例,可先通过Document从S3下载再执行:
aws s3 cp s3://your-bucket/scripts/your-script.sh /opt/ && chmod +x /opt/your-script.sh && bash /opt/your-script.sh >> /var/log/script-exec.log 2>&1第二步:配置State Manager关联
选择刚创建的Document,目标实例通过ASG的标签(比如AutoScalingGroupName=your-asg-name)匹配,执行频率设置为* * * * *(cron表达式,每分钟执行一次)。第三步:确保实例权限
ASG启动的EC2实例必须关联包含AmazonSSMManagedInstanceCore权限的IAM角色,才能被SSM服务管理。
方案2:SSM Automation + EventBridge定时触发
通过EventBridge触发SSM Automation文档,实现更灵活的定时调度:
第一步:创建Automation类型的SSM Document
定义aws:runCommand动作,指定目标实例标签,执行脚本命令。示例Document片段:description: 每分钟执行自定义脚本 schemaVersion: '0.3' parameters: {} mainSteps: - name: RunScript action: aws:runCommand inputs: DocumentName: AWS-RunShellScript Parameters: commands: - bash /opt/your-script.sh >> /var/log/script-exec.log 2>&1 Targets: - Key: tag:AutoScalingGroupName Values: - your-asg-name第二步:配置EventBridge规则
创建定时触发规则,cron表达式设为* * * * *,目标选择SSM Automation,指定上述Document,并配置执行所需的IAM角色(需包含AmazonSSMAutomationRole权限)。第三步:实例权限配置
同方案1,实例需关联AmazonSSMManagedInstanceCore角色,确保能接收SSM命令。
关键注意事项
- 脚本部署:如果脚本无需动态更新,可通过ASG的Userdata在实例启动时将脚本写入指定路径(比如
/opt/),后续由SSM定时调用;若需频繁更新,建议存放在S3,每次执行时下载最新版本。 - 日志排查:将脚本输出写入本地日志文件,并配置CloudWatch Agent将日志上传到CloudWatch Logs,方便追踪执行状态和错误。
- 启动延迟:ASG新实例启动后需要时间注册到SSM服务,首次执行可能延迟1-2分钟,若需严格准时,可在脚本中添加初始检查逻辑,或在State Manager关联中设置适当的延迟执行时间。
内容的提问来源于stack exchange,提问作者wonderfulworldwithcharity

