我的AWS EC2实例中存在一个python脚本,可以完成某些工作。 每当新文件进入特定存储桶时,我都必须触发该脚本。
我的想法是向该存储桶添加一个lambda触发器,该触发器又会触发EC2中存在的脚本,但未能成功。
那么,如果按照我的计划或者该问题还有其他解决方法,该如何解决?
答案 0 :(得分:2)
正如评论中更好地建议使用SNS
或SQS
一样,我认为它比lambda函数更合适,并且与SNS或SQS涉及S3
和{{1 }}实例,为什么还要添加额外的lambda层呢?
尽管三个人可以订阅该事件,但是lambda涉及一层额外的事务,也涉及ssh,我认为这在时间上是昂贵的(s3事件接收+事件处理+ ec2的ssh)。
使用Lambda:
当lambda触发器启动时,它将开始对ec2做EC2
并运行脚本,而Lambda的一大优势是您可以运行任何类型的脚本,而您无需运行需要服务器来保持它们正常运行,就像SQS和SNS一样。您可以浏览这些示例ssh-ec2-lambda/和scheduling-ssh-jobs-using-aws-lambda,第二个示例是相似的,只是您需要基于事件而不是计划。
SNS:
如果多个实例假设要在ec2实例上运行作业脚本,则SNS是更好的选择。该图有点类似于您的用例或用于表示一张大图。
SQS:
如果只应运行一个实例,则SQS将适合处理该事件。
答案 1 :(得分:1)
答案 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库压缩在一起即可。如果我再次找到该博客,将会审核答案。