A maneira mais barata e fácil de executar um processo periódico do Docker


7

Eu tenho um processo Python dockerized que um cliente gostaria de executar uma ou duas vezes por mês. Ele chama várias APIs do Google e armazena os resultados em uma Planilha do Google. Não aceita solicitações de rede. Quero fornecer um "botão mágico" que gire o contêiner do Docker e depois desligue tudo.

Alguns antecedentes: eu já havia implantado isso em uma micro instância do AWS EC2 via Docker Cloud. Meu cliente obteve uma conta do Docker Cloud e conseguiu executar o contêiner sob demanda, de forma relativamente indolor. Existem dois problemas com este fluxo de trabalho:

  1. A instância do EC2 provisionada (host do Docker) estava em execução 24/7, independentemente de o contêiner do Docker ter sido executado ou não. Isso ficou caro.
  2. A nuvem do Docker foi desativada há um mês.

Alternativas parecem ser os serviços do Google e da AWS Kubernetes. Minha reserva é que eles serão muito complicados para o meu cliente usar. Adendo?


Por quanto tempo esse processo é executado?
PrestonM

Asse seu código python em um lambda AWS
Tensibai

@PrestonM, cerca de 25 minutos de centenas de chamadas de API de rede otimizadas.
asciimo

@Tensibai, considerei isso, mas meu cliente precisaria de uma conta da AWS e aprenderia como iniciar o lambda. Definitivamente uma opção, mas eu já tenho isso, recipiente totalmente funcional portátil Docker que eu deveria ser capaz de simplesmente jogar para cima da nuvem :)
asciimo

11
Eles não precisariam entender o Lambda; você poderia dar a eles um "botão" via API Gateway, S3 ou qualquer outro gatilho suportado. Dito isto, 25 minutos é cerca de 5 vezes mais longo para uma invocação do Lambda: P
Tim Malone

Respostas:


3

A AWS oferece agora o fargate, que é gerenciado por eles em vez de ser um serviço como o ECS, para o qual você executou os servidores e eles gerenciam o plano de controle. O Fargate é basicamente um ECS "sem servidor". Você pode usar um cloudwatch agendado até mesmo para executar algo ocasionalmente em um agendamento em um cluster do ECS do fargate. Portanto, você está pagando apenas pelo que está usando. Algo a considerar é que o fargate é um pouco mais caro do que o ECS executando em sua própria instância do EC2, mas se você estiver executando com frequência, provavelmente verá uma economia bastante marginal.

Outra opção seria automatizar algo semelhante. Portanto, crie um cluster ECS com um ASG fazendo o backup e ajuste a escala para atender à demanda do ECS e use o cloudwatch para iniciar o contêiner. O ECS pode ser escalado para cima e para baixo, mas isso pode ser complicado, porque esse método geralmente é usado para dimensionar automaticamente os clusters do ECS com base nos gatilhos do cloutwatch; portanto, você pode precisar entrar no cloudwatch e possivelmente hackear um script lambda, já que você é tecnicamente não usá-lo da maneira que se destina. No final, isso provavelmente seria o mais econômico, mas no seu caso a economia de custos poderia ser insignificante.

Na minha opinião, Kubernetes é um martelo de dez toneladas que você usaria para pendurar uma foto na parede. É um exagero.

Você pode explorar essas duas opções e ver se elas são econômicas e fáceis de gerenciar. Outra orquestração de contêiner costuma ser um exagero, o ECS tem a vantagem (geralmente uma desvantagem) de ser estúpido e simples e você paga muito pouco e basicamente não tem custos operacionais para o plano de controle.


2

A maneira mais barata é usar o Registro de contêineres do Heroku .

É totalmente gratuito, fácil de usar e implantar (você nem precisa da CLI heroku, basta encaixar a imagem no dock.heroku.com com seu token de autenticação)

Pode não ser o melhor, mas com base nos seus comentários, acho que deve ser bom para você, veja os contras aqui .

Outra alternativa barata é hyper.sh .


2

Você pode misturar o poderoso Zappa e Hug para converter seu código em uma função do AWS Lambda sem servidor, adicionando apenas um decorador à função principal do processo python

import hug
[...]

@hug.get('/your_endpoint_name')
def your_function_name():
    """Here goes your code"""
    [...]
    return "Function finished sucesfully"

Depois disso, você poderá implantar no AWS Lambda zappa deploy prode precisará chamar o URL retornado duas vezes por mês.


1

Embora eu normalmente concorde com as outras respostas de que o Kubernetes é um exagero, o KubeSail simplifica o máximo possível, a fim de facilitar a execução de tarefas como a sua. Há um nível gratuito que deve permitir que você execute seu trabalho indefinidamente. Você só precisa fazer login no GitHub, obter sua configuração do Kube e, em seguida, você pode usar o seguinte:

apiVersion: batch/v1
kind: Job
metadata:
  name: my-python-script
spec:
  template:
    spec:
      containers:
      - name: my-python-script
        image: asciimo/my-python-image

Apenas salve o descrito acima em my-job.yaml, substituindo image: asciimo/my-python-imagepelo nome da sua imagem no dockerhub (ou outro registro) e, em seguida, execute

kubectl apply -f my-job.yaml

Se você quiser saber mais sobre tarefas, os documentos do Kubernetes contêm muito mais informações e opções: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

Divulgação completa, sou um dos fundadores da KubeSail



0

O módulo ec2 Ansible exigiu a funcionalidade (instâncias de inicialização, executa algumas tarefas e as encerra) imediatamente . E ainda tem exemplo de manual.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.