定期的なDockerプロセスを実行する最も安価で簡単な方法


7

クライアントが月に1、2回実行したいDocker化されたPythonプロセスがあります。いくつかのGoogle APIを呼び出し、その結果をGoogleスプレッドシートに保存します。ネットワーク要求は受け付けません。Dockerコンテナーを起動してすべてをシャットダウンする「マジックボタン」を1つ提供したいと思います。

背景:これは以前、これをDocker Cloud経由でAWS EC2マイクロインスタンスにデプロイしていました。私のクライアントはDocker Cloudアカウントを取得し、コンテナーをオンデマンドで比較的簡単に実行できました。このワークフローには2つの問題があります。

  1. プロビジョニングされたEC2インスタンス(Dockerホスト)は、Dockerコンテナーが実行されたかどうかに関係なく、24時間365日稼働していました。これは高価になりました。
  2. Dockerクラウドは1か月前にシャットダウンしました。

代替手段は、GoogleおよびAWS Kubernetesサービスのようです。私の予約は、クライアントが使用するには複雑すぎるためです。助言?


このプロセスはどのくらいの期間実行されますか?
PrestonM

PythonコードをAWSラムダに
焼き込む

@PrestonM、何百ものスロットルされたネットワークAPI呼び出しの約25分。
asciimo

@Tensibai、私はそれを考えました、しかし私のクライアントはAWSアカウントを必要とし、ラムダを起動する方法を学ぶ必要があるでしょう。確かにオプションが、私はすでにこの私がいることを完全に機能する、ポータブルドッカーコンテナ持っている必要があり、単純にクラウド上に投げることができ:)
asciimo

1
彼らはLambdaを理解する必要はありません。APIGateway、S3、またはその他のサポートされているトリガーを介して「ボタン」を与えることができます。そうは言っても、25分はLambdaを呼び出すには約5倍長すぎます:P
Tim Malone

回答:


3

AWSはfargateを提供しています。これは、サーバーを実行し、コントロールプレーンを管理するECSのようなサービスではなく、サーバーによって管理されます。Fargateは基本的に「サーバーレス」のECSです。スケジュールされたクラウドウォッチを使用して、ファーゲートECSクラスターでスケジュールに従って何かを実行することもできます。したがって、あなたはあなたが使用しているものに対してのみ支払います。考慮すべき点は、ファーゲートは独自のEC2インスタンスで実行されているECSよりもかなり高価ですが、頻繁に実行している場合は、かなりわずかな節約になる可能性があります。

別のオプションは、同様のものを自動化することです。そのため、ASGをサポートするECSクラスターを作成し、ECS需要に合わせてスケールを調整してから、cloudwatchを使用してコンテナーを起動します。ECSはスケールアップとスケールダウンが可能ですが、この方法は通常、cloutwatchトリガーに基づいてECSクラスターを自動スケーリングするために使用されるため、技術的にはクラウドウォッチをハックし、ラムダスクリプトをハックしなければならない場合があるため、これは注意が必要です意図したとおりに使用していない。結局、これはおそらく最も費用効果が高いでしょうが、あなたの場合、コスト削減は無視できるでしょう。

私の意見では、Kubernetesは壁に絵を掛けるために使用する10トンのハンマーです。やり過ぎです。

これらの2つのオプションを調べて、コスト効率がよく、管理が簡単かどうかを確認できます。他のコンテナーオーケストレーションは通常、やり過ぎになります。ECSには、単純で愚かであるという利点(通常は欠点)があり、支払いがほとんどなく、基本的にコントロールプレーンの運用オーバーヘッドがありません。


2

最も安い方法は、HerokuのContainer Registryを使用することです。

完全に無料で、使いやすく、導入も簡単です(heroku CLIは必要なく、Dockerが認証トークンを使用してイメージをregistry.heroku.comにプッシュするだけです)。

それは最善ではないかもしれませんが、あなたのコメントに基づいて、私はあなたにとっては問題ないはずだと思いますここで短所を参照してください。

もう1つの安価な代替手段は、hyper.shです。


2

ZappaHugの強力な機能を組み合わせて、サーバーレスAWS Lambda関数でコードを変換し、Pythonプロセスのメイン関数にデコレーターのみを追加できます。

import hug
[...]

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

この後、AWS Lambdaにデプロイできzappa deploy prod、返されたURLを月に2回呼び出すだけで済みます。


1

私は通常、Kubernetesは過剰であるという他の回答に同意しますが、KubeSailは、あなたのようなタスクを簡単に実行できるようにするために、それを可能な限り単純化します。無期限にジョブを実行できる無料枠があります。GitHubを使用してログインし、Kube設定を取得するだけで、以下を使用できます。

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

上記をに保存し、dockerhub(または別のレジストリ)上のイメージの名前にmy-job.yaml置き換えimage: asciimo/my-python-imageて実行します。

kubectl apply -f my-job.yaml

ジョブについて詳しく知りたい場合は、Kubernetesのドキュメントに多くの情報とオプションが含まれています。https//kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

完全な開示、私はKubeSail創設者の一人です



0

Ansible ec2モジュールには、必要な機能(インスタンスを起動し、いくつかのタスクを実行してから終了する)が標準で備わっています。また、サンプルプレイブックもあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.