3 回答
TA贡献1802条经验 获得超6个赞
正如评论中建议更好地使用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 将适合处理该事件。

TA贡献1827条经验 获得超8个赞
我不知道为什么你的选择不起作用,因为它绝对有可能,我已经使用这个博客aws blog
每当具有特定扩展名的文件上传到存储桶 (terraform) 时,此 git存储库都有代码触发 lambda。
您可以通过 lambda 访问 EC2 实例,如上面的块中所示,使用标签。
希望这一切对您有所帮助。
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 库。如果我再次找到该博客,将更新答案。
添加回答
举报
