AWS Lambda Zamanlanmış Görevler


145

Amazon AWS Lambda'yı açıkladı ( http://aws.amazon.com/lambda/ ) .

Ürün açıklaması içerir:

Zamanlanmış Görevler

AWS Lambda işlevleri harici olay zamanlayıcıları tarafından tetiklenebilir, bu nedenle işlevler düzenli olarak planlanan bakım zamanlarında veya yoğun olmayan saatlerde çalıştırılabilir. Örneğin, yoğun olmayan saatlerde her gece arşiv temizliği gerçekleştirmek için bir AWS Lambda işlevini tetikleyebilirsiniz.

Bunu okuduğumda, sonunda sürekli olarak "cron benzeri" görevler yapmanın bir yolunun olabileceğini anladım. Her gün 17:00 'de belirli bir sorgu çalıştırmak istiyorum diyelim.

Ancak bunu belgelerin hiçbir yerinde bulamıyorum. Yalnızca programsal olaylardan veya diğer AWS hizmetlerinden olaylardan tetikleyicilerden bahsederler.

Yanlış anladım mı? Yoksa biri beni belgelere yönlendirebilir mi?

Yanıtlar:


159

Zamanlanmış Etkinlikler için Yerel Destek 8 Ekim 2015 eklendi:

Bu AWS blog gönderisinde açıklandığı gibi , zamanlama artık " CloudWatch Olayları - Zamanlama " adı verilen bir olay kaynağı türü (tetikleyiciler olarak da bilinir) olarak desteklenmektedir ve bir oran veya cron ifadesi olarak ifade edilebilir.

Yeni bir lambda için Zamanlanmış Etkinlik ekle

'Tetikleyicileri yapılandır' oluşturma adımına gidin ve 'CloudWatch Olayı - Zamanlama' tetikleyicisini belirtin. Aşağıdaki örnek yapılandırma:

17:00 UTC'de zamanlanmış bir etkinlik oluşturmak için yapılandırmayı gösteren resim.

Mevcut bir lambda'ya Zamanlanmış Etkinlik ekle

Lambda'nızın 'Tetikleyiciler' sekmesine gidin, 'Tetikleyici Ekle'yi seçin ve' CloudWatch Etkinliği - Zamanlama 'tetikleyicisini belirtin. SNS tetiklemeli mevcut bir lambda'ya sahip olduğum örnek ekran görüntüsü:

Lambda konsolundan tetikleyici kullanıcı arayüzü eklemek için nasıl gezinileceğini gösteren resim.

Yüklendikten sonra, bu tetikleyiciyi yapılandıran kullanıcı arayüzü, yukarıdaki "Yeni bir lambda'ya Zamanlanmış Etkinlik Ekleme" bölümündeki ekran görüntüsü ile aynıdır.

Tartışma

Örnek durumunuz için cron()yerine kullanmak isteyeceksiniz rate(). Lambda'daki cron ifadeleri tüm alanları gerektirir ve UTC olarak ifade edilir. Bu nedenle, her gün 17: 00'da (UTC) bir işlev çalıştırmak için aşağıdaki cron ifadesini kullanın:

cron(0 17 * * ? *)

Diğer Kaynaklar

notlar

  • Bu özellik türünün adı, bu özellik ilk kez yayınlandığı için "Zamanlanmış Etkinlik" ten "CloudWatch Olayları - Zamanlama" olarak değiştirildi.
  • Bu özelliğin yayınlanmasından önce, bu soruna önerilen çözüm (42 dakika 50 saniyede "AWS Lambda ile Başlarken" başına ) bir zamanlayıcı oluşturmak için SWF kullanmaktı oluşturmak veya harici bir uygulama ile bir zamanlayıcı .
  • Lambda UI, planlanan etkinlik blog gönderisi çıktığından beri elden geçirildi ve içindeki ekran görüntüleri artık kesin değil. En son revizyonlar için yukarıdaki 3/10/2017 tarihli güncellenmiş ekran görüntülerime bakın.

1 dakikalık hassas destek için umut olup olmadığını biliyor musunuz?
kaptan

2
Biraz kesmek ama bunu 1 dakikalık bir frekans için yapabilirsiniz youtube.com/watch?v=FhJxTIq81AU
ingh.am

4
Etkinlik kaynağı türü artık "CloudWatch Etkinlikleri - Program"
Guy Daher

