Amazon Web Services ブログ

Docker、Amazon ECS、スポットフリート: 素晴らしい組み合わせ

AWS コンテナのヒーロー、Tung Nguyen による寄稿。Tung は、AWS のクラウドインフラストラクチャとソフトウェアに焦点を当てたコンサルティング会社、BoltOps の社長兼創立者です。また、BoltOps Nuts and Bolts ブログの執筆も楽しんでいます。

EC2 スポットインスタンスでは、大幅な割引で予備の計算容量を使うことができます。Amazon ECS をスポットインスタンスと共に使用することは、おそらく AWS でワークロードを実行するための最良の方法の 1 つです。スポットインスタンスを使用すると、Amazon EC2 インスタンスで 50 ~ 90% を節約できます。この話を聞いたら、ブラックフライデー特別割引のような大きなチャンスに飛び込みたいと思うでしょう。しかし、ほとんどの人はスポットインスタンスについて知らないか、ためらってしまいます。これは、スポットに関するいくつかの誤った認識が原因である可能性があります。

スポットに対する誤った認識

スポットモデルでは、AWS はいつでもインスタンスを削除できます。これは、メンテナンスのアップグレード、そのインスタンスタイプに対する高い需要、古いインスタンスタイプ、または何らかの理由によるものである可能性があります。

そのため、人々はスポットに対して、最初はすぐ恐怖や誤った認識を持つようになります。

インスタンスをいつでも置き換えることができるというのは、どういう意味ですか? いいえ、インスタンスを起動してから 20 分以内に抹消されるという意味です。

私も最初は同じように感じました。実際、スポットインスタンスアドバイザーのウェブサイトには、次のように記載されています。

全リージョンとインスタンスタイプにわたる中断の平均頻度は 5% 未満です。

私自身の使用状況から、私はインスタンスが数週間実行されることを確認しました。証明が必要ですか? これは、当社の本番環境クラスターの 1 つのインスタンスからのスクリーンショットです。

何日なのかが気になるとおっしゃるなら…

はい、228 日間連続です。これと同じくらい長い時間は稼働しないかもしれませんが、スポットインスタンスが、通常、開始から 20 分以内に中断されるという誤った認識は否定できます。

スポットフリート

スポットインスタンスでは、特定のアベイラビリティーゾーンにある特定のインスタンスに対して、単一のリクエストを行います。スポットフリートでは、単一のインスタンスタイプをリクエストする代わりに、要件を満たすさまざまなインスタンスタイプを要求できます。多くのワークロードでは、CPU と RAM が十分に近い限り、インスタンスタイプの多くでは順調に動作します。

そのため、スポットフリートを使用して、インスタンスタイプと複数のゾーンにインスタンスベットを分散させることができます。スポットフリートを使用すると、すでに述べたように中断率が低いことに加え、システムが劇的に堅牢になります。また、オンデマンドクラスターを実行して、追加の保護機能を提供することもできます。

ECS、スポットフリート: 素晴らしい組み合わせ

スケーラブルなシステムを非常に低いコストで実現できるため、これはワークロードを実行するためのお気に入り方法の 1 つです。これらのテクノロジーは非常にうまく組み合わされているため、お互いのために構築されたと考えてしまうほどです。

  1. Docker は、デプロイするための一貫した標準バイナリ形式を提供します。1 つの Docker 環境で機能すれば、別の環境でも機能します。コンテナは数秒でプルダウンできるため、中断中にコンテナが移動する可能性があるスポットインスタンスに最適です。
  2. ECS は Docker コンテナを実行するための優れたエコシステムを提供します。ECS は、接続インスタンスのドレインと呼ばれる機能をサポートしています。これにより、Docker コンテナを他の EC2 インスタンスに移動するように ECS に指示できます。
  3. スポットインスタンスは 2 分間警告信号を発信して、インスタンスの終了時間を知らせます。

これらはスポットフリートに ECS クラスターを構築するために必要です。私は 2 分間警告を使用して ECS 接続ドレインを呼び出します。ECS は自動的にコンテナをフリートにある別のインスタンスに移動させます。

これを実現する CloudFormation テンプレートはこちらです。ecs-ec2-spot-fleet。スポットフリートの理解に焦点を当てているため、VPC はシンプルになるように設計されています。

このテンプレートは、スポットフリートで 2 つのインスタンスタイプを指定します。それぞれ 2 GB と 4 GB の RAM を持つ t3.small と t3.medium です。テンプレートは、t3.small より 2 倍重い t3.medium です。基本的に、スポットフリート TargetCapacity の値は、ECS クラスターにプロビジョニングするための合計 RAM と同じです。したがって、8 を指定した場合、スポットフリートサービスは 4 つの t3.small インスタンスまたは 2 つの t3.medium インスタンスをプロビジョニングする可能性があります。クラスターは少なくとも 8 GB の RAM を追加します。

スタックを起動するには、次のコマンドを実行してください。

aws cloudformation create-stack --stack-name ecs-spot-demo --template-body file://ecs-spot-demo.yml --capabilities CAPABILITY_IAM

CloudFormation スタックはコンテナインスタンスを起動し、それらをデフォルトで development という名前の ECS クラスターに登録します。これは EcsCluster パラメータで変更できます。パラメータの詳細については、README とテンプレートソースを参照してください。

アプリケーションをデプロイすると、デプロイツールによって ECS クラスターが作成されます。こちらが EC2 コンソールのスポットインスタンスです。

デモアプリをデプロイする

スポットクラスターが起動されたら、デモアプリをデプロイすることができます。これらの作業に役立つ Ufo というツールを書き込みました。

  1. Docker イメージを構築します。
  2. ECS タスク定義を登録します。
  3. ECS サービスを登録してデプロイします。
  4. ロードバランサーを作成します。

前提条件として、Docker をインストールしてください。まず、ECR リポジトリを作成して、いくつかの変数を設定します。

ECR_REPO=$(aws ecr create-repository --repository-name demo/sinatra | jq -r '.repository.repositoryUri')
VPC_ID=$(aws ec2 describe-vpcs --filters Name=tag:Name,Values="demo vpc" | jq -r '.Vpcs[].VpcId')

これでデモリポジトリを複製し、ufo を使用してサンプルアプリを ECS にデプロイする準備が整いました。

git clone https://github.com/tongueroo/demo-ufo.git demo
cd demo
ufo init --image $ECR_REPO --vpc-id $VPC_ID
ufo current --service demo-web
ufo ship # deploys to ECS on the Spot Fleet cluster

ECS サービスが実行中です。

次に、Elastic Load Balancing のエンドポイントをコンソールから、または ufo ps で取得してください。

$ ufo ps
Elb: develop-Elb-12LHJWU4TH3Q8-597605736.us-west-2.elb.amazonaws.com
 USD

今、私は curl でテストしています。

$ curl develop-Elb-12LHJWU4TH3Q8-597605736.us-west-2.elb.amazonaws.com
42

アプリケーションは「42」、つまり人生の意義を正常に返します。それでおしまいです! スポットフリートインスタンスを使用して、ECS でアプリケーションを実行しています。

最後の考察

スポットを使用するもう 1 つの利点は、可用性の高い方法で自分のアーキテクチャについて考えられることです。システムは自己修復するように設計される必要があるため、スポットの「制約」は逆に夜間の睡眠を大幅に改善します。

できることなら、あなたがこの記事を読んだことで、スポットインスタンスで ECS を実行する世界の扉を開いてほしいです。それが、BoltOps が自社の生産システムで、そしてお客様のために実行してきた一部システムの中心だからです。私は、今日のセットアップにまだ興奮しています。スポットアーキテクチャに興味がおありの場合、BoltOps までお問い合わせください。

最後のメモ: Auto Scaling グループは複数のインスタンスタイプと購入オプションの実行もサポートします。Jeff は、彼の投稿で、重みをサポートするリリースが今後予定されていると述べました。ECS でスポットを使用すると、さらに合理化される可能性があるので、これは刺激的です。