amazon elastic container service

2023-11-20 09:33
2023-11-26 09:21

ECS の基本的な概念

Docker によるコンテナ実行の流れ

コンテナ とはソフトウェアアプリケーションの実行に必要なものをすべて保持する標準化されたソフトウェア開発の単位となる概念。具体的にはランタイムやエンジン、依存モジュール、アプリケーションをすべてまとめたものとなる。

コンテナは コンテナイメージ と呼ばれる読み取り専用テンプレートから作成される。コンテナイメージは一般的には Dockerfile から構築される。

Docker によるコンテナ実行の基礎的な流れは下記のようなざっくりと下記のような形となる:

  1. コンテナ実行を行う環境にログインする
  2. docker run コマンドにより Docker Engine にコンテナ実行を指示する
  3. Docker Engine はレジストリよりコンテナイメージを取得する
  4. コンテナイメージを利用し、コンテナの実行を行う

実運用に際して多数のコンテナ実行を行う場合、個別の実行環境を整備したり、各環境にログインして docker run コマンドを実行したりすることは厳しい。ECSEKS は上記のようなコンテナ管理(オーケストレーション)を行う際に便利なサービスとなる。

仮想マシンとコンテナの違い

see also: コンテナと VM の比較 - デプロイテクノロジーの違い - AWS, コンテナーと仮想マシンの比較 | Atlassian

コンテナ は OS を仮想化するのに対し、仮想マシン は物理インフラストラクチャを仮想化する技術となる。

  • コンテナ
    • アプリケーションコード、ライブラリ、実行環境を構成する他の依存関係
  • 仮想マシン
    • 物理マシンのデジタルレプリカ

AWS Cloud 上でのコンテナ実行

2020 年現在、コンテナ管理・実行を AWS 上で行うにあたり下記の選択肢がある

  • コントロールプレーン(オーケストレータ): 多数のコンテナホスト(クラスタ)を管理するシステム
    • Amazon EKS: Kubenetes をベースとしたコンテナのオーケストレーションをクラウド上で実現するサービス
    • Amazon ECS: AWS 独自のコンテナオーケストレーションサービス
  • データプレーン(実行環境): EKS, ECS で利用可能なコンテナそのものを稼働させる環境
    • Amazon EC2: インスタンスタイプ、インスタンス数によるキャパシティ管理
    • AWS Fargate: 従量制料金計算エンジン
    • オンプレミスや VM などの外部インスタンス: AWS ECS Anywhere を用いることによりこれらの環境も ECS クラスタに登録可能

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

ECS Tutorial

ECS on Fargate Tutorial

まずはじめに実行したいコンテナのコンテナイメージを作成する。一例として以下のような 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 という出力が得られていることを確認できるだろう。

参考になる資料

Copyright © 53ningen.com