La forma más barata y fácil de ejecutar un proceso periódico de Docker

7

Tengo un proceso de Python dockerizado que a un cliente le gustaría ejecutar una o dos veces al mes. Llama a varias API de Google y almacena los resultados en una hoja de Google. No acepta solicitudes de red. Quiero proporcionar un "botón mágico" que hará girar el contenedor Docker y luego cerrará todo.

Algunos antecedentes: anteriormente había implementado esto en una micro instancia de AWS EC2 a través de Docker Cloud. Mi cliente obtuvo una cuenta de Docker Cloud y pudo ejecutar el contenedor a pedido, de manera relativamente sencilla. Hay dos problemas con este flujo de trabajo:

  1. La instancia EC2 aprovisionada (host Docker) se ejecutaba las 24 horas, los 7 días de la semana, independientemente de si el contenedor Docker se había ejecutado o no. Esto se volvió costoso.
  2. La nube Docker se cerró hace un mes.

Las alternativas parecen ser los servicios de Google y AWS Kubernetes. Mi reserva es que serán demasiado complicados para mi cliente. ¿Consejo?

asciimo
fuente
¿Cuánto tiempo dura este proceso?
PrestonM
Hornee su código de Python en una AWS lambda
Tensibai
@PrestonM, aproximadamente 25 minutos de cientos de llamadas API de red aceleradas.
asciimo
@Tensibai, lo consideré, pero mi cliente necesitaría una cuenta de AWS y necesitaría aprender cómo iniciar el lambda. Definitivamente es una opción, pero ya tengo este contenedor Docker totalmente funcional y portátil que debería poder simplemente lanzar a la nube :)
asciimo
1
No tendrían que entender a Lambda, podría darles un "botón" a través de API Gateway, S3 o cualquier otro activador compatible. Dicho esto, 25 minutos es aproximadamente 5 veces más tiempo para una invocación de Lambda: P
Tim Malone

Respuestas:

3

AWS ofrece ahora Fargate, que es administrado por ellos en lugar de ser un servicio como ECS para el que ejecutó los servidores y ellos administran el plano de control. Fargate es básicamente un ECS "sin servidor". Puede usar un reloj de nube programado incluso para ejecutar algo ocasionalmente en un horario en un clúster ECS de Fargate. Por lo tanto, solo paga por lo que está utilizando. Algo a considerar es que fargate es bastante más costoso que el ECS que se ejecuta en su propia instancia de EC2, pero si se está ejecutando con frecuencia, probablemente verá un ahorro bastante marginal.

Otra opción sería automatizar algo similar. Por lo tanto, cree un clúster ECS con un ASG que lo respalde, y ajuste la escala para que coincida con la demanda de ECS, y luego use cloudwatch para iniciar el contenedor. A continuación, ECS puede escalar hacia arriba y hacia abajo, pero esto puede ser complicado porque este método generalmente se usa para escalar automáticamente los clústeres de ECS en función de los desencadenantes de cloutwatch, por lo que es posible que tenga que piratear en Cloudwatch y posiblemente piratear un script lambda, ya que técnicamente no usarlo de la manera prevista. Al final, este probablemente sería el más rentable, pero en su caso el ahorro de costos podría ser insignificante.

En mi opinión, Kubernetes es un martillo de diez toneladas que usarías para colgar un cuadro en la pared. Es exagerado.

Puede explorar esas 2 opciones y ver si son rentables y fáciles de administrar. Otra orquestación de contenedores generalmente será exagerada, ECS tiene la ventaja (generalmente una desventaja) de ser estúpido simple y paga muy poco y básicamente no tiene gastos generales operativos para el avión de control.

tsturzl
fuente
2

La forma más barata es utilizar el Registro de contenedores de Heroku .

Es completamente gratuito, fácil de usar e implementar (ni siquiera necesita la CLI de heroku, solo docker empuje su imagen a Registry.heroku.com con su token de autenticación)

Sin embargo, puede que no sea el mejor, pero según tus comentarios, creo que debería estar bien para ti, mira los contras aquí .

Otra alternativa barata es hyper.sh .

tormenta
fuente
2

Puede mezclar los poderosos de Zappa y Hug para convertir su código en una función AWS Lambda sin servidor agregando solo un decorador a la función principal de su proceso de Python

import hug
[...]

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

Después de esto, puede implementar en AWS Lambda con zappa deploy prody solo tendrá que llamar a la URL devuelta dos veces al mes.

erseco
fuente
1

Si bien normalmente estoy de acuerdo con las otras respuestas de que Kubernetes es excesivo, KubeSail lo simplifica tanto como sea posible para facilitar la ejecución de tareas como la suya. Hay un nivel gratuito que debería permitirle ejecutar su trabajo indefinidamente. Solo necesita iniciar sesión con GitHub, obtener su configuración de Kube y luego puede usar lo siguiente:

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

Simplemente guarde lo anterior en my-job.yaml, reemplazando image: asciimo/my-python-imagecon el nombre de su imagen en dockerhub (u otro registro), luego ejecute

kubectl apply -f my-job.yaml

Si desea obtener más información sobre Jobs, los documentos de Kubernetes contienen mucha más información y opciones: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

Revelación completa, soy uno de los fundadores de KubeSail

pastudan
fuente
0

El módulo ec2 Ansible tiene la funcionalidad requerida (instancias de lanzamiento, ejecuta algunas tareas y luego las termina) de forma inmediata . E incluso tener un libro de jugadas de muestra.

am4
fuente