[英]AWS Lambda Scheduled Tasks
亞馬遜宣布 AWS Lambda ( http://aws.amazon.com/lambda/ )。
產品說明包括:
計划任務
AWS Lambda 函數可以由外部事件計時器觸發,因此函數可以在定期維護時間或非高峰時段運行。 例如,您可以觸發 AWS Lambda function 在非繁忙時間執行夜間存檔清理。
當我讀到這篇文章時,我明白我終於可以有一種方法來始終如一地執行“類似 cron 的”任務。 我想每天下午 5 點運行一個特定的查詢。
但是我在文檔中的任何地方都找不到這個。 他們只提到程序事件或來自其他 AWS 服務的事件的觸發器。
我誤會了嗎? 或者有人可以指出我的文檔嗎?
正如這篇AWS 博客文章 中所宣布的,現在支持調度作為稱為“ CloudWatch Events - Schedule ”的事件源類型(也稱為觸發器),並且可以表示為速率或 cron 表達式。
導航到創建的“配置觸發器”步驟,並指定“CloudWatch 事件 - 計划”觸發器。 下面的示例配置:
導航到 lambda 的“觸發器”選項卡,選擇“添加觸發器”,然后指定“CloudWatch 事件 - 計划”觸發器。 我有一個帶有 SNS 觸發器的現有 lambda 的示例屏幕截圖:
加載后,用於配置此觸發器的 UI 與上面“將計划事件添加到新 lambda”部分中的屏幕截圖相同。
對於您的示例,您需要使用cron()
而不是rate()
。 lambda 中的 Cron 表達式需要所有字段,並以 UTC 表示。 因此,要每天在下午 5 點 (UTC) 運行一個函數,請使用以下 cron 表達式:
cron(0 17 * * ? *)
lambda-canary
的 cron 表達式,可以在從 AWS 控制台創建函數期間選擇該表達式。自這篇文章發布以來,似乎已經出現了另一種解決方案:使用不可靠的城鎮時鍾 (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 既快速又簡單。 無需申請流程或創建帳戶
Werner Vogel 今晚 (10/08) 在 re:Invent 上宣布 AWS Lambda 現在擁有自己的調度程序。
請參閱2015 年 10 月 8 日的AWS Lambda 發行說明:
您還可以設置 AWS Lambda 以使用 AWS Lambda 控制台定期、按計划調用您的代碼。 您可以指定固定比率(小時數、天數或周數),也可以指定 cron 表達式。 有關示例,請參閱演練 5:使用 Lambda 函數處理計划事件 (Python) 。
您可以使用 AWS Data Pipeline 在給定時間段內安排任務。 當您使用ShellCommandActivity配置管道時,該操作可以是任何命令。
例如,您可以運行 AWS CLI 命令來:
您可以直接在 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" }
]
}
]
}
這是我如何做到的:
創建 Lambda,它:
創建 CloudWatch 警報: ApproximateNumberOfMessagesVisible > 0 1 分鍾
現在您有一個分辨率約為 15 分鍾的計時器。
然后其他 Lambda 函數訂閱 SNS 主題並每 15 分鍾調用一次。
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
自動化的人,我們可以
創建函數
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 * ? *”
這是一個使用無服務器部署計划的 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.