Nhiệm vụ theo lịch trình của AWS Lambda


145

Amazon công bố AWS Lambda ( http://aws.amazon.com/lambda/ ).

Mô tả sản phẩm bao gồm:

Nhiệm vụ theo lịch trình

Các chức năng AWS Lambda có thể được kích hoạt bởi bộ định thời sự kiện bên ngoài, do đó, các chức năng có thể được chạy trong thời gian bảo trì thường xuyên theo lịch hoặc giờ cao điểm. Ví dụ: bạn có thể kích hoạt chức năng AWS Lambda để thực hiện việc dọn dẹp lưu trữ hàng đêm trong những giờ không bận rộn.

Khi tôi đọc điều này, tôi hiểu rằng cuối cùng tôi cũng có thể có một cách để luôn thực hiện các nhiệm vụ "giống như cron". Tôi muốn chạy một truy vấn cụ thể hàng ngày vào lúc 5 giờ chiều.

Tuy nhiên tôi không tìm thấy điều này ở bất cứ đâu trong tài liệu. Họ chỉ đề cập đến các kích hoạt trên các sự kiện lập trình, hoặc các sự kiện từ các dịch vụ AWS khác.

Có phải tôi đã hiểu lầm? Hoặc ai đó có thể chỉ cho tôi các tài liệu?

Câu trả lời:


159

Hỗ trợ gốc cho các sự kiện theo lịch trình được thêm vào ngày 8 tháng 10 năm 2015:

Như đã thông báo trong bài đăng trên blog AWS này , việc lập lịch biểu hiện được hỗ trợ dưới dạng loại nguồn sự kiện (còn được gọi là trình kích hoạt) được gọi là " Sự kiện CloudWatch - Lịch biểu " và có thể được biểu thị dưới dạng tỷ lệ hoặc biểu thức định mức.

Thêm sự kiện theo lịch trình vào lambda mới

Điều hướng đến bước tạo cấu hình 'Trình kích hoạt' và chỉ định trình kích hoạt 'Sự kiện CloudWatch - Lịch biểu'. Cấu hình ví dụ dưới đây:

Hình ảnh hiển thị cấu hình để tạo sự kiện theo lịch vào lúc 5 giờ chiều UTC.

Thêm sự kiện theo lịch trình vào lambda hiện có

Điều hướng đến tab 'Triggers' trên lambda của bạn, chọn 'Thêm Trình kích hoạt' và chỉ định trình kích hoạt 'Sự kiện CloudWatch - Lịch trình'. Ảnh chụp màn hình ví dụ nơi tôi có lambda hiện có với trình kích hoạt SNS:

Hình ảnh cho thấy cách điều hướng để thêm UI kích hoạt từ bảng điều khiển Lambda.

Sau khi tải, giao diện người dùng để định cấu hình kích hoạt này giống hệt với ảnh chụp màn hình trong phần "Thêm sự kiện theo lịch trình vào lambda mới" ở trên.

Thảo luận

Đối với trường hợp ví dụ của bạn, bạn sẽ muốn sử dụng cron()thay vì rate(). Biểu thức cron trong lambda yêu cầu tất cả các trường và được thể hiện bằng UTC. Vì vậy, để chạy một chức năng mỗi ngày vào lúc 5 giờ chiều (UTC), hãy sử dụng biểu thức cron sau:

cron(0 17 * * ? *)

Tài nguyên khác

Ghi chú

  • Tên của loại sự kiện này đã thay đổi từ "Sự kiện được lên lịch" thành "Sự kiện CloudWatch - Lịch biểu" kể từ khi tính năng này được phát hành lần đầu tiên.
  • Trước khi phát hành tính năng này, giải pháp được đề xuất cho vấn đề này (mỗi lần "Bắt đầu với AWS Lambda" ở 42 phút 50 giây ) là sử dụng SWF để tạo bộ hẹn giờ hoặc tạo bộ hẹn giờ với ứng dụng bên ngoài.
  • Giao diện người dùng Lambda đã được đại tu kể từ khi bài đăng blog sự kiện theo lịch trình xuất hiện và ảnh chụp màn hình bên trong không còn chính xác nữa. Xem ảnh chụp màn hình cập nhật của tôi ở trên từ ngày 3/10/2017 để xem bản sửa đổi mới nhất.

Bạn có biết nếu có hy vọng cho hỗ trợ chính xác 1 phút không?
kaptan

2
Đó là một chút hack nhưng bạn có thể thực hiện việc này với tần suất 1 phút youtube.com/watch?v=FhJxTIq81AU
ingh.am

4
Loại nguồn sự kiện hiện là "Sự kiện CloudWatch - Lịch trình"
Guy Daher

@GuyDaher Cảm ơn bạn, tôi đã cập nhật câu trả lời của mình cho phù hợp.
Anthony Neace

3
Nó hiện hỗ trợ tốc độ 1 phút. docs.aws.amazon.com/lambda/latest/dg/ từ
advncd

18

Kể từ thời điểm đăng bài này, dường như đã có một giải pháp khác: Lịch trình định kỳ AWS Lambda với Đồng hồ thị trấn không đáng tin cậy (UTC) trong đó tác giả đề xuất đăng ký chủ đề SNS Đồng hồ thị trấn không đáng tin cậy . Tôi đã sử dụng cả SWF và SNS, nhưng đối với tôi, giải pháp SNS đơn giản hơn. Đây là một đoạn trích từ bài báo

Đồng hồ thị trấn không đáng tin cậy (UTC)

Đồng hồ thị trấn không đáng tin cậy (UTC) là một Chủ đề SNS mới, miễn phí, công khai (Dịch vụ thông báo đơn giản của Amazon) phát một tin nhắn chime trên mạng mỗi quý cho tất cả các thuê bao. Nó có thể gửi chuông đến các chức năng AWS Lambda, hàng đợi SQS và địa chỉ email.

Bạn có thể sử dụng các thuộc tính chuông để chạy mã của mình sau mỗi mười lăm phút hoặc chỉ chạy mã của bạn một lần một giờ (ví dụ: khi phút == "00") hoặc mỗi ngày một lần (ví dụ: khi giờ == "00" và phút = = "00") hoặc bất kỳ chuỗi khoảng nào khác.

Bạn thậm chí có thể đăng ký một chức năng mà bạn chỉ muốn chạy một lần tại một thời điểm cụ thể trong tương lai: Có chức năng bỏ qua tất cả các yêu cầu cho đến khi nó sau thời gian nó muốn. Khi đến lúc, nó có thể thực hiện công việc của mình, sau đó tự hủy đăng ký khỏi Chủ đề SNS.

Kết nối mã của bạn với Đồng hồ thị trấn không đáng tin cậy rất nhanh chóng và dễ dàng. Không có quy trình đăng ký hoặc tạo tài khoản là bắt buộc


9
Không phải là một câu trả lời hợp lệ nữa. Đồng hồ thị trấn không đáng tin cậy không còn khả dụng nữa
blueskin 8/2/2016

15

GIẢI PHÁP MỚI: Công việc theo lịch trình của Lambda

Werner Vogel đã công bố tối nay (10/08) tại re: Phát minh rằng AWS Lambda hiện có lịch trình riêng của nó.

Se ghi chú phát hành AWS Lambda vào 2015-10-08 :

Bạn cũng có thể thiết lập AWS Lambda để gọi mã của mình một cách thường xuyên, theo lịch trình bằng cách sử dụng bảng điều khiển AWS Lambda. Bạn có thể chỉ định một tỷ lệ cố định (số giờ, ngày hoặc tuần) hoặc bạn có thể chỉ định biểu thức cron. Để biết ví dụ, hãy xem Hướng dẫn 5: Sử dụng Hàm Lambda để xử lý các sự kiện được lên lịch (Python) .


GIẢI PHÁP OLD: Lập lịch với Đường ống dữ liệu AWS

Bạn có thể sử dụng Đường ống dữ liệu AWS để lên lịch tác vụ với một khoảng thời gian nhất định. Hành động có thể là bất kỳ lệnh nào khi bạn định cấu hình Đường ống của mình với ShellCommandActivity .

Ví dụ, bạn có thể chạy lệnh AWS CLI để:

  • Đặt tin nhắn cho SQS
  • hoặc gọi trực tiếp một hàm Lambda (xem lệnh gọi )

Bạn có thể dễ dàng tạo tác vụ theo lịch trình Đường ống dữ liệu AWS trực tiếp trong bảng điều khiển AWS (ví dụ: bằng lệnh AWS CLI):

nhập mô tả hình ảnh ở đây

Bạn cũng có thể sử dụng API để xác định lịch trình của mình:

{
 "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" }
      ]
    }
  ]
}

