簡體   English   中英

在AWS中從Lambda啟動shell腳本

[英]Launch a shell script from Lambda in AWS

如果我在EC2實例中有一個bash腳本,是否有一種方法可以觸發lambda?

lambda的觸發器將來自RDS。 因此,mysql中的表會更新,並且該表中的特定列會更新為“Ready”,Lambda必須以“Ready”狀態提取該行的ID,並將該ID發送到bash腳本。

使用Amazon EC2 Simple Systems Manager ,您可以配置SSM文檔以在實例上運行腳本,並為該腳本傳遞參數。 Lambda實例需要運行SSM send-command,以實例ID為目標。

示例SSM文檔:run_my_example.json:

{
  "schemaVersion": "1.2",
  "description": "Run shell script to launch.",
  "parameters": {
         "taskId":{
            "type":"String",
            "default":"",
            "description":"(Required) the Id of the task to run",
            "maxChars":16
        }
  },
  "runtimeConfig": {
    "aws:runShellScript": {
      "properties": [
        {
          "id": "0.aws:runShellScript",
          "runCommand": ["run_my_example.sh"]
        }
      ]
    }
  }
}

上述SSM文檔接受taskId作為參數。

將此文檔另存為JSON文件,並使用AWS CLI調用create-document:

aws ssm create-document --content file:///tmp/run_my_example.json --name  "run_my_example"

您可以通過調用describe-document來查看SSM文檔的describe-document

aws ssm describe-document --name "run_my_example"

您可以指定taskId參數並使用send-command使用文檔名稱來運行該send-command

aws ssm send-command --instance-ids i-12345678 --document-name "run_my_example" --parameters --taskid=123456

筆記

  • 實例必須運行最新版本的SSM代理

  • 您需要在Lambda腳本中使用一些邏輯來標識服務器EG的實例ID,以查找特定標記實例的實例ID。

我們假設一些事情。 首先,您知道如何使用sns設置“觸發器”(請參閱此處 )以及如何從所述觸發器掛起lambda腳本。 其次,你對python有一點了解(Lambda的語法產品是Node,Java和Python),因為這個例子將在Python中。 另外,我不會介紹如何使用mysql查詢數據庫。 您沒有提到您的RDS實例是MySQL,Postgress還是其他。 最后,您需要了解如何通過IAM角色和策略允許跨AWS資源的權限。

以下腳本將至少概述向您的實例觸發腳本的方法(您必須弄清楚如何查詢相關信息或將該信息傳遞到SNS主題),然后在實例上運行shell命令指定。

import boto3
def lambda_handler(event, context):
     #query RDS to get ID or get from SNS topic
     id = *queryresult*
     command = 'sh /path/to/scriptoninstance' + id
     ssm = boto3.client('ssm')
     ssmresponse = ssm.send_command(InstanceIds=['i-instanceid'], DocumentName='AWS-RunShellScript', Parameters= { 'commands': [command] } ) 

我可能有兩個RDS行的標志。 一個說“准備好”,一個說“已識別”。 所以SNS主題觸發lambda腳本,lambda腳本查找'ready'= true和'identify'= false的行,將'identify'更改為true(以確保可能同時運行的其他lambda腳本不會運行拿起它,然后開火腳本。 如果腳本未成功運行,請將“已識別”更改回false以確保您的數據保持有效。

其中一件事要考慮的是:

  • 安全。 截至今天,lambda無法在VPC中運行。 這意味着您的EC2必須具有廣泛的入站安全組。

我建議看看消息隊列(比如SQS)。 這將解決很多頭痛問題。

它是如何工作的:

  • LAMBDA。 得到消息; 發送給SQS
  • EC2。 Cron作業觸發N分鍾。 來自sqs的消息; 處理消息。

我認為您可以使用新的EC2 Run Command功能來完成此任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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