Amazon Elastic Container Service

出典:AWS Blackbelt

ECSの主要要素

  • タスク定義
    • コンテナ定義(イメージの場所等)
    • 要求CPU&メモリ
    • タスクに割り当てるIAMロール
    • ネットワークモード …など
  • クラスタ
    • 実行環境の境界
    • IAM権限の境界(クラスタに対する操作)
    • スケジュールされたタスクの実行を設定可能
  • タスク
    • タスク定義に基づき起動されるコンテナ群
    • Task内コンテナは同一ホスト上で実行される
  • サービス
    • タスク実行コピー数を定義
    • 起動後、タスク実行コピー数を維持
    • ELBと連携
    • 起動タイプ(EC2,Fargate)を設定

コンテナの実行環境

EC2起動タイプ

  • ECSコンテナエージェントを実行しクラスターに登録されているEC2インスタンス
  • EC2起動タイプを使用して実行されたタスクはアクティブな紺天和インスタンスに配置される
  • Amazon ECS コンテナインスタンスIAMロールが設定されている必要がある
  • 登録の流れ
    • ECSクラスタを作成
    • Amazon ECS-optimized AMIからEC2インスタンスを起動
    • コンテナインスタンスIAMロールを割り当て
    • /etc/ecs/ecs.configECS_CLUSTER=XXXにクラスタ名を記載(ユーザーデータなどで指定)
    • 起動後、EC2上のECSコンテナエージェントが起動し、インスタンスをクラスターに登録される
  • Amazon ECS-optimized AMI
    • コンテナインスタンスに求められている要件/推奨事項を満たしたAMI
      • Dockerデーモン
      • ECSコンテナエージェントetc…
    • 複数のLinux,Windows,GPUなどのAMIを用意
  • ECSコンテナエージェント
    • ECSコントロールプレーンと通信し、コンテナインスタンスの管理タスクの実行/停止を行う
    • Amazon ECS-optimized AMI以外は十進でいんすートールが必要
    • このエージェント自体もコンテナで実行される
  • コンテナインスタンスのドレイン(削除)
    • システム更新
    • エージェント/Dockerデーモンの更新
    • AutoScalingのスケールインなど
  • コンテナインスタンスをDRAINNINGに設定
    • 新規タスクは配置されない
    • PENDING状態のサービスタスクは即時停止
    • RUNNING状態のサービスタスクは差0ビスのデプロイ設定に従って代替されていく

Fargate

  • AWSマネージド
  • コンテナネイティブ
  • AWSサービスとの連携
  • タスク割り当てCPUとメモリ設定
    • 50パターンのCPU/メモリの組み合わせから選択

タスク定義の詳細

  • 1~10個のコンテナを定義するJSONファイル
  • 使用するコンテナ、起動タイプ、コンテナの実行方法などのパラメータを設定
  • 実行時はタスク定義をインスタンス化したタスクを実行する
  • タスク定義はイミュータブル、変更する場合は新しいリビジョンを作成する
    • リビジョンを変更しても実行中のタスクは更新されず、サービスを更新する必要がある

代表的なパラメータ

