如何通过boto3在EC2实例上运行python脚本

时间:2017-10-26 13:21:33

标签: python amazon-web-services amazon-ec2 boto3

我在How to SSH and run commands in EC2 using boto3?之前阅读了这个问题。许多答案只是说用户不必使用SELECT * From Questions WHERE Login IS NOT in Questions 连接到EC2并运行命令。但是,我仍然不知道如何通过boto3运行python脚本。在boto2中,这是一个函数ssh,用户可以将其脚本传递到EC2节点并运行它,就像下面的代码列表一样

run_instances

def run(self, **kwargs): ec2 = boto.connect_ec2(settings.PDF_AWS_KEY, settings.PDF_AWS_SECRET) sqs = boto.connect_sqs(settings.PDF_AWS_KEY, settings.PDF_AWS_SECRET) queue = sqs.create_queue(REQUEST_QUEUE) num = queue.count() launched = 0 icount = 0 reservations = ec2.get_all_instances() for reservation in reservations: for instance in reservation.instances: if instance.state == "running" and instance.image_id == AMI_ID: icount += 1 to_boot = min(num - icount, MAX_INSTANCES) if to_boot > 0: startup = BOOTSTRAP_SCRIPT % { 'KEY': settings.PDF_AWS_KEY, 'SECRET': settings.PDF_AWS_SECRET, 'RESPONSE_QUEUE': RESPONSE_QUEUE, 'REQUEST_QUEUE': REQUEST_QUEUE} r = ec2.run_instances( image_id=AMI_ID, min_count=to_boot, max_count=to_boot, key_name=KEYPAIR, security_groups=SECURITY_GROUPS, user_data=startup) launched = len(r.instances) return launched

我用boto3编写了一些代码:

BOOTSTRAP_SCRIPT is a python script

我可以获取正在运行的实例的详细信息,任何人都可以告诉我# -*- coding: utf-8 -*- SCRIPT_TORUN = """ import boto3 bucket = random_str() image_name = random_str() s3 = boto3.client('s3') Somedata = 'hello,update' upload_path = 'test/' + image_name s3.put_object(Body=Somedata, Bucket='cloudcomputing.assignment.storage', Key=upload_path) """ import boto3 running_instance = [] ec2 = boto3.resource('ec2') for instance in ec2.instances.all(): if instance.state['Name'] == 'running': # Choose running instance and save their instance_id running_instance.append(instance.id) print instance.id, instance.state print running_instance 中有run_instances这样的函数,我可以使用它在我的一个中运行脚本boto3运行EC2实例。

4 个答案:

答案 0 :(得分:1)

请参阅:Boto3 run_instances

您要查找的参数是: UserData ='字符串'

UserData (string) -

  

要使实例可用的用户数据。欲获得更多信息,   请参阅启动时在Linux实例上运行命令(Linux)和   添加用户数据(Windows)。如果您使用的是命令行工具,   base64-encoding是为您执行的,您可以从中加载文本   文件。否则,您必须提供base64编码的文本。

此值将自动进行base64编码。在执行操作之前,不要对此值进行base64编码。

答案 1 :(得分:1)

如果您只想运行一次脚本,特别是在EC2启动时,那么您可以在调用run_instances时在userdata中提供脚本。

但是,如果您想在ad hoc基础上在一个(或多个)EC2实例上运行脚本,那么您应该查看EC2 Systems Manager(Run Command)或类似的内容Fabricexample)。

答案 2 :(得分:0)

以下是我的工作方式

import boto3
import botocore
import boto
import paramiko

ec2 = boto3.resource('ec2')

instances = ec2.instances.filter(
Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
i = 0
for instance in instances:
  print(instance.id, instance.instance_type)
  i+= 1
x = int(input("Enter your choice: "))
try:
  ssh = paramiko.SSHClient()
  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  privkey = paramiko.RSAKey.from_private_key_file('address to .pem key')
  ssh.connect(instance.public_dns_name,username='ec2-user',pkey=privkey)
  stdin, stdout, stderr = ssh.exec_command('python input_x.py')
  stdin.flush()
  data = stdout.read().splitlines()
for line in data:
    x = line.decode()
    #print(line.decode())
    print(x,i)
    ssh.close()
except:
  --------

我已经添加了AWSCLI包,开放终端和运行命令

aws configure

并输入详细信息,boto3将从.aws文件夹中保存并自动读取。

答案 3 :(得分:0)

以下是使用另一个名为paramiko的

的python库的方法
import paramiko

user_name='ubuntu'
instance_id='i-08h873123123' #just an example
pem_addr='/Users/folder1/.ssh/jack-aws.pem' # folder path to aws instance key
aws_region='us-east-1' 


instances = ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])


for instance in instances:
    if (instance.id==instance_id):
        p2_instance=instance
        break;



ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
privkey = paramiko.RSAKey.from_private_key_file(pem_addr)
ssh.connect(p2_instance.public_dns_name,username=user_name,pkey=privkey)


cmd_to_run='dropbox start && source /home/ubuntu/anaconda3/bin/activate py36 && cd /home/ubuntu/xx/yy/ && python3 func1.py' #you can seperate two shell commands by && or ;
stdin4, stdout4, stderr4 = ssh.exec_command(cmd_to_run,timeout=None, get_pty=False)
ssh.close()