Giới hạn : Khoảng thời gian lập lịch tối thiểu là 15 phút.
Giá cả : Khoảng $ 1 mỗi tháng.


9

Đây là cách tôi làm điều đó:

  • Tạo Lambda:

  • Tạo Báo thức CloudWatch cho: Xấp xỉNumberOfMessagesVisible> 0 trong 1 phút

  • Theo dõi chủ đề SNS để báo thức
  • Theo dõi Lambda vào SNS Topic

Bây giờ bạn có một bộ đếm thời gian với độ phân giải khoảng 15 phút.

Sau đó, các chức năng Lambda khác được đăng ký vào SNS Topic và được gọi cứ sau 15 phút.


4
Câu trả lời này về cơ bản là các hướng dẫn cho một cơ chế có thể triển khai Đồng hồ thị trấn không đáng tin cậy được mô tả trong Câu trả lời của Shadi . Cho rằng tác giả của UTC cảnh báo rằng nó "có thể biến mất mà không cần cảnh báo bất cứ lúc nào", cách tiếp cận của bạn có lẽ là vượt trội hơn nhiều.
Brian

Thực hiện đầu tiên - 1 tin nhắn - hoạt động vài ngày và dừng lại. Có vẻ như tin nhắn định kỳ không được gửi đến SQS. Đã thêm 2 tin nhắn (tổng cộng 3) - hiện tại nó đã hoạt động được một tuần. Trong CloudWatch tôi thấy các lỗi định kỳ - chỉ cần 2 tin nhắn được gửi, bộ đếm thời gian vẫn ổn. Gist đã được cập nhật gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro 24/07/2015

