Tugas Terjadwal AWS Lambda

145

Amazon mengumumkan AWS Lambda ( http://aws.amazon.com/lambda/ ).

Deskripsi produk meliputi:

Tugas yang dijadwalkan

Fungsi AWS Lambda dapat dipicu oleh penghitung acara eksternal, sehingga fungsi dapat dijalankan selama waktu pemeliharaan yang dijadwalkan secara rutin atau jam non-puncak. Misalnya, Anda dapat memicu fungsi AWS Lambda untuk melakukan pembersihan arsip malam hari selama jam-jam tidak sibuk.

Ketika saya membaca ini, saya mengerti akhirnya saya bisa memiliki cara untuk secara konsisten melakukan tugas-tugas "cron-like". Saya ingin menjalankan kueri tertentu setiap hari pada jam 5 sore katakanlah.

Namun saya tidak menemukan ini di dokumentasi. Mereka hanya menyebutkan pemicu pada acara program, atau acara dari layanan AWS lainnya.

Apakah saya salah paham? Atau bisakah seseorang mengarahkan saya ke dokumentasi?

Nathan H
sumber

Jawaban:

159

Dukungan Asli untuk Acara yang Dijadwalkan ditambahkan pada 8 Oktober 2015:

Seperti yang diumumkan dalam posting blog AWS ini , penjadwalan sekarang didukung sebagai jenis sumber acara (juga disebut pemicu) yang disebut " Acara CloudWatch - Jadwal ", dan dapat dinyatakan sebagai laju atau ekspresi cron.

Tambahkan Acara Terjadwal ke lambda baru

Arahkan ke langkah 'Konfigurasi pemicu', dan tentukan pemicu 'Acara CloudWatch - Jadwal'. Contoh konfigurasi di bawah ini:

Gambar yang menunjukkan konfigurasi untuk membuat acara yang dijadwalkan pada 17:00 UTC.

Tambahkan Acara Terjadwal ke lambda yang ada

Arahkan ke tab 'Pemicu' dari lambda Anda, pilih 'Tambah Pemicu', dan tentukan pemicu 'Acara CloudWatch - Jadwal'. Contoh tangkapan layar di mana saya memiliki lambda yang ada dengan pemicu SNS:

Gambar yang menunjukkan cara menavigasi untuk menambahkan UI pemicu dari konsol Lambda.

Setelah dimuat, UI untuk mengonfigurasi pemicu ini identik dengan tangkapan layar di bagian "Tambahkan Acara Terjadwal ke lambda baru" di atas.

Diskusi

Untuk contoh kasus Anda, Anda ingin menggunakan cron()sebagai ganti rate(). Ekspresi Cron di lambda membutuhkan semua bidang dan dinyatakan dalam UTC. Jadi untuk menjalankan fungsi setiap hari pada jam 5 sore (UTC), gunakan ekspresi cron berikut:

cron(0 17 * * ? *)

Sumber Daya Lebih Lanjut

Catatan

  • Nama tipe acara ini telah berubah dari "Acara Terjadwal" menjadi "Acara CloudWatch - Jadwal" sejak fitur ini pertama kali dirilis.
  • Sebelum rilis fitur ini, solusi yang disarankan untuk masalah ini (per "Memulai AWS Lambda" pada 42 menit 50secs ) adalah menggunakan SWF untuk membuat timer , atau membuat timer dengan aplikasi eksternal.
  • UI Lambda telah dirombak sejak posting blog acara yang dijadwalkan keluar, dan tangkapan layar di dalamnya tidak lagi tepat. Lihat tangkapan layar saya yang diperbarui di atas mulai 3/10/2017 untuk revisi terbaru.
Anthony Neace
sumber
apakah Anda tahu jika ada harapan untuk dukungan presisi 1 menit?
kaptan
2
Ini sedikit hack tetapi Anda dapat melakukan ini untuk frekuensi 1 menit youtube.com/watch?v=FhJxTIq81AU
ingh.am
4
Jenis sumber acara sekarang adalah "Acara CloudWatch - Jadwal"
Guy Daher
@ Pembeli Terima kasih, saya telah memperbarui jawaban saya sesuai.
Anthony Neace
3
Itu mendukung tingkat 1 menit sekarang. docs.aws.amazon.com/lambda/latest/dg/…
advncd
18

Sejak saat posting ini, tampaknya telah muncul solusi lain: Jadwalkan Doa Lambda AWS Berulang-ulang Dengan The Town Tidak Dapat Diandalkan (UTC) di mana penulis mengusulkan berlangganan ke topik SNS Tidak dapat diandalkan Town Clock . Saya tidak menggunakan SWF atau SNS, tetapi bagi saya tampaknya solusi SNS lebih sederhana. Berikut kutipan dari artikel tersebut

Jam Kota Yang Tidak Dapat Diandalkan (UTC)

Jam Kota Yang Tidak Dapat Diandalkan (UTC) adalah Topik SNS publik baru, gratis, publik (Amazon Simple Notification Service) yang menyiarkan pesan "chime" setiap kuartal jam untuk semua pelanggan. Itu dapat mengirim lonceng ke fungsi AWS Lambda, antrian SQS, dan alamat email.

Anda dapat menggunakan atribut chime untuk menjalankan kode Anda setiap lima belas menit, atau hanya menjalankan kode Anda satu jam sekali (misalnya, ketika menit == "00") atau sekali sehari (misalnya, ketika jam == "00" dan menit = = "00") atau serangkaian interval lainnya.

Anda bahkan dapat berlangganan fungsi yang hanya ingin Anda jalankan satu kali pada waktu tertentu di masa mendatang: Minta fungsi tersebut mengabaikan semua permintaan sampai setelah waktu yang diinginkan. Ketika saatnya tiba, ia dapat melakukan tugasnya, lalu berhenti berlangganan dari Topik SNS.

Menghubungkan kode Anda ke Jam Kota yang Tidak Dapat Diandalkan cepat dan mudah. Tidak diperlukan proses aplikasi atau pembuatan akun

shadi
sumber
9
Bukan jawaban yang valid lagi. Jam Kota Yang Tidak Dapat Diandalkan sudah tidak tersedia lagi
blueskin
15

SOLUSI BARU: Pekerjaan Dijadwalkan Lambda

Werner Vogel telah mengumumkan malam ini (10/08) di re: Temukan bahwa AWS Lambda sekarang memiliki penjadwal sendiri.

Se AWS Lambda rilis catatan pada 2015/10/08 :

Anda juga dapat mengatur AWS Lambda untuk menjalankan kode Anda secara teratur, terjadwal menggunakan konsol AWS Lambda. Anda dapat menentukan tingkat tetap (jumlah jam, hari, atau minggu) atau Anda dapat menentukan ekspresi cron. Sebagai contoh, lihat Walkthrough 5: Menggunakan Fungsi Lambda untuk Memproses Acara Terjadwal (Python) .


SOLUSI LAMA: Penjadwalan dengan AWS Data Pipeline

Anda dapat menggunakan AWS Data Pipeline untuk menjadwalkan tugas dengan periode tertentu. Tindakan tersebut dapat berupa perintah apa pun saat Anda mengonfigurasi Pipeline Anda dengan ShellCommandActivity .

Misalnya Anda dapat menjalankan perintah AWS CLI untuk:

  • Kirim pesan ke SQS
  • atau secara langsung memanggil fungsi Lambda (lihat memohon )

Anda dapat dengan mudah membuat tugas terjadwal Pipa Data AWS langsung di dalam konsol AWS (mis. Dengan perintah AWS CLI):

masukkan deskripsi gambar di sini

Anda juga dapat menggunakan API untuk menentukan penjadwalan Anda:

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

Batas : Interval penjadwalan minimum adalah 15 menit.
Harga : Sekitar $ 1,00 per bulan.

Yves M.
sumber
9

Inilah cara saya melakukannya:

  • Buat Lambda yang:

  • Buat CloudWatch Alarm untuk: PerkiraanNumberOfMessagesTerlihat> 0 selama 1 menit

  • Berlangganan SNS Topic to the Alarm
  • Berlangganan Lambda ke Topik SNS

Sekarang Anda memiliki timer dengan resolusi sekitar 15 menit.

Kemudian fungsi Lambda lainnya berlangganan ke SNS Topic dan dipanggil setiap 15 menit.

maplpro
sumber
4
Jawaban ini pada dasarnya adalah instruksi untuk satu mekanisme yang dapat mengimplementasikan Jam Kota yang Tidak Dapat Diandalkan yang dijelaskan dalam Jawaban Shadi . Mengingat bahwa penulis UTC memperingatkan bahwa "mungkin menghilang tanpa peringatan kapan saja", pendekatan Anda mungkin jauh lebih unggul.
Brian
Implementasi pertama - 1 pesan - berfungsi beberapa hari dan berhenti. Sepertinya pesan secara berkala tidak dikirimkan ke SQS. Menambahkan 2 pesan lagi (jumlah 3) - sekarang berfungsi sudah seminggu. Di CloudWatch saya melihat kesalahan berkala - hanya 2 pesan yang disampaikan, timer masih terus berjalan. Gist telah diperbarui gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro
@Brian Sebagai penulis Jam Kota yang Tidak Dapat Dipercaya ( townclock.io ) Saya setuju bahwa menjalankan milik Anda sendiri memberi Anda lebih banyak kendali daripada bergantung pada orang asing (saya). Faktanya, saya mendorong orang-orang untuk menjalankan Jam Kota yang Tidak Dapat Diandalkan mereka sendiri dan telah menerbitkan sumbernya di GitHub: github.com/alestic/alestic-unr reliable
Eric Hammond
4

Karena sekarang mudah untuk memicu fungsi lambda melalui HTTP (mis. Menggunakan GET atau curl) solusi sederhana adalah dengan menggunakan CRON yang dikelola seperti easycron: https://www.easycron.com/ untuk memicu fungsi lambda Anda agar berjalan.

Kami memiliki masalah yang sama dan akhirnya menjalankan layanan cron di Google App Engine dengan python karena ini memungkinkan lebih banyak fleksibilitas dan kompleksitas dalam pekerjaan CRON itu sendiri.

Dirk Conrad Coetsee
sumber
Waktu telah berubah dan Lambda sekarang mendukung penjadwalan tipe cron di luar kotak docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
Dirk Conrad Coetsee
2

Di halaman Fungsi, Tambah pemicu, Anda bisa menambahkan Acara CloudWatch, dan menjadikannya sebagai jenis jadwal

masukkan deskripsi gambar di sini

Daria Yu
sumber
1

Anda bisa menjadwalkannya dengan acara cloudWatch juga. Buat aturan -> lampirkan target (lambda) dan atur jadwal bijaksana cron / rate pada aturan Anda.

johnny
sumber
1

Cara konsol web cukup mudah. Cukup buat CloudWatchaturan untuk lambda dan tambahkan di Triggerstab lambda .

Bagi mereka yang perlu mengotomatisasi itu aws cli, kita bisa

  1. buat fungsinya,
  2. buat aturan,
  3. berikan izin,
  4. aturan dan fungsi tautan

Buat fungsi

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}