タスク定義
family 必須 タスク定義の名前、ファミリーとリビジョン番号で1つのタスク定義と特定される
containerDefininations 必須 コンテナランタイムに渡される定義(name,image,memory/memoryReservation)
taskRoleArn オプション コンテナが利用するIAMロールを指定
executionRoleArn オプション ECSコンテナエージェントが利用するIAMロールを指定
networkMode オプション Dockerのネットワークモード(none
volumes オプション Dockerボリューム,バインドマウント,EFSマウント
requireCompatibilities オプション 起動タイプ(EC2/Fargate)
cpu/memory オプション タスクサイズ※Fargate起動タイプでは必須で決められた値のみ可能
containerDefininations
logConfiguration ログドライバの指定(logDriver[awslogsなど])、送信設定(options,secretOptions)
environment 環境変数を設定、平文
secrets 機密データを含む環境変数を設定する、Secrets Managerを参照可能※要IAMロール
dependsOn 事前処理の完了待ちや実行順序の制御で利用(START
  • awslogsはSTDOUT/STDERRをCloudWatchLogsに出力される
  • AWS Secrets Manager シークレット
    • EC2起動タイプのみで利用可能だったが現在はFargateでも利用可能(Fargate1.4.0以降)
    • JSONキー、バージョンラベルorバージョンIDで指定可能(ARNで指定)
  • AWS Systems Manager パラメータストア パラメータ
    • 同じリージョンの場合は名前のみで可能、別リージョンは完全なARNが必要

各種パーミッション

  • クラスタパーミッション
    • 誰がクラスタ内でタスク起動/参照できるかを制御
  • コンテナインスタンスロール
    • コンテナインスタンスのECSのAPIへのアクセスを許可する
  • タスクロール
    • アプリケーションコンテナがAWSに安全にアクセスすることを許可する
  • ハウスキーピング
    • タスク実行ロール
      • プライベートレジストリのイメージを取得
      • CloudWatchLogsへの書き込み
    • ECSサービスにリンクされたロール
      • ENIの作成
      • ELBへのターゲット登録/解除

コンテナのネットワークモード

  • none
    • 外部と接続しない
  • bridge ※EC2起動タイプのデフォルト
    • Docker組み込みの仮想ネットワークを使用して外部と通信(コンテナリンク利用可)
  • host
    • Docker組み込みの仮想ネットワークをバイパスし、コンテナポートがホストEC2インスタンスのNICに直接マッピング
  • awsvpc ※Fargate起動タイプの前提
    • ECS管理下のENIたタスクにアタッチ
    • セキュリティグループをENIに設定できる
    • VPC Flow Logsでモニタリング可能
    • タスクごとに1ENIをEC2にアタッチしているので、リソースに空きがあってもENI数上限の影響を受ける
      • ENIトランキング(ENI密度の高いコンテナインスタンスを利用できる)

データボリュームの使用

  • Dockerボリューム
    • EC2起動タイプのみ
    • 3rd Partyボリュームドライバの利用
    • タスク間での共有や明示的なライフサイクル管理
  • バインドマウント
    • EC2 / Fargate 起動タイプで利用可能
    • ホストマシン上のファイル/ディレクトリをコンテナにマウント
    • コンテナ領域はタスク停止後3時間後に削除
    • ホストのディレクトリの場合残るが管理が別途必要
  • EFSボリューム
    • コンテナインスタンスをまたがって共有が可能
    • NFSマウントのため性能面での考慮が別途必要

コンテナの実行方法

  • タスク
    • タスク定義にしたがって実行される
    • バッチジョブなどで利用
  • サービス
    • 指定した数のタスクを維持する
    • ELBとの連携やAutoScaling
    • Webアプリケーションで利用

タスクのライフサイクル

  1. Provisioning ※ENIプロビジョン
  2. Pending
  3. Activating ※ELBターゲットグループ登録
  4. Running
  5. Deactivating ※ELBターゲットグループ解除
  6. Stopping
  7. Deprovisioning ※ENIデタッチ
  8. Stopped

タスクの配置

  • タスク配置の制約事項
    • タスク配置中に考慮されるルール
    • AZやインスタンスタイプに基づいて制約をかけられる
  • タスクの配置戦略
    • タスク配置/終了時にインスタンスを選択するアルゴリズム
    • binpack|random|spreadの2つの戦略をサポート

サービススケジューラ戦略

  • REPLICA
    • クラスタ前提で必要なタスクを維持
    • デフォルトではAZ間で分散
  • DAEMON
    • コンテナインスタンス毎に1つのタスクをデプロイ
    • ロギングやモニタリングなどの共通機能で実行する場合に利用
    • Fargate起動タイプでは利用不可

ECS クラスターキャパシティープロバイダー

  • タスクの配置先を決定するための新しい方法
  • タスク配置先の柔軟なコントロールが可能
    • 例)60%はオンデマンドで残りはスポットなど
  • EC2/Fargateの双方で利用可能
    • EC2の場合は作成済みのEC2 ASGにキャパシティプロバイダーを紐づける
    • Fargateの場合は自動的に用意される(既存のクラスタへにはCLIで追加可能)

サービスのAuto Scaling

サービスの必要タスク数(desiredCount)を自動的に増減させる

  • ターゲット追跡スケーリングポリシー
    • 指定したメトリクスがターゲットの値に近づくように自動的に調整
  • ステップスケーリングポリシー
    • アラームをトリガーに調整池に基づいて増減(カスタマイズが必要な場合利用)
  • スケジュールに基づくスケーリング
    • 日付と時刻に基づいてタスク数を増減