@GuyDaher Teşekkür ederim, cevabımı buna göre güncelledim.
Anthony Neace

3
Şimdi 1 dk hızı destekliyor. docs.aws.amazon.com/lambda/latest/dg/…
advncd

18

Bu gönderinin zamanından bu yana, başka bir çözüm var gibi görünüyor: Yazarın SNS konusuna Güvenilmez Kent Saati konusuna abone olmayı önerdiği Güvenilmez Şehir Saati ile Yinelenen AWS Lambda Invocations Zamanlayın . Ne SWF ne de SNS kullandım, ama bana göre SNS çözümü daha basit. İşte makaleden bir alıntı

Güvenilmez Şehir Saati (UTC)

Güvenilmez Şehir Saati (UTC), tüm abonelere her çeyrek saatte bir “zil” mesajı yayınlayan yeni, ücretsiz, herkese açık bir SNS Konusu (Amazon Basit Bildirim Servisi). Zilleri AWS Lambda işlevlerine, SQS kuyruklarına ve e-posta adreslerine gönderebilir.

Kodunuzu onbeş dakikada bir çalıştırmak için zil özelliklerini kullanabilirsiniz veya kodunuzu yalnızca saatte bir (ör. Dakika == "00") veya günde bir kez (ör. Saat == "00" ve dakika = = "00") veya başka bir aralık serisi.

Gelecekte yalnızca belirli bir saatte yalnızca bir kez çalıştırmak istediğiniz bir işleve bile abone olabilirsiniz: Bu işlevin, istediği süreden sonraya kadar tüm çağrıları yoksaymasını sağlayın. Zamanı geldiğinde, işini yapabilir, sonra SNS Topic'ten çıkabilirsiniz.

Kodunuzu Güvenilmez Şehir Saatine bağlamak hızlı ve kolaydır. Başvuru süreci veya hesap oluşturmak gerekmez


9
Artık geçerli bir cevap değil. Güvenilmez Şehir Saati artık kullanılamıyor
blueskin

15

YENİ ÇÖZÜM: Lambda Zamanlanmış İşler

Werner Vogel bu akşam (10/08) yeniden açıkladı: AWS Lambda'nın artık kendi programlayıcısı var.

2015-10-08 tarihli AWS Lambda sürüm notuna bakın :

AWS Lambda konsolunu kullanarak kodunuzu düzenli ve programlı bir şekilde çağırmak için AWS Lambda'yı da ayarlayabilirsiniz. Sabit bir oran belirtebilirsiniz (saat, gün veya hafta sayısı) veya bir cron ifadesi belirleyebilirsiniz. Örnek için bkz. İzlenecek Yol 5: Zamanlanmış Olayları İşlemek için Lambda İşlevlerini Kullanma (Python) .


ESKİ ÇÖZÜM: AWS Veri Hattı ile Zamanlama

AWS Veri Hattı'nı, belirli bir süreye sahip bir görev zamanlamak için kullanabilirsiniz . Boru Hattınızı ShellCommandActivity ile yapılandırdığınızda eylem herhangi bir komut olabilir .

Örneğin aşağıdakileri yapmak için bir AWS CLI komutu çalıştırabilirsiniz:


AWS Data Pipeline zamanlanmış görevini doğrudan AWS konsolu içinden kolayca oluşturabilirsiniz (örn. AWS CLI komutuyla):

resim açıklamasını buraya girin

Programlamanızı tanımlamak için API'yı da kullanabilirsiniz :

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

Sınırlar : Minimum programlama aralığı 15 dakikadır.
Fiyatlandırma : Aylık yaklaşık 1,00 ABD doları.


9

İşte nasıl yaparım:

  • Aşağıdakileri oluşturan Lambda oluşturun:

  • Aşağıdakiler için CloudWatch Alarmı oluşturun: YaklaşıkNumaraOfMesajlarVisible> 1 dakika boyunca 0

  • SNS Konusunu Alarm'a Abone Olun
  • Lambda'yı SNS konusu için abone olun

Şimdi yaklaşık 15 dakikalık çözünürlükte bir zamanlayıcı var.

Daha sonra diğer Lambda fonksiyonları SNS Topic'e abone olur ve her 15 dakikada bir çağrılır.


4
Bu cevap temelde anlatılan Güvenilmez İlçe Saat uygulayabilir bir mekanizması için talimatlar olduğunu Shadi en Yanıt . UTC'nin yazarının "herhangi bir zamanda uyarı vermeden kaybolabileceğini" uyardığı düşünülürse, yaklaşımınız muhtemelen çok daha üstündür.
Brian

İlk uygulama - 1 mesaj - birkaç gün çalışır ve durur. Periyodik olarak mesaj sadece SQS'ye teslim edilmiyor gibi görünüyor. 2 ileti daha eklendi (toplamda 3) - şimdi zaten bir hafta çalışıyor. CloudWatch'da periyodik özlemler görüyorum - sadece 2 mesaj gönderildi, yine de zamanlayıcı iyi çalışıyor. Gist güncellendi gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro

@Brian Güvenilmez Kasaba Saati'nin ( townclock.io ) yazarı olarak, kendi başınıza koşmanın bazı yabancılara (bana) bağlı olarak size daha fazla kontrol sağladığını kabul ediyorum. Aslında, insanları kendi Güvenilmez Şehir Saatlerini çalıştırmaya teşvik ediyorum ve kaynağı GitHub'da yayınladım: github.com/alestic/alestic-unreliable-town-clock
Eric Hammond

4

Artık lambda işlevlerini HTTP üzerinden (örneğin GET veya curl kullanarak) tetiklemek artık kolay olduğundan, basit bir çözüm easycron gibi yönetilen bir CRON kullanmaktır: https://www.easycron.com/ lambda işlevinizi çalıştırmak için .

Aynı sorunu yaşadık ve CRON işinin kendisinde daha fazla esneklik ve karmaşıklık sağladığından, python'da Google App Engine'de bir cron hizmeti çalıştırdık.


Zaman değişti ve Lambda şimdi kutu dışarı cron tipi zamanlama destekleyen docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
Dirk Conrad Coetsee

2

İşlev sayfasında, Tetikleyici ekle bölümünde bir CloudWatch Etkinliği ekleyebilir ve bunu bir zamanlama türü olarak yapabilirsiniz

resim açıklamasını buraya girin


1

CloudWatch olaylarıyla da zamanlayabilirsiniz. Kural oluştur -> hedef (lambda) ekleyin ve kuralınıza cron / rate wise zamanlamasını ayarlayın.


1

Web konsolu yolu oldukça basittir. Sadece CloudWatchlambda için bir kural oluşturun ve lambda'nın Triggerssekmesine ekleyin .

Olanlar için kim ile otomatikleştirmek gerekiyor aws cli, biz

  1. işlevi yarat,
  2. kuralı oluştur,
  3. izin ver,
  4. bağlantı kuralı ve işlevi

Fonksiyon oluştur

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}

Kurallar oluşturun

## 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

sorgunuzu belirli bir zaman aralığı için lambda'da çalıştırmanın basit yolu lambda işleviniz için kural belirlemektir. bunun için lambda fonksiyonu oluşturduktan sonra cloudwatch >> kuralları >> programına gidin. ve cron ifadesini tanımlayın ve hedef bölümde tetiklemek istediğiniz lambda işlevini seçin.


0

Lambda işlevini oluştururken tetikleyici "CloudWatch Events - Schedule" oluştur

Artık AWS önayarlarını rate = 15 dak gibi zamanlama ifadesinde kullanabilirsiniz veya bir cron ifadesi kullanabilirsiniz.

resim açıklamasını buraya girin

İhtiyaçlarınız için Cron Takvimi "0 0 17 1/1 *? *"


-1

Diksha, AWS Ekibi tarafından önerildiği üzere AWS SWF Tetikleyicisine dayanan AWS Lambda Zamanlayıcıdır . Cron ifadelerini kullanarak işleri zamanlayabilir ve kaç kez, ne zaman başlayacağınızı veya ne zaman bitireceğinizi belirtebilirsiniz. Zamanlanan işlerin durumunu ve geçmişini görüntüleyebilirsiniz. Güvenlik AWS politikaları tarafından yönetilir.

Diksha motorunu kurduktan sonra, cron ifadesini kullanarak işlevleri programlayabilirsiniz:

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

Bu işte iş 10 dakika boyunca her dakika çalışacaktır. AWS SWF işlevi kendi kendine tetikleyecektir.

Ayrıntılar: https://github.com/milindparikh/diksha

Feragatname: Projeye katkıda bulunuyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.