@Brian Là tác giả của Đồng hồ thị trấn không đáng tin cậy ( townclock.io ) Tôi đồng ý rằng việc tự chạy cho bạn quyền kiểm soát nhiều hơn là phụ thuộc vào một số người lạ (tôi). Trên thực tế, tôi khuyến khích mọi người chạy Đồng hồ thị trấn không đáng tin cậy của riêng họ và đã xuất bản nguồn trên GitHub: github.com/alests/alests-unreliable-town-clock
Eric Hammond

4

Vì giờ đây có thể dễ dàng kích hoạt các chức năng lambda qua HTTP (ví dụ: sử dụng GET hoặc curl), một giải pháp đơn giản là sử dụng CRON được quản lý như Easycron: https://www.easycron.com/ để kích hoạt chức năng lambda của bạn chạy.

Chúng tôi có cùng một vấn đề và cuối cùng đã chạy một dịch vụ định kỳ trên Google App Engine bằng python vì điều này cho phép linh hoạt và phức tạp hơn trong chính công việc CRON.


Thời thế đã thay đổi và Lambda hiện hỗ trợ lập lịch theo kiểu cron trong hộp docs.aws.amazon.com/lambda/latest/dg/with-schediated-events.html
Dirk Conrad Coetsee 8/12/2016

2

Trong trang Chức năng, Thêm trình kích hoạt, bạn có thể thêm Sự kiện CloudWatch và đặt nó dưới dạng loại lịch biểu

nhập mô tả hình ảnh ở đây


1

Bạn cũng có thể lên lịch với các sự kiện trên CloudWatch. Tạo quy tắc -> đính kèm mục tiêu (lambda) và thiết lập lịch trình cron / Rate theo quy tắc của bạn.


1

Cách điều khiển web khá đơn giản. Chỉ cần tạo CloudWatchquy tắc cho lambda và thêm nó vào Triggerstab lambda .

Đối với những người cần tự động hóa điều đó với aws cli, chúng tôi có thể

  1. tạo chức năng,
  2. tạo quy tắc,
  3. cấp phép
  4. quy tắc liên kết và chức năng

Tạo chức năng

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}

Tạo quy tắc

## 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"}]'

1

cách đơn giản để chạy truy vấn của bạn trong lambda trong khoảng thời gian cụ thể là đặt quy tắc cho chức năng lambda của bạn. để biết rằng sau khi tạo chức năng lambda, hãy truy cập cloudwatch >> quy tắc >> lịch trình. và xác định biểu thức cron và trong phần đích chọn hàm lambda mà bạn muốn kích hoạt.


0

Trong khi tạo chức năng lambda, hãy kích hoạt "Sự kiện CloudWatch - Lịch biểu"

Bây giờ bạn có thể sử dụng các cài đặt trước AWS trong biểu thức lịch biểu như tỷ lệ = 15 phút hoặc bạn có thể sử dụng biểu thức cron.

nhập mô tả hình ảnh ở đây

Đối với yêu cầu của bạn, Lịch biểu Cron là "0 0 17 1/1 *? *"


-1

Diksha là Bộ lập lịch AWS Lambda dựa trên Trình kích hoạt AWS SWF theo khuyến nghị của Nhóm AWS . Người ta có thể lên lịch công việc bằng cách sử dụng biểu thức cron và cũng có thể chỉ định số lần bạn muốn chạy, khi nào bắt đầu hoặc khi nào kết thúc. Bạn có thể xem trạng thái cũng như lịch sử của các công việc theo lịch trình. Bảo mật được quản lý bởi các chính sách AWS.

Khi bạn thiết lập công cụ diksha, bạn có thể lên lịch các hàm bằng biểu thức cron theo cách sau:

java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj "jobName | functionName | bối cảnh | 0 0-59 * * * * | 10"

Trong công việc này, công việc sẽ chạy mỗi phút trong 10 lần. AWS SWF sẽ tự kích hoạt chức năng.

Chi tiết: https://github.com/milindparikh/diksha

Tuyên bố miễn trừ trách nhiệm: Tôi là người đóng góp cho dự án.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.