为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

千万里不及你 2022-05-24 14:57:34
我的 AWS EC2 实例中有一个 python 脚本可以完成一些工作。每当新文件进入特定存储桶时,我都必须触发该脚本。我的想法是向该存储桶添加一个 lambda 触发器,该触发器依次触发 EC2 中存在的脚本,但未能这样做。那么如果按照我的计划如何实现解决方案,或者是否有任何其他解决方法可以解决这个问题?
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

正如评论中建议更好地使用SNSor ,我认为它比 lambda 函数更合适,并且 SNS 或 SQS 涉及与实例SQS之间的一对一通信,那么为什么要添加额外的 lambda 层?S3EC2

虽然三个可以订阅事件,但 lambda 涉及一个额外的层,并且还涉及 ssh,我认为这在时间上是昂贵的(s3 事件接收 + 事件进程 + ssh 到 ec2)。

//img1.sycdn.imooc.com//628c81f90001f41a07010604.jpg

使用 Lambda:

当 lambda 触发器将开始ssh对 ec2 执行操作并运行脚本时,Lambda 的一大优势是您可以运行任何类型的脚本,并且您不需要服务器来保持它们的正常运行,就像 SQS 和社交网络。您可以探索这些示例ssh-ec2-lambda/scheduling-ssh-jobs-using-aws-lambda,第二个示例类似,只是您需要基于事件而不是调度。

社交网络:

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


//img1.sycdn.imooc.com//628c820400016e4705870198.jpg

质量保证:

如果只有一个实例应该运行脚本,那么 SQS 将适合处理该事件。

//img1.sycdn.imooc.com//628c821200010bf805430811.jpg

查看完整回答
反对 回复 2022-05-24
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

  • 我不知道为什么你的选择不起作用,因为它绝对有可能,我已经使用这个博客aws blog

  • 每当具有特定扩展名的文件上传到存储桶 (terraform) 时,此 git存储库都有代码触发 lambda。

  • 您可以通过 lambda 访问 EC2 实例,如上面的块中所示,使用标签。

  • 希望这一切对您有所帮助。


查看完整回答
反对 回复 2022-05-24
?
PIPIONE

TA贡献1829条经验 获得超9个赞

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


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 库。如果我再次找到该博客,将更新答案。


查看完整回答
反对 回复 2022-05-24
  • 3 回答
  • 0 关注
  • 288 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号