Search code examples
pythonpython-3.xamazon-web-servicesamazon-ec2boto3

How do I run a python script that is located on the AWS EC2 server?


I want to use python code on my computer to run a python script that is located on the server (EC2 ubuntu 18). I understand that you can use boto for this, but I didn't find a full-fledged example where it would be written here is the server, we connect to it like this, we execute the script like this.


Solution

  • You can do so by using AWS SSM or lambda function.

    Refer to @mokugo-devops 's answer for AWS SSM

    or Refer to this for lambda function approach

    #requires paramiko package
    #paramiko package is available at:
    # https://github.com/pranavmalaviya2/COVID-19-Live-Data-board/tree/master/lambda%20functions/SSH_lambda-Deployment-package
    
    import json
    import boto3
    import paramiko
    import time
    
    def lambda_handler(event, context):
        # boto3 client
        client = boto3.client('ec2')
        s3_client = boto3.client('s3')
        
        # getting instance information
        describeInstance = client.describe_instances()
        
        # downloading pem file from S3 
        s3_client.download_file('bucket-name','key-name.pem', '/destination/folder/new-key-name.pem')
    
        # reading pem file and creating key object
        key = paramiko.RSAKey.from_private_key_file("/destination/folder/new-key-name.pem")
        # an instance of the Paramiko.SSHClient
        ssh_client = paramiko.SSHClient()
        # setting policy to connect to unknown host
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
        # connect using ec2 instance ID if requires
        ssh_client.connect(hostname="12.12.12.12", username="ubuntu", pkey=key)
    
        # command list
        commands = [
            "python script.py",
            "python script2.py",
            "aws s3 cp --recursive source/ s3://destination-bucket/",
        ]
    
        # executing list of commands within server
        print("Starting execution")
        for command in commands:
            print("Executing command: " + command)
            stdin , stdout, stderr = ssh_client.exec_command(command)
            print(stdout.read())
            print(stderr.read())
        
        print("finished execution")
        
        return {
            'statusCode': 200,
            'body': json.dumps('Execution Completed')
        }