如何无需上传Python脚本至EC2实例,远程定时执行脚本?
需求可行性确认
完全可行,无需上传脚本到EC2、定时远程执行统计脚本的目标可以通过AWS Lambda结合SSM Run Command实现,完全符合你不能修改AMI的流程限制。
基于Lambda的实现方案
1. 给目标EC2配置SSM访问权限
- 给EC2实例绑定的IAM角色添加
AmazonSSMManagedInstanceCore权限策略,让实例能被AWS Systems Manager管理。 - 确保EC2实例能访问SSM服务:如果实例在私有子网,需配置SSM的VPC端点;如果在公有子网,确保实例有公网IP或能通过NAT网关访问公网。
2. 编写Lambda函数
用Python编写Lambda函数,通过boto3调用SSM Run Command,直接把你的统计脚本内容作为命令在EC2上执行,无需上传脚本文件。示例代码如下:
import boto3 def lambda_handler(event, context): ssm_client = boto3.client('ssm') # 替换成你的EC2实例ID instance_id = 'i-xxxxxxxxx' # 把你的统计脚本内容转成字符串,注意转义引号 script_content = """ import os import psutil import requests # 替换成你的租户目录路径 tenants_dir = '/path/to/tenants' # 替换成你的Grafana API地址 grafana_api = 'https://your-grafana-api-endpoint' for tenant in os.listdir(tenants_dir): tenant_path = os.path.join(tenants_dir, tenant) if not os.path.isdir(tenant_path): continue # 统计租户目录下的文件总数 file_count = 0 for root, _, files in os.walk(tenant_path): file_count += len(files) # 统计关联租户的进程内存占用(根据你的实际逻辑调整) mem_usage = 0 for proc in psutil.process_iter(['pid', 'cmdline', 'memory_info']): try: if tenant in ' '.join(proc.cmdline()): mem_usage += proc.memory_info().rss except (psutil.NoSuchProcess, psutil.AccessDenied): continue # 上报数据到Grafana requests.post(grafana_api, json={ 'tenant': tenant, 'file_count': file_count, 'mem_usage_mb': round(mem_usage / 1024 / 1024, 2) }) """ # 执行命令:用python3 -c直接运行脚本内容 response = ssm_client.send_command( InstanceIds=[instance_id], DocumentName='AWS-RunShellScript', Parameters={ 'commands': [f'python3 -c "{script_content.replace('"', '\\"')}"'] }, # 可选:指定执行用户(比如root)确保有权限访问租户目录 RunCommandParameters={ 'RunShellScript': { 'WorkingDirectory': '/', 'ExecutionTimeout': '300' } } ) return {'command_id': response['Command']['CommandId']}
3. 配置定时触发
在Lambda函数的触发器中添加EventBridge(原CloudWatch Events)规则,设置触发频率为rate(15 minutes),即可实现每15分钟自动触发脚本执行。
4. 处理脚本依赖
如果你的脚本依赖第三方库(比如psutil、requests),需确保EC2实例已安装:
- 可以手动在EC2上执行一次
pip3 install psutil requests; - 或者在Lambda的命令中先执行安装命令,再运行脚本,示例commands如下:
['pip3 install psutil requests --user', f'python3 -c "{script_content.replace('"', '\\"')}"']
CodeDeploy的作用说明
CodeDeploy是AWS的应用部署服务,主要用于自动化部署代码包(如后端服务、前端静态文件)到EC2、ECS、Lambda等资源,适合持续集成/持续部署(CI/CD)场景,比如批量更新多台实例的应用版本。对你的需求来说,它属于“大材小用”——你只是要定时执行一段临时脚本,不需要把脚本部署到实例上长期保存,因此Lambda+SSM的方案更轻量、更贴合需求。
内容的提问来源于stack exchange,提问作者Grant Toenges
相关产品推荐
相关产品推荐

