簡體   English   中英

AWS Lambda 計划任務

[英]AWS Lambda Scheduled Tasks

亞馬遜宣布 AWS Lambda ( http://aws.amazon.com/lambda/ )。

產品說明包括:

計划任務

AWS Lambda 函數可以由外部事件計時器觸發,因此函數可以在定期維護時間或非高峰時段運行。 例如,您可以觸發 AWS Lambda function 在非繁忙時間執行夜間存檔清理。

當我讀到這篇文章時,我明白我終於可以有一種方法來始終如一地執行“類似 cron 的”任務。 我想每天下午 5 點運行一個特定的查詢。

但是我在文檔中的任何地方都找不到這個。 他們只提到程序事件或來自其他 AWS 服務的事件的觸發器。

我誤會了嗎? 或者有人可以指出我的文檔嗎?

2015 年 10 月 8 日添加的對預定事件的原生支持:

正如這篇AWS 博客文章 中所宣布,現在支持調度作為稱為“ CloudWatch Events - Schedule ”的事件源類型(也稱為觸發器),並且可以表示為速率或 cron 表達式。

將預定事件添加到新的 lambda

導航到創建的“配置觸發器”步驟,並指定“CloudWatch 事件 - 計划”觸發器。 下面的示例配置:

顯示用於在 UTC 下午 5 點創建計划事件的配置的圖像。

將預定事件添加到現有的 lambda

導航到 lambda 的“觸發器”選項卡,選擇“添加觸發器”,然后指定“CloudWatch 事件 - 計划”觸發器。 我有一個帶有 SNS 觸發器的現有 lambda 的示例屏幕截圖:

顯示如何從 Lambda 控制台導航以添加觸發器 UI 的圖像。

加載后,用於配置此觸發器的 UI 與上面“將計划事件添加到新 lambda”部分中的屏幕截圖相同。

討論

對於您的示例,您需要使用cron()而不是rate() lambda 中的 Cron 表達式需要所有字段,並以 UTC 表示。 因此,要每天在下午 5 點 (UTC) 運行一個函數,請使用以下 cron 表達式:

cron(0 17 * * ? *)

更多資源

筆記

  • 自此功能首次發布以來,此事件類型的名稱已從“計划事件”更改為“CloudWatch 事件 - 計划”。
  • 在此功能發布之前,此問題的推薦解決方案(根據“AWS Lambda 入門”在 42 分 50 秒)是使用 SWF 創建計時器,或使用外部應用程序創建計時器。
  • 自預定事件博客文章發布以來,Lambda UI 已經過大修,其中的屏幕截圖不再准確。 有關最新修訂,請參閱我在 2017 年 3 月 10 日更新的屏幕截圖。

自這篇文章發布以來,似乎已經出現了另一種解決方案:使用不可靠的城鎮時鍾 (UTC) 安排重復的 AWS Lambda 調用,其中作者建議訂閱 SNS 主題不可靠的城鎮時鍾 我既沒有使用過 SWF,也沒有使用過 SNS,但在我看來,SNS 解決方案更簡單。 這是文章的摘錄

不可靠的城市時鍾 (UTC)

Unreliable Town Clock (UTC) 是一個新的免費公共 SNS 主題(亞馬遜簡單通知服務),每四分之一小時向所有訂閱者廣播一條“鍾聲”消息。 它可以將提示音發送到 AWS Lambda 函數、SQS 隊列和電子郵件地址。

您可以使用 chime 屬性每 15 分鍾運行一次代碼,或者僅每小時運行一次代碼(例如,當 minute == "00" 時)或每天一次(例如,當 hour == "00" 和 minute = = "00") 或任何其他系列的間隔。

你甚至可以訂閱一個你只想在未來特定時間運行一次的函數:讓函數忽略所有調用,直到它想要的時間之后。 時間到了,它可以執行它的工作,然后從 SNS 主題中取消訂閱。

將您的代碼連接到 Unreliable Town Clock 既快速又簡單。 無需申請流程或創建帳戶

新解決方案:Lambda 計划作業

Werner Vogel 今晚 (10/08) 在 re:Invent 上宣布 AWS Lambda 現在擁有自己的調度程序。

請參閱2015 年 10 月 8 日AWS Lambda 發行說明

您還可以設置 AWS Lambda 以使用 AWS Lambda 控制台定期、按計划調用您的代碼。 您可以指定固定比率(小時數、天數或周數),也可以指定 cron 表達式。 有關示例,請參閱演練 5:使用 Lambda 函數處理計划事件 (Python)


舊解決方案:使用 AWS Data Pipeline 進行調度

您可以使用 AWS Data Pipeline 在給定時間段內安排任務。 當您使用ShellCommandActivity配置管道時,該操作可以是任何命令。

例如,您可以運行 AWS CLI 命令來:

  • 向 SQS 發送消息
  • 或直接調用 Lambda 函數(請參閱invoke

您可以直接在 AWS 控制台中輕松創建 AWS Data Pipeline 計划任務(例如,使用 AWS CLI 命令):

在此處輸入圖片說明

您還可以使用 API 來定義您的日程安排:

{
 "pipelineId": "df-0937003356ZJEXAMPLE",
 "pipelineObjects": [
    {
      "id": "Schedule",
      "name": "Schedule",
      "fields": [
        { "key": "startDateTime", "stringValue": "2012-12-12T00:00:00" }, 
        { "key": "type", "stringValue": "Schedule" }, 
        { "key": "period", "stringValue": "1 hour" }, 
        { "key": "endDateTime", "stringValue": "2012-12-21T18:00:00"  }
       ]
     }, {
      "id": "DoSomething",
      "name": "DoSomething",
      "fields": [
        { "key": "type", "stringValue": "ShellCommandActivity" },
        { "key": "command", "stringValue": "echo hello" },
        { "key": "schedule", "refValue": "Schedule" }
      ]
    }
  ]
}

限制:最小調度間隔為 15 分鍾。
定價:每月約 1.00 美元。

這是我如何做到的:

現在您有一個分辨率約為 15 分鍾的計時器。

然后其他 Lambda 函數訂閱 SNS 主題並每 15 分鍾調用一次。

由於現在很容易通過 HTTP 觸發 lambda 函數(例如使用 GET 或 curl),一個簡單的解決方案是使用像 easycron 這樣的托管 CRON: https ://www.easycron.com/ 來觸發您的 lambda 函數運行。

我們遇到了同樣的問題,最終在 Python 中的 Google App Engine 上運行了一個 cron 服務,因為這允許 CRON 作業本身具有更大的靈活性和復雜性。

在 Function 頁面的 Add trigger 中,您可以添加 CloudWatch Events,並將其設為計划類型

在此處輸入圖片說明

AWS 最近(2022 年 11 月 10 日)推出了一項名為EventBridge Scheduler的新服務,您也可以為此選擇EventBridge 規則 根據您在此處的示例,我將在每天凌晨 5 點觸發一個事件 正如您所看到的,它還向我們顯示了接下來的 10 個觸發日期和時間,這將真正幫助我們在執行任何操作之前手動檢查我們的 cron。

請注意,如果您想在特定日期和時間開始此計划,請為此選擇EventBridge 計划程序 它有一個時間范圍選項。 如果您想了解有關Timeframe的更多信息,請查看此答案

在此處輸入圖像描述

在目標部分,您可以選擇 select 35 AWS Lambda function 選項。

在此處輸入圖像描述

希望這會幫助你。

您也可以使用 cloudWatch 事件來安排它。 創建規則 -> 附加目標 (lambda) 並在您的規則上設置 cron/rate 明智的計划。

網絡控制台方式非常簡單。 只需為 lambda 創建CloudWatch規則並將其添加到 lambda 的Triggers選項卡中。

對於那些需要使用aws cli自動化的人,我們可以

  1. 創建函數,
  2. 創建規則,
  3. 授予許可,
  4. 鏈接規則和功能

創建函數

aws lambda create-function --function-name ${FUNCTION-NAME} \
--runtime java8 \
--role 'arn:aws:iam::${Account}:role/${ROLE}' \
--handler org.yourCompany.LambdaApp \
--code '{"S3Bucket":"yourBucket", "S3Key": "RC/yourapp.jar"}' \
--description 'check hive connection' \
--timeout 180 \
--memory-size 384 \
--publish \
--vpc-config '{"SubnetIds": ["subnet-1d2e3435", "subnet-0df4547a"], "SecurityGroupIds": ["sg-cb17b1ae", "sg-0e7ae277"]}' \
--environment Variables={springEnv=dev}

創建規則

## create
aws events put-rule --name ${ruleName} \
--schedule-expression 'rate(5 minutes)' \
--state ENABLED \
--description 'check hive connection'

# grant permission to the Rule to allow it to trigger the function
aws lambda add-permission --function-name ${functionName} \
--statement-id 123 \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:acc:rule/${ruleName}

# link rule and function
aws events put-targets --rule ${ruleName} \
--targets '[{"Id":"1", "Arn":"arn:aws:lambda:us-east-1:acc:function:RC-checkhive"}]'

在特定時間間隔內在 lambda 中運行查詢的簡單方法是為 lambda 函數設置規則。 為此,在創建 lambda 函數后,轉到 cloudwatch>>rules>>schedule。 並定義 cron 表達式並在目標部分中選擇要觸發的 lambda 函數。

在 AWS 中作為 cron 運行

使用 cloudformation 為您的 lambda 設置 cloudwatch 計划事件觸發器的示例。


  LambdaSchedule:
    Type: "AWS::Events::Rule"
    Properties:
      Description: A schedule for the Lambda function..
      ScheduleExpression: rate(5 minutes)
      State: ENABLED
      Targets:
        - Arn: !Sub ${LambdaFunction.Arn}
          Id: LambdaSchedule

  LambdaSchedulePermission:
    Type: "AWS::Lambda::Permission"
    Properties:
      Action: 'lambda:InvokeFunction'
      FunctionName: !Sub ${LambdaFunction.Arn}
      Principal: 'events.amazonaws.com'
      SourceArn: !Sub ${LambdaSchedule.Arn}

  LambdaFunction:
    Type: "AWS::Lambda::Function"
    Properties:
      Description: Scheduled lambda to run every 5 minutes
      CodeUri: ./build/package.zip
      Handler: index.lambda_handler
      MemorySize: 128
      Runtime: python3.6

在創建 lambda 函數時創建觸發器“CloudWatch Events - Schedule”

現在,您可以在計划表達式中使用 AWS 預設,例如 rate = 15 min,也可以使用 cron 表達式。

在此處輸入圖片說明

根據您的要求,Cron 計划是“0 0 17 1/1 * ? *”

發布日期 - 2021 年 6 月 27 日

您可以使用Amazon EventBridge安排 AWS Lambda 函數這里我使用的是 AWS 管理控制台

  1. 選擇您的 Lambda 函數並在配置中選擇“觸發器” 在此處輸入圖片說明

  2. 選擇EventBridge(CloudWatch Events) - 基本上這是流行答案之一的最新版本(使用 CloudWatch 觸發器)。 在此處輸入圖片說明

  3. 創建新規則- 添加詳細信息。 我的 lambda 將在UTC每天下午 4 點觸發在此處輸入圖片說明 .

這是一個使用無服務器部署計划的 Lambda 以每 10 分鍾運行一次的示例。 function 處理程序位於 src/scheduled/index.handler 並且速率在 Lambda 的設置中指定。 AWS 現在使用 EventBridge 來控制何時調用 Lambda。 這是使用無服務器時自動為您設置的所有內容。 您可以通過查看 Lambda 或查看 EventBridge 部分中的“默認”EventBridge 在 AWS 控制台中查看設置。

https://carova.io/snippets/serverless-aws-lambdafunction-scheduled-cronjob

EventsBridge (CloudWatch) 解決方案:

您可以創建 AWS事件橋規則並使用其 ARN 將 Lambda function 設置為目標 您可以指定速率或 cron 計划表達式。 例如,以下表達式將在所有 weekdays 每十分鍾后運行您的 Lambda function 。

schedule = "cron(0/10 * ? * MON-FRI *)"

請注意,您的 EventsBridge 角色還需要lambda:InvokeFunction權限,因此 EventsBridge 可以觸發您的 Lambda function。

這是此架構的 Terraform 設置的完整教程: https://medium.com/geekculture/terraform-setup-for-scheduled-lambda-functions-f01931040007

Diksha 是AWS 團隊推薦的基於 AWS SWF 觸發器的 AWS Lambda 調度程序。 可以使用 cron 表達式安排作業,還可以指定要運行的時間、何時開始或何時結束。 您可以查看計划作業的狀態和歷史記錄。 安全性由 AWS 策略管理。

設置 diksha 引擎后,您可以通過以下方式使用 cron 表達式調度函數:

java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj "jobName|functionName|context|0 0-59 * * * *|10"

在此作業中,作業將每分鍾運行 10 次。 AWS SWF 將自行觸發功能。

詳情: https : //github.com/milindparikh/diksha

免責聲明:我是該項目的貢獻者。

暫無
暫無

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

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