2017-02-10 21 views
0

Извините, если он повторяется, но я не мог найти ничего стоящего для выполнения моей задачи. У меня есть экземпляр, и я решил запустить и остановить его с помощью boto3, и это работает, но реальная проблема заключается в запуске скрипта, когда экземпляр включен. Я хотел бы дождаться завершения скрипта и затем остановить экземпляр.Запуск сценария Python на AWS EC2

python /home/ubuntu/MyProject/TechInd/EuropeRun.py & 
python /home/ubuntu/FTDataCrawlerEU/EuropeRun.py & 

Чтение немало пост приводит к направлению Lambda и AWS Beanstalk, но те, кажется, не просто.

Любое предложение очень ценится.

С уважением DC

ответ

1

Вы можете использовать следующий код.

import boto3 
import botocore 
import os 
from termcolor import colored 
import paramiko 


def stop_instance(instance_id, region_name): 
    client = boto3.client('ec2', region_name=region_name) 
while True: 
    try: 
     client.stop_instances(
      InstanceIds=[ 
       instance_id, 
      ], 
      Force=False 
     ) 

    except Exception, e: 
     print e 

    else: 
     break 

# Waiter to wait till instance is stopped 
waiter = client.get_waiter('instance_stopped') 
try: 
    waiter.wait(
     InstanceIds=[ 
      instance_id, 
     ] 
    ) 
except Exception, e: 
    print e 


def ssh_connect(public_ip, cmd): 

# Join the paths using directory name and file name, to avoid OS conflicts 
key_path = os.path.join('path_to_aws_pem', 'file_name.pem') 

key = paramiko.RSAKey.from_private_key_file(key_path) 
client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

# Connect/ssh to an instance 
while True: 
    try: 
     client.connect(hostname=public_ip, username="ubuntu", pkey=key) 

     # Execute a command after connecting/ssh to an instance 
     stdin, stdout, stderr = client.exec_command(cmd) 
     print stdout.read() 

     # close the client connection once the job is done 
     client.close() 
     break 

    except Exception, e: 
     print e 

# Main/Other module where you're doing other jobs: 

# Get the public IP address of EC2 instance, I assume you should have handle to the ec2 instance already 
# You can use any alternate method to fetch/get public ip of your ec2 instance 
public_ip = ec2_instance.public_ip_address 


# Get the instance ID of EC2 instance, I assume you should have handle to the ec2 instance already 
instance_id = ec2_instance.instance_id 

# Command to Run/Execute python scripts 
cmd = "nohup python /home/ubuntu/MyProject/TechInd/EuropeRun.py & python /home/ubuntu/FTDataCrawlerEU/EuropeRun.py &" 
ssh_connect(public_ip, cmd) 
print colored('Script execution finished !!!', 'green') 

# Shut down/Stop the instance 
stop_instance(instance_id, region_name) 
+0

Thanks mate. Официант второй действительно очень полезен. – user3341078

+0

Рад знать, что это вам помогло. Пожалуйста, отметьте ответ как принятый, если он служит цели. – Venkatesh

0

Вы можете выполнить вашу команду выключения через питон коды, как только ваш скрипт будет выполнен.

Пример с использованием Ls

from subprocess import call 
call(["ls", "-l"]) 

Но для чего-то, что просто лямбда гораздо проще и ресурсосберегающим. Вам нужно только загрузить свой скрипт в s3 и выполнить функцию лямбда через boto3. На самом деле вы можете просто скопировать код сценария в консоль лямбды, если у вас нет каких-либо зависимостей.

0

Некоторые опции для автоматического запуска скрипта при загрузке системы:

  • вызова сценария с помощью EC2 User-Data
  • настроить АМИ, чтобы запустить скрипт при загрузке через скрипт init.d, или @reboot cron job.

Чтобы завершить работу экземпляра после завершения сценария, добавьте в конце сценария код, чтобы либо инициировать выключение ОС, либо вызвать AWS API (через Boto), чтобы завершить работу экземпляра.