Buat aturan

## 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"}]'
LeOn - Han Li
sumber
1

cara sederhana untuk menjalankan kueri Anda di lambda untuk interval waktu tertentu adalah dengan menetapkan aturan untuk fungsi lambda Anda. untuk itu setelah membuat fungsi lambda pergi ke cloudwatch >> aturan >> jadwal. dan tentukan ekspresi cron dan di bagian target pilih fungsi lambda yang ingin Anda picu.

PKP
sumber
0

Saat membuat fungsi lambda buat pemicu "Acara CloudWatch - Jadwal"

Sekarang Anda dapat menggunakan preset AWS dalam ekspresi jadwal seperti rate = 15 menit atau Anda dapat menggunakan ekspresi cron.

masukkan deskripsi gambar di sini

Untuk kebutuhan Anda, Jadwal Cron adalah "0 0 17 1/1 *? *"

AMS
sumber
-1

Diksha adalah Penjadwal AWS Lambda berdasarkan AWS SWF Trigger seperti yang direkomendasikan oleh Tim AWS . Seseorang dapat menjadwalkan pekerjaan menggunakan ekspresi cron dan juga dapat menentukan berapa banyak waktu yang ingin Anda jalankan, kapan memulai atau kapan untuk mengakhiri. Anda dapat melihat status serta riwayat pekerjaan terjadwal. Keamanan dikelola oleh kebijakan AWS.

Setelah Anda mengatur mesin diksha, Anda dapat menjadwalkan fungsi menggunakan ekspresi cron dengan cara berikut:

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

Dalam pekerjaan ini pekerjaan akan berjalan setiap menit selama 10 kali. AWS SWF akan memicu fungsi dengan sendirinya.

Detail: https://github.com/milindparikh/diksha

Penafian: Saya kontributor untuk proyek ini.

Nehal Mehta
sumber