簡體   English   中英

每當觸發 lambda 時,如何運行 AWS EC2 中存在的 python 腳本?

[英]How to run a python script present in an AWS EC2 whenever a lambda is triggered?

我的 AWS EC2 實例中有一個 Python 腳本可以完成一些工作。 每當新文件進入特定存儲桶時,我都必須觸發該腳本。

我的想法是向該存儲桶添加一個 lambda 觸發器,該觸發器又會觸發 EC2 中存在的腳本,但未能這樣做。

那么,如果按照我的計划或者是否有其他解決方法可以解決此問題,如何實現?

正如評論中建議最好使用SNSSQS ,我認為它比 lambda 函數更合適,並且 SNS 或 SQS 涉及S3EC2實例之間的一對一通信,那么為什么要添加額外的 lambda 層?

雖然三個可以訂閱事件,但 lambda 涉及一個額外的層,也涉及 ssh,我認為這在時間上很昂貴(s3 事件接收 + 事件處理 + ssh 到 ec2)。

在此處輸入圖片說明

使用 Lambda:

當 lambda 觸發器將開始對 ec2 執行ssh並運行腳本時,Lambda 的一大優勢是您可以運行任何類型的腳本,並且不需要服務器來保持它們的正常運行,就像 SQS 的情況一樣和社交網絡。 您可以探索這些示例ssh-ec2-lambda/schedule-ssh-jobs-using-aws-lambda ,第二個示例類似,只是您需要基於事件而不是調度。

社交網絡:

如果多個實例假設在 ec2 實例上運行作業腳本,則 SNS 是更好的選擇。 該圖有點類似於您的用例或用於表示大圖。

在此處輸入圖片說明

質量標准:

如果應該只有一個實例運行腳本,那么 SQS 將適合處理該事件。

在此處輸入圖片說明

  • 我不確定為什么您的選擇不起作用,因為它絕對有可能,我已經使用此博客aws 博客完成了此操作
  • 每當具有特定擴展名的文件上傳到存儲桶 (terraform) 時,此 git存儲庫都有觸發 lambda 的代碼。
  • 您可以使用標簽通過 lambda 訪問 EC2 實例,如上面的塊所示。
  • 希望這一切對你有幫助。

我在網上找到的一個博客的幫助下管理了它,我已經失去了它的鏈接,但有代碼。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM