Tarefas agendadas do AWS Lambda

145

A Amazon anunciou o AWS Lambda ( http://aws.amazon.com/lambda/ ).

A descrição do produto inclui:

Atividades agendadas

As funções do AWS Lambda podem ser acionadas por temporizadores de eventos externos, para que as funções possam ser executadas durante horários de manutenção agendados regularmente ou fora do horário de pico. Por exemplo, você pode acionar uma função do AWS Lambda para executar limpezas noturnas de arquivamento durante o horário não ocupado.

Quando li isso, entendi que finalmente poderia ter uma maneira de executar consistentemente tarefas "semelhantes ao cron". Quero executar uma consulta específica todos os dias às 17h, digamos.

No entanto, não encontro isso em nenhum lugar da documentação. Eles mencionam apenas gatilhos em eventos programáticos ou eventos de outros serviços da AWS.

Eu entendi mal? Ou alguém pode me indicar a documentação?

Nathan H
fonte

Respostas:

159

Suporte nativo para eventos agendados adicionado em 8 de outubro de 2015:

Conforme anunciado nesta postagem do blog da AWS , o agendamento agora é suportado como um tipo de fonte de eventos (também chamado de gatilhos) chamado " CloudWatch Events - Schedule " e pode ser expresso como uma taxa ou uma expressão cron.

Adicionar evento agendado a uma nova lambda

Navegue para a etapa de criação 'Configurar gatilhos' e especifique o gatilho 'CloudWatch Event - Schedule'. Exemplo de configuração abaixo:

Imagem que mostra a configuração para criar um evento agendado às 17:00 UTC.

Adicionar evento agendado a um lambda existente

Navegue até a guia 'Triggers' do seu lambda, selecione 'Add Trigger' e especifique o gatilho 'CloudWatch Event - Schedule'. Exemplo de captura de tela em que eu tenho um lambda existente com um gatilho SNS:

Imagem que mostra como navegar para adicionar uma interface de usuário de gatilho no console Lambda.

Uma vez carregada, a interface do usuário para configurar esse gatilho é idêntica à captura de tela na seção "Adicionar evento agendado a um novo lambda" acima.

Discussão

Para o seu caso de exemplo, convém usar em cron()vez de rate(). Expressões cron em lambda requerem todos os campos e são expressas em UTC. Portanto, para executar uma função todos os dias às 17:00 (UTC), use a seguinte expressão cron:

cron(0 17 * * ? *)

Recursos adicionais

Notas

  • O nome desse tipo de evento mudou de "Evento agendado" para "Eventos do CloudWatch - Agendamento" desde que esse recurso foi lançado pela primeira vez.
  • Antes do lançamento desse recurso, a solução recomendada para esse problema (por "Introdução ao AWS Lambda" aos 42min 50s ) era usar o SWF para criar um cronômetro ou um cronômetro com um aplicativo externo.
  • A interface do usuário do Lambda foi revisada desde a publicação da postagem do blog do evento agendado e as capturas de tela não são mais exatas. Veja minhas capturas de tela atualizadas acima a partir de 10/03/2017 para obter as revisões mais recentes.
Anthony Neace
fonte
você sabe se há esperança de um suporte de precisão de 1 minuto?
kaptan
2
É um pouco de um truque, mas você pode fazer isso por um 1 min frequência youtube.com/watch?v=FhJxTIq81AU
ingh.am
4
Tipo de origem do evento é agora "CloudWatch Eventos - Agenda"
Guy Daher
@GuyDaher Obrigado, atualizei minha resposta de acordo.
Anthony Neace 14/05
3
Ele suporta taxa de 1min agora. docs.aws.amazon.com/lambda/latest/dg/…
advncd 13/11/16
18

Desde o momento desta publicação, parece ter surgido outra solução: Programar invocações recorrentes do AWS Lambda com o relógio da cidade não confiável (UTC), no qual o autor propõe a inscrição no tópico Relógio da cidade não confiável do SNS . Não usei nem SWF nem SNS, mas me parece que a solução SNS é mais simples. Aqui está um trecho do artigo

Relógio não confiável da cidade (UTC)

O relógio não confiável da cidade (UTC) é um novo tópico público gratuito do SNS (Amazon Simple Notification Service) que transmite uma mensagem de "aviso sonoro" a cada quinze minutos a todos os assinantes. Ele pode enviar os carrilhões para as funções do AWS Lambda, filas SQS e endereços de email.

Você pode usar os atributos chime para executar seu código a cada quinze minutos, ou apenas executar uma vez por hora (por exemplo, quando minuto == "00") ou uma vez por dia (por exemplo, quando hora == "00" e minuto = = "00") ou qualquer outra série de intervalos.

Você pode até assinar uma função que deseja executar apenas uma vez em um horário específico no futuro: faça com que a função ignore todas as chamadas até que seja após o tempo que desejar. Quando chegar a hora, ele pode executar seu trabalho e cancelar a inscrição no tópico do SNS.

Conectar seu código ao Relógio não confiável da cidade é rápido e fácil. Nenhum processo de inscrição ou criação de conta é necessário

shadi
fonte
9
Não é mais uma resposta válida. O Unreliable Town Clock não está mais disponível
Blueskin
15

NOVA SOLUÇÃO: Trabalhos agendados Lambda

Werner Vogel anunciou hoje à noite (10/08): re: Invente que o AWS Lambda agora tem seu próprio agendador.

Veja a nota de versão do AWS Lambda em 08/10/2015 :

Você também pode configurar o AWS Lambda para invocar seu código regularmente e agendado usando o console do AWS Lambda. Você pode especificar uma taxa fixa (número de horas, dias ou semanas) ou especificar uma expressão cron. Para um exemplo, consulte Passo a passo 5: Usando funções Lambda para processar eventos agendados (Python) .


SOLUÇÃO ANTIGA: Agendamento com o AWS Data Pipeline

Você pode usar o AWS Data Pipeline para agendar uma tarefa com um determinado período. A ação pode ser qualquer comando quando você configura seu Pipeline com o ShellCommandActivity .

Você pode, por exemplo, executar um comando da AWS CLI para:

  • Coloque uma mensagem para SQS
  • ou invocar diretamente uma função Lambda (consulte invocar )

Você pode criar facilmente a tarefa agendada do AWS Data Pipeline diretamente no console da AWS (por exemplo, com um comando da AWS CLI):

insira a descrição da imagem aqui

Você também pode usar a API para definir sua programação:

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

Limites : o intervalo mínimo de agendamento é de 15 minutos.
Preço : cerca de US $ 1,00 por mês.

Yves M.
fonte
9

Aqui está como eu faço isso:

  • Crie o Lambda que:

  • Crie um alarme do CloudWatch para: ApproximateNumberOfMessagesVisible> 0 por 1 minuto

  • Inscrever o tópico do SNS no alarme
  • Inscrever-se Lambda no tópico SNS

Agora você tem um timer com resolução de aproximadamente 15 minutos.

Em seguida, outras funções do Lambda são inscritas no Tópico do SNS e chamadas a cada 15 minutos.

maplpro
fonte
4
Essa resposta é basicamente instruções para um mecanismo que pode implementar o relógio não confiável da cidade, descrito na resposta de Shadi . Dado que o autor da UTC alerta que "pode ​​desaparecer sem aviso a qualquer momento", sua abordagem é provavelmente muito superior.
187 Brian
A primeira implementação - 1 mensagem - funciona alguns dias e pára. Parece que periodicamente a mensagem simplesmente não é entregue ao SQS. Adicionadas mais 2 mensagens (3 no total) - agora já funciona uma semana. No CloudWatch, vejo falhas periódicas - apenas 2 mensagens entregues, o temporizador continua funcionando. O Gist foi atualizado gist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro
@ Brian Como autor do Unreliable Town Clock ( townclock.io ), eu concordaria que administrar o seu próprio país lhe dá mais controle do que depender de algum estranho (eu). Na verdade, eu encorajo as pessoas a gerir os seus próprios Unreliable Town Clock e publicaram a fonte no GitHub: github.com/alestic/alestic-unreliable-town-clock
Eric Hammond
4

Como agora é facilmente possível acionar funções lambda por HTTP (por exemplo, usando GET ou curl), uma solução simples é usar um CRON gerenciado como o easycron: https://www.easycron.com/ para ativar a função lambda em execução.

Tivemos o mesmo problema e acabamos executando um serviço cron no Google App Engine em python, pois isso permitia mais flexibilidade e complexidade no próprio trabalho do CRON.

Dirk Conrad Coetsee
fonte
Os tempos mudaram e Lambda agora suportam tipo cron agendamento para fora da caixa docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
Dirk Conrad Coetsee
2

Na página Função, Adicionar gatilho, você pode adicionar um CloudWatch Events e torná-lo como um tipo de agendamento

insira a descrição da imagem aqui

Daria Yu
fonte
1

Você também pode agendá-lo com eventos do cloudWatch. Criar regra -> anexar destino (lambda) e configurar cron / rate em sua regra.

johnny
fonte
1

A maneira do console da web é bastante direta. Apenas crie uma CloudWatchregra para o lambda e adicione-a na Triggersguia do lambda .

Para quem precisa automatizar isso aws cli, podemos

  1. crie a função
  2. crie a regra,
  3. conceda a permissão,
  4. regra e função do link

Criar função

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}

Criar regras

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

Uma maneira simples de executar sua consulta no lambda por um intervalo de tempo específico é definir regras para sua função lambda. Para isso, após criar a função lambda, vá para cloudwatch >> rules >> schedule. e defina a expressão cron e, na seção de destino, selecione a função lambda que você deseja acionar.

PKP
fonte
0

Ao criar a função lambda, crie o gatilho "CloudWatch Events - Schedule"

Agora você pode usar as predefinições da AWS na expressão de agendamento como rate = 15 min ou pode usar uma expressão cron.

insira a descrição da imagem aqui

Para sua exigência, o Cron Schedule é "0 0 17 1/1 *? *"

AMS
fonte
-1

O Diksha é o AWS Lambda Scheduler baseado no AWS SWF Trigger, conforme recomendado pela equipe da AWS . Pode-se agendar trabalhos usando expressões cron e também pode especificar por quanto tempo você deseja executar, quando iniciar ou quando terminar. Você pode visualizar o status e o histórico dos trabalhos agendados. A segurança é gerenciada pelas políticas da AWS.

Depois de configurar o mecanismo diksha, você pode agendar funções usando a expressão cron da seguinte maneira:

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

Neste trabalho, o trabalho será executado a cada minuto por 10 vezes. O AWS SWF acionará a função por si só.

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

Isenção de responsabilidade: eu sou colaborador do projeto.

Nehal Mehta
fonte