如何通过本地Python代码运行AWS EC2(Ubuntu18)上的Python脚本?
嘿,我懂你想通过本地Python代码触发AWS EC2(Ubuntu 18)上的脚本运行——你提到了boto,但其实boto3主要是用来管理AWS资源(比如创建、启停实例)的,要直接执行实例上的脚本,我们得结合**SSH连接工具(比如paramiko)**和boto3来获取实例的必要信息。下面是完整的步骤和可运行的示例代码:
完整实现方案
1. 前置准备
先确保这些前提条件都满足:
- 你的EC2实例处于运行状态,安全组已经开放SSH端口(22),且允许你的本地IP访问
- 你拥有能登录该实例的SSH密钥对(.pem文件)
- 本地Python环境安装好必要的库:
pip install boto3 paramiko - 配置AWS凭证:可以通过
~/.aws/credentials文件配置,或者设置环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY
2. 用boto3获取EC2实例的公网IP
首先我们需要通过boto3查询目标实例的公网IP,这是建立SSH连接的基础:
import boto3 def get_ec2_public_ip(instance_id, region): # 初始化EC2客户端 ec2_client = boto3.client('ec2', region_name=region) # 查询实例信息 response = ec2_client.describe_instances(InstanceIds=[instance_id]) # 提取公网IP字段 public_ip = response['Reservations'][0]['Instances'][0]['PublicIpAddress'] return public_ip # 替换成你的实例ID和AWS区域 TARGET_INSTANCE_ID = 'i-xxxxxxxxxxxxxxxxx' AWS_REGION = 'us-east-1' # 比如你的实例在新加坡区就是ap-southeast-1 instance_public_ip = get_ec2_public_ip(TARGET_INSTANCE_ID, AWS_REGION) print(f"目标EC2实例的公网IP: {instance_public_ip}")
3. 建立SSH连接并执行远程脚本
拿到公网IP后,用paramiko建立SSH连接,然后执行服务器上的Python脚本:
import paramiko def execute_remote_python_script(public_ip, key_file_path, remote_script_path, username='ubuntu'): # 创建SSH客户端对象 ssh = paramiko.SSHClient() # 自动接受未知主机的密钥(生产环境建议手动验证,更安全) ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: # 连接EC2实例 ssh.connect( hostname=public_ip, username=username, key_filename=key_file_path ) print("✅ 成功连接到EC2实例") # 构造执行命令,Ubuntu18默认Python3是3.6,根据你的脚本调整版本 exec_command = f'python3 {remote_script_path}' # 执行命令并获取输出 stdin, stdout, stderr = ssh.exec_command(exec_command) # 打印脚本的正常输出 print("\n📜 脚本执行输出:") print(stdout.read().decode('utf-8')) # 打印错误信息(如果有的话) error_output = stderr.read().decode('utf-8') if error_output: print("\n❌ 错误信息:") print(error_output) finally: # 不管执行成功与否,都关闭SSH连接 ssh.close() print("\n🔌 SSH连接已关闭") # 替换成你的密钥文件路径和远程脚本的绝对路径 SSH_KEY_PATH = '/Users/yourname/.ssh/your-key-pair.pem' REMOTE_PYTHON_SCRIPT = '/home/ubuntu/your_script_to_run.py' # 调用函数执行脚本 execute_remote_python_script(instance_public_ip, SSH_KEY_PATH, REMOTE_PYTHON_SCRIPT)
4. 关键注意事项
- 密钥文件权限:在Linux/macOS系统下,务必设置密钥文件的权限为
chmod 400 your-key-pair.pem,否则paramiko会拒绝使用该密钥 - 安全组配置:如果连接失败,先检查安全组是否允许你的本地IP访问22端口
- 生产环境优化:不要使用
AutoAddPolicy(),应该手动验证主机密钥;另外也可以考虑用AWS Systems Manager Run Command来执行脚本,不需要开放SSH端口,安全性更高(不过如果你的场景必须用SSH,上面的方案完全可行) - Python版本兼容:确保远程脚本的语法和EC2实例上的Python版本兼容(Ubuntu18默认Python3是3.6)
内容的提问来源于stack exchange,提问作者Ne1zvestnyj
相关产品推荐
相关产品推荐

