AWS环境下EC2上ETL脚本自动化启停执行方案咨询
自动化EC2上ETL任务的最新AWS解决方案
核心组件
- Amazon EventBridge:定时触发EC2启动流程
- AWS Lambda:处理EC2启动、状态检查及相关指令触发
- AWS Systems Manager (SSM) Run Command:远程执行EC2上的ETL脚本
- IAM角色:为EC2、Lambda、SSM分配最小必要权限
步骤1:配置EC2实例的SSM访问权限
- 给目标EC2实例附加AmazonEC2RoleforSSM IAM角色(该角色包含SSM管理EC2的基础权限)
- 确认EC2实例已安装SSM Agent:Amazon Linux 2/2023、Ubuntu 18.04+等主流系统默认预装,其他系统可手动安装
- 确保EC2能连接SSM服务:可配置VPC端点(SSM、EC2 Messages、SSM Messages),或允许EC2通过NAT网关/公网IP访问互联网
步骤2:修改ETL脚本的收尾逻辑
在Python ETL脚本末尾添加关机指令,确保脚本执行成功后自动关闭实例:
# ETL任务执行完成后添加以下代码 import subprocess # 仅在脚本无异常时执行关机,可根据实际逻辑调整判断条件 try: subprocess.run(["sudo", "shutdown", "-h", "now"], check=True) except Exception as e: print(f"脚本执行失败,不执行关机:{e}")
步骤3:创建Lambda函数(启动EC2并触发ETL)
- 在Lambda控制台创建Python运行时的函数
- 为Lambda附加自定义IAM角色,包含以下权限:
ec2:StartInstances:启动目标EC2ssm:SendCommand:发送Run Command指令iam:PassRole:传递SSM执行所需角色
- Lambda代码示例:
import boto3 ec2_client = boto3.client('ec2') ssm_client = boto3.client('ssm') TARGET_INSTANCE_ID = "你的EC2实例ID" ETL_SCRIPT_PATH = "/path/to/your/etl/script.py" def lambda_handler(event, context): # 启动EC2实例 ec2_client.start_instances(InstanceIds=[TARGET_INSTANCE_ID]) # 等待实例进入运行状态,确保SSM可连接 waiter = ec2_client.get_waiter('instance_running') waiter.wait(InstanceIds=[TARGET_INSTANCE_ID]) # 通过SSM触发ETL脚本执行 ssm_client.send_command( InstanceIds=[TARGET_INSTANCE_ID], DocumentName='AWS-RunShellScript', Parameters={ 'commands': [f"cd $(dirname {ETL_SCRIPT_PATH}) && python3 {ETL_SCRIPT_PATH}"] } ) return {"status": "ETL task triggered"}
步骤4:设置EventBridge定时触发
- 在EventBridge控制台创建规则,选择按计划触发
- 设置定时表达式(例如每天凌晨2点执行:
cron(0 2 * * ? *)) - 将目标设置为上述Lambda函数,完成配置
简化备选方案:用EC2用户数据自动执行
如果不需要SSM的任务监控能力,可省略Lambda+SSM环节:
- 编辑EC2实例的用户数据,添加启动时执行的脚本:
#!/bin/bash cd /path/to/your/etl/scripts python3 your_etl_script.py sudo shutdown -h now
- 修改EC2启动行为:实例→操作→实例设置→更改用户数据,勾选每次启动或重启时执行
- 用EventBridge定时触发Lambda启动EC2即可
关键注意事项
- 权限最小化:为所有IAM角色仅分配必要权限,避免过度授权
- 日志排查:在Lambda和ETL脚本中添加日志输出,通过CloudWatch Logs追踪执行状态
- 异常处理:为ETL脚本添加错误捕获逻辑,避免意外中断导致实例无法自动关机
内容的提问来源于stack exchange,提问作者manja-dev
相关产品推荐
相关产品推荐

