每当触发lambda时,如何运行存在于AWS EC2中的python脚本?

时间:2019-09-09 07:07:12

标签: python amazon-web-services amazon-ec2 aws-lambda

我的AWS EC2实例中存在一个python脚本,可以完成某些工作。 每当新文件进入特定存储桶时,我都必须触发该脚本。

我的想法是向该存储桶添加一个lambda触发器,该触发器又会触发EC2中存在的脚本,但未能成功。

那么,如果按照我的计划或者该问题还有其他解决方法,该如何解决?

3 个答案:

答案 0 :(得分:2)

正如评论中更好地建议使用SNSSQS一样,我认为它比lambda函数更合适,并且与SNS或SQS涉及S3和{{1 }}实例,为什么还要添加额外的lambda层呢?

尽管三个人可以订阅该事件,但是lambda涉及一层额外的事务,也涉及ssh,我认为这在时间上是昂贵的(s3事件接收+事件处理+ ec2的ssh)。

enter image description here

使用Lambda:

当lambda触发器启动时,它将开始对ec2做EC2并运行脚本,而Lambda的一大优势是您可以运行任何类型的脚本,而您无需运行需要服务器来保持它们正常运行,就像SQS和SNS一样。您可以浏览这些示例ssh-ec2-lambda/scheduling-ssh-jobs-using-aws-lambda,第二个示例是相似的,只是您需要基于事件而不是计划。

SNS:

如果多个实例假设要在ec2实例上运行作业脚本,则SNS是更好的选择。该图有点类似于您的用例或用于表示一张大图。

enter image description here

SQS:

如果只应运行一个实例,则SQS将适合处理该事件。

enter image description here

答案 1 :(得分:1)

  • 我不确定您的选择为什么不起作用,因为它绝对可行,我已经使用此博客aws blog
  • 完成了此操作
  • 此git repository的代码可在具有特定扩展名的文件上传到存储桶(terraform)时触发lambda。
  • 您可以使用标签通过lambda访问EC2实例,如上面的块所示。
  • 希望这对您有帮助。

答案 2 :(得分:0)

我在网上找到的博客的帮助下对其进行了管理,该博客已经失去了链接,但有代码。

import time
import boto3
import paramiko
import os

def lambda_handler(event, context):

    ec2 = boto3.resource('ec2', region_name='us-east-1',aws_access_key_id='XXXXXXXXXXXXXXXXXXXX',aws_secret_access_key='XXXXXXXXXXXXXXXXXXXX')

    instance_id = 'XXXXXXXXXXXXXXXX'

    instance = ec2.Instance(instance_id)

    # Start the instance
    instance.start()

    # Giving some time to start the instance completely
    #time.sleep(60)

    # Connect to S3, we will use it get the pem key file of your ec2 instance
    s3_client = boto3.client('s3',aws_access_key_id='XXXXXXXXXXXXXXXXXXXX',aws_secret_access_key='XXXXXXXXXXXXXXXXXXXX')

    # # # Download private key file from secure S3 bucket
    # # # and save it inside /tmp/ folder of lambda event
    bucket_name = ''
    key_name = ''
    key_location = ''
    s3_client.download_file(bucket_name, key_name, key_location)

    # # # # Allowing few seconds for the download to complete
    time.sleep(10)

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    privkey = paramiko.RSAKey.from_private_key_file(key_location)
    # # # username is most likely 'ec2-user' or 'root' or 'ubuntu'
    # # # depending upon yor ec2 AMI
    ssh.connect(instance.private_ip_address,22, username='ubuntu', pkey=privkey)



    commands = []
    for command in commands:
        print("Executing {}".format(command))
        stdin , stdout, stderr = ssh.exec_command(command)
        stdin.flush()
        data = stdout.read().splitlines()
        for line in data:
            print(line)
    ssh.close()

    return 'Success'

现在,只需将paramiko库压缩在一起即可。如果我再次找到该博客,将会审核答案。