[英]How to run a python script present in an AWS EC2 whenever a lambda is triggered?
我的 AWS EC2 實例中有一個 Python 腳本可以完成一些工作。 每當新文件進入特定存儲桶時,我都必須觸發該腳本。
我的想法是向該存儲桶添加一個 lambda 觸發器,該觸發器又會觸發 EC2 中存在的腳本,但未能這樣做。
那么,如果按照我的計划或者是否有其他解決方法可以解決此問題,如何實現?
正如評論中建議最好使用SNS
或SQS
,我認為它比 lambda 函數更合適,並且 SNS 或 SQS 涉及S3
和EC2
實例之間的一對一通信,那么為什么要添加額外的 lambda 層?
雖然三個可以訂閱事件,但 lambda 涉及一個額外的層,也涉及 ssh,我認為這在時間上很昂貴(s3 事件接收 + 事件處理 + ssh 到 ec2)。
使用 Lambda:
當 lambda 觸發器將開始對 ec2 執行ssh
並運行腳本時,Lambda 的一大優勢是您可以運行任何類型的腳本,並且不需要服務器來保持它們的正常運行,就像 SQS 的情況一樣和社交網絡。 您可以探索這些示例ssh-ec2-lambda/和schedule-ssh-jobs-using-aws-lambda ,第二個示例類似,只是您需要基於事件而不是調度。
社交網絡:
如果多個實例假設在 ec2 實例上運行作業腳本,則 SNS 是更好的選擇。 該圖有點類似於您的用例或用於表示大圖。
質量標准:
如果應該只有一個實例運行腳本,那么 SQS 將適合處理該事件。
我在網上找到的一個博客的幫助下管理了它,我已經失去了它的鏈接,但有代碼。
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 庫。 如果我再次找到博客,我會更新答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.