ECSを少し触ってみた

はじめに

Docker の使い方が何となくわかって慣れてきたので AWS の ECS (Amazon EC2 Container Service) を少し触ってみました。

ECR (Amazon EC2 Container Registry) への Docker イメージのプッシュ、

ECS でのタスク定義作成、サービス作成、

Fargate でのタスク実行、

スケジュールでのタスク実行、

ClowdWatch Logs での実行ログの確認あたりまで触ってみました。

ECR

ECR (Amazon EC2 Container Registry) は ECS で使う Docker イメージを登録することができます。

ECS では Docker Hub などに登録したイメージも使えるのでプライベートなイメージを使う必要がある場合などに ECR を利用することになると思います。

ECR を使うには docker と aws-cli をインストールし、ECRの権限を準備しておく必要があります。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/ecr_managed_policies.html

AWS コンソール上から ECR にアクセスするにはまず ECS の画面を開きます。すると下の方に Amazon ECR があります。

AWS コンソール上からイメージのプッシュに使うコマンドを確認することができます。

かなり長いコマンドなのでここからコピーして使うのがいいと思います。

ECS 覚え書き

ECS (Amazon EC2 Container Service) は EC2 上で Docker コンテナを実行するサービスです。 Docker を使うことでアプリケーションをパッケージングしてデプロイが簡単になりますが、 Web サービスなどを運用する場合この他にも色々な管理が必要になるのでそのあたりを ECS でカバーしているのかなと思います。 サービスのオートスケーリング、ポートマッピングロードバランサーへのアタッチなどができるようです。

クラスタ

クラスターは Docker コンテナのタスクを実行する EC2 インスタンスのまとまりのような感じでしょうか。

クラスターテンプレートを選択して作成して試してみました。

タスクのスケジューリングを試す場合は EC2 を使った構成にする必要があるようです。

クラスターテンプレートから作成すると CloudFormation で色々なリソースが作成されていて CloudFormation の画面から作成されたリソースや使われたテンプレートを確認することができました。

クラスターを削除するとこの CloudFormation スタックも削除されるようになってるようです。

タスク定義

タスク定義では Docker イメージやコマンド、メモリ制限、ポートマッピング、ログの設定などを行いました。

イメージは ECR や Docker Hub などのものを自由に設定できるようです。

Docker Hub の場合は例えば下のような URI で設定できました。

registry.hub.docker.com/library/ubuntu:16.04

ECR の場合はアカウントIDを含む URIAWS コンソールから調べて設定しました。

コマンド設定は Dockerfile の CMD にあたる設定になると思います。例えば下のような感じで試せました。

echo, hello world

ログの設定もタスク定義のところで行いました。

Auto-configure CloudWatch Logs のチェックボックスを選択しておくと 標準出力に出したログを CloudWatch Logs から確認することができました。

タスク

タスク定義に沿って Docker コンテナで実行される仕事がタスクのような感じだと思います。 タスクの起動にはタスクの数や実行クラスターを指定します。

サービス

サービスはタスクのまとまりを管理するためのモデルのような感じかなと思います。 実行するタスク定義、オートスケーリング、ロードバランサーの設定を行います。 サービスは必ず必要なわけではなく、ただのバッチ処理などの場合はタスクを起動するだけで実行できました。 Web サーバーを動かす場合などはサービスが必要だと思います。

Fargate

EC2 上でタスクを実行するタイプの他に、Fargate 実行タイプというものがあります。

Fargate では実行する EC2インスタンスを用意することなくタスクを実行することができて簡単に使うことができるようでした。

ただまだ使えるリージョンが限られていて現在 us-east-1 リージョンのみ使えるようです。

Fargate を使用した Amazon ECS の使用開始 - Amazon Elastic Container Service

スケジュール起動のタスク

ECS では cron の用にスケジュールで定期実行するタスクを設定することができます。

cron で何か定期実行しようとしてサーバー一台で動かすと、もしそのサーバーがトラブルで落ちてしまった場合に実行されなくなってしまいます。 分散して cron のようなことをするアプリケーションもあると思いますが AWS 使う場合は ECS のこの機能が使えると便利そうだと思います。

スケジュールは cron に似た記法で、毎分の場合は下のように設定するようです。

cron(* * * * ? *)

cron(* * * * * *) だとダメのようです。 月の中の日の指定と週の中の日の指定が被ってしまうからどちらかを ? で指定する必要があるみたいです。

詳しい書き方は下にありました。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/scheduling_tasks.html

最初に Fargate で試していたんですがこの機能はどうも EC2 タイプでしか使えないようです。

ログを見ると毎分の指定で40秒ぐらいに実行されているようでした。

正確に0秒に実行する必要がある場合は早めに起動して sleep 入れるなどする必要があるかもしれません。

参考

Fargate を使用した Amazon ECS の使用開始 - Amazon Elastic Container Service

Amazon EC2 Container Service(ECS)のデータモデルについて整理した | Developers.IO

感想

少し前に ECS のドキュメントを読んだときはまず Docker から全然わからない状態だったので触るの気になりませんでしたが、 Docker に少しなれた状態だとチュートリアルの内容を試したり、タスクを色々実行してみたりがあまり抵抗なくできました。 ECS の機能を色々と触ってみて実運用時のやり方なども少しイメージすることができました。 Docker を実行する環境として EKS なども出てくるようなので Kubernetes もそのうち触ってみたいです。