You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需上传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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:50:21