コンテナ とはソフトウェアアプリケーションの実行に必要なものをすべて保持する標準化されたソフトウェア開発の単位となる概念。具体的にはランタイムやエンジン、依存モジュール、アプリケーションをすべてまとめたものとなる。
コンテナは コンテナイメージ と呼ばれる読み取り専用テンプレートから作成される。コンテナイメージは一般的には Dockerfile から構築される。
Docker によるコンテナ実行の基礎的な流れは下記のようなざっくりと下記のような形となる:
- コンテナ実行を行う環境にログインする
docker run
コマンドにより Docker Engine にコンテナ実行を指示する
- Docker Engine はレジストリよりコンテナイメージを取得する
- コンテナイメージを利用し、コンテナの実行を行う
実運用に際して多数のコンテナ実行を行う場合、個別の実行環境を整備したり、各環境にログインして docker run
コマンドを実行したりすることは厳しい。ECS や EKS は上記のようなコンテナ管理(オーケストレーション)を行う際に便利なサービスとなる。
see also: コンテナと VM の比較 - デプロイテクノロジーの違い - AWS, コンテナーと仮想マシンの比較 | Atlassian
コンテナ は OS を仮想化するのに対し、仮想マシン は物理インフラストラクチャを仮想化する技術となる。
- コンテナ
- アプリケーションコード、ライブラリ、実行環境を構成する他の依存関係
- 仮想マシン
2020 年現在、コンテナ管理・実行を AWS 上で行うにあたり下記の選択肢がある
- コントロールプレーン(オーケストレータ): 多数のコンテナホスト(クラスタ)を管理するシステム
- Amazon EKS: Kubenetes をベースとしたコンテナのオーケストレーションをクラウド上で実現するサービス
- Amazon ECS: AWS 独自のコンテナオーケストレーションサービス
- データプレーン(実行環境): EKS, ECS で利用可能なコンテナそのものを稼働させる環境
- Amazon EC2: インスタンスタイプ、インスタンス数によるキャパシティ管理
- AWS Fargate: 従量制料金計算エンジン
- オンプレミスや VM などの外部インスタンス: AWS ECS Anywhere を用いることによりこれらの環境も ECS クラスタに登録可能
see also: Amazon Elastic Container Service とは - Amazon Elastic Container Service
- クラスタ: ECS の管理対象であるコンテナホストの集合
- コンテナインスタンス: コンテナの実行環境としてクラスタに登録されている EC2 インスタンス
- 具体的には ECS コンテナエージェント(ecs-agent)、Docker デーモンなどが動作しており ECS クラスタに登録されている EC2 インスタンスのことを指す
- 上記の必要な要素が入った ECS-optimized AMI が Amazon Linux, Amazon Linux 2, Windows など複数の環境向けに用意されており便利
- タスク定義: アプリケーションのブループリントであり下記のような内容を指定できる
- タスクの各コンテナで使用する Docker イメージ
- 各コンテナで使用する CPU とメモリ
- 起動タイプ(Fargate, EC2, External)
- ネットワーキングモード
- ログ記録設定
- コンテナ終了/失敗時の処理
- コンテナ開始時の実行コマンド
- コンテナが使用するデータボリューム
- タスクが使用する IAM ロール
- タスク: タスク定義をもとに実際に1つ以上のコンテナを実行したもの
- コンテナエージェント: ECS クラスター内の各コンテナインスタンス上で実行され、現在実行中のタスクとリソース使用率に関する情報を ECS に送信したり、タスクの開始や停止を行う役割を持つ(ecs-agent)
- サービス: 複数のタスクを束ねる概念で下記のような設定が可能
- タスク実行コピー数
- タスク実行コピー数を維持するか否か
- 起動タイプ
- ELB との連携
AWS 上でのコンテナ実行環境の選択肢は EC2 と Fargate の 2 つがありそれぞれの違いは以下のような形となる
- EC2: アプリケーションコンテナ、コンテナインスタンス、エージェント設定、ホストOSやライブラリの設定をすべて実施する必要がある
- Fargate: アプリケーションコンテナだけを指定すれば利用可能であるが、ネットワークモードが awsvpc モード固定となり、データボリュームも Fargate タスクストレージか EFS ボリュームのみ選択できる
see also: [AWS Black Belt Online Seminar] CON202 ECS Fargate入門 - YouTube
まずはじめに実行したいコンテナのコンテナイメージを作成する。一例として以下のような Dockerfile を作成する。
FROM amazonlinux
CMD ["echo", "hello"]
下記のようなコマンドでイメージのビルドとテストを行う。動作確認できたら ECR にイメージをプッシュする。
$ docker build -t hello .
$ docker run -it hello # -it: interactive, tty
hello
ECS ではアプリケーション実行に必要な 1 つ以上のコンテナ実行のことをタスクとよび、タスクを走らせるためには事前にタスク定義を行う必要がある。その際に下記のようにタスクとして走るコンテナ自体が利用する IAM ロールおよび、タスクが稼働するコンテナインスタンスが利用する IAM ロールを事前に定義する必要がある。詳細は Amazon ECS タスク実行IAM ロール を参照。
- タスクロール: コンテナが利用する IAM ロールで、アプリケーションから AWS API を操作する場合、それに必要な権限をアタッチする
- タスク実行ロール: コンテナエージェントが利用する IAM ロールであり、ECR からイメージをプルする場合はそれに必要な権限をアタッチし、awslogs ログドライバーを利用している場合は CloudWatch Logs にログを書き込む権限をアタッチする
上記の必要な IAM ロールを作成したらクラスターを作成し、ECR にプッシュしたコンテナイメージを指定してタスク定義する。作成したタスク定義をクラスター上で稼働するよう指定しタスク実行するとコンテナを ECS 上で稼働させることができる。実行が完了したのち CloudWatch ログに出力されるログをみると hello という出力が得られていることを確認できるだろう。