猿问

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

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

我的想法是向该存储桶添加一个 lambda 触发器,该触发器依次触发 EC2 中存在的脚本,但未能这样做。

那么如果按照我的计划如何实现解决方案,或者是否有任何其他解决方法可以解决这个问题?


千万里不及你
浏览 289回答 3
3回答

呼啦一阵风

正如评论中建议更好地使用SNSor ,我认为它比 lambda 函数更合适,并且 SNS 或 SQS 涉及与实例SQS之间的一对一通信,那么为什么要添加额外的 lambda 层?S3EC2虽然三个可以订阅事件,但 lambda 涉及一个额外的层,并且还涉及 ssh,我认为这在时间上是昂贵的(s3 事件接收 + 事件进程 + ssh 到 ec2)。使用 Lambda:当 lambda 触发器将开始ssh对 ec2 执行操作并运行脚本时,Lambda 的一大优势是您可以运行任何类型的脚本,并且您不需要服务器来保持它们的正常运行,就像 SQS 和社交网络。您可以探索这些示例ssh-ec2-lambda/和scheduling-ssh-jobs-using-aws-lambda,第二个示例类似,只是您需要基于事件而不是调度。社交网络:如果多个实例假设在 ec2 实例上运行作业脚本,则 SNS 是更好的选择。该图有点类似于您的用例或用于表示大图。质量保证:如果只有一个实例应该运行脚本,那么 SQS 将适合处理该事件。

斯蒂芬大帝

我不知道为什么你的选择不起作用,因为它绝对有可能,我已经使用这个博客aws blog每当具有特定扩展名的文件上传到存储桶 (terraform) 时,此 git存储库都有代码触发 lambda。您可以通过 lambda 访问 EC2 实例,如上面的块中所示,使用标签。希望这一切对您有所帮助。

PIPIONE

我在网上找到的博客的帮助下进行了管理,该博客的链接已丢失,但有代码。import timeimport boto3import paramikoimport osdef 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 库。如果我再次找到该博客,将更新答案。
随时随地看视频慕课网APP

相关分类

Python
我要回答