bugfix> amazon-web-services > 投稿

Pythonコードとサードパーティのバイナリ実行可能ファイルを含むDockerイメージがあります。送信ネットワーク要求のみがあります。イメージは1時間ごとに実行する必要があり、各実行は約3分間続きます。

できます:

  1. EC2インスタンスを使用し、cronを介して毎時実行をスケジュールします
  2. CloudWatchイベント/ルールを作成して、ECSタスク定義を1時間ごとに実行します
  3. Elastic Beanstalk環境をセットアップし、イメージの1時間ごとのデプロイをスケジュールします

これらのすべてのシナリオで、EC2インスタンスは年中無休で実行されており、使用されないまま長期間課金されます。

既存のEC2インスタンスの起動を1時間ごとにスケジュールし、Dockerイメージの完了後にそのインスタンスを停止するスケジュールを設定するにはどうすればよいですか?

回答 1 件
  • ここに私が考えることができる1つのアプローチがあります。これは非常に高レベルであり、一部の詳細は省略しますが、概念的には問題なく機能します。また、使用するID&アクセス管理(IAM)ロールを考慮する必要があります。

    ステップ関数をトリガーするCloudWatchイベントルール

    Lambda関数をトリガーするAWS Step Function

    EC2インスタンスを起動するAWS Lambda関数

    アクティビティタスクのStep FunctionsサービスをポーリングするEC2インスタンス

    cron式を使用して、CloudWatchイベントルールを作成し、定期的なタスクをスケジュールします

    目標 CloudWatchイベントルールはAWSステップ関数です

    AWS Step Function State Machineは、EC2インスタンスを開始するAWS Lambda関数をトリガーすることで開始します

    ステップ関数ステートマシンの次のステップは、実行する必要があるDockerコンテナを表すアクティビティタスクを呼び出します

    EC2インスタンスにはスクリプトが実行されており、アクティビティタスクの作業をポーリングします

    EC2インスタンスはDockerコンテナを実行し、終了するまで待機し、完了メッセージをステップ関数アクティビティタスクに送信します

    EC2インスタンスで実行されているスクリプトはシャットダウンします

    AWS Step Functionが終了します

    同じインスタンスを単純に開始および停止するのではなく、新しいEC2インスタンスを1時間ごとにスピンアップすることをお勧めします。既存のインスタンスを起動するよりも新しいインスタンスを起動する方が起動パフォーマンスが向上する場合がありますが、EC2インスタンスをペットのように維持するために時間を費やす必要があります。今日の世界では、インフラストラクチャは使い捨てであることが一般的に受け入れられています。結局のところ、アプリケーションは既にDockerコンテナーにパッケージ化されているため、コンテナーが実際に実行されているホストについて過度に具体的な期待はないでしょう。

    もう1つのオプションは、AWS Fargateを使用することです。AWSFargateは、コンテナインフラストラクチャの起動と管理を心配することなく、Dockerコンテナを実行するように設計されています。

    AWSステップ関数

    AWS Fargate

    ブログ:AWS Fargate:概要

    スケジュールでトリガーするCloudWatchイベントルールの作成

あなたの答え