🐡

ECS タスク定義パラメータとサービス定義パラメータの主要な項目の内容を洗い出してみる。

2025/02/15に公開

この記事について

ECSの様々なパラメータの挙動、意味を調べて今後自分が見返す用にまとめておく。
結構雑なので後から加筆修正するつもり。

タスク定義パラメータとサービス定義パラメータ

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

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

networkMode

  • awsvpc

    • ホストインスタンス用ENIとは別で、コンテナ毎にENIを生成するモード
  • host(非推奨)

    • ホストのENIを使用する方法。同じポートのコンテナを立てれないため負荷分散できない。
  • bridge

    • ホストのENIを使用する方法。
    • Dockerのネットワークと同じ構成でポートマッピングにより同じポートのコンテナを立てることができるため負荷分散が可能。

    ECSのネットワークモードを調べてみた

containerDefinitions

  • entryPoint

  • command

    • dockerfileのCMDとかと同じっぽい。
  • mountPoints

  • linuxParameters

  • initProcessEnabled

  • startTimeout

    • コンテナAがコンテナBのステータスに依存する場合、トリガーとなるステータスまでコンテナBが到達しなかった場合、何秒待つかを決める値。Max120秒。
  • stopTimeout

    • コンテナが正常終了しなかった場合にコンテナが強制終了されるまでの待機時間。
      Max120秒。
  • user

  • logConfiguration

    使用するログドライバーを選択する。Fargateだとfirelensを利用することでawslogsドライバーより多くのSaasやAWSサービスへの同時出力・連携が可能という利点がある。

    • logDriver
      • Fargateだと、awslogs(cloudwatchlogs),splunk|awsfirelens(firelens) が選択できる。(splunkが入っているのは意外)
      • また、Fargateだと外部にサイドカーなどのコンテナをログ出力先として用意する必要がある。
  • firelensConfiguration

    • firelensを使用する場合のログ転送コンテナの設定を行う項目
      • type: fluentdfluentbitから選択する
      • options
        • カスタムconfファイルをどこから取得するかの設定。
        • config-file-value: /fluent-bit/custom.conf などとしてfluent-bitコンテナ内の設定ファイルをfirelensに読み込ませる。
  • privileged

    • コンテナをroot権限で開きつつ、ホスト側rootと同じcapabilitiesの権限を持つことができるdockerの --privileged と同じ機能。
    • Docker内でさらにDockerを起動するような場合に、このような権限が必要となるがかなり権限的に危険になるためそのような必要性が出たとしてもひとまずはcapabilitiesの個別設定で対処できないか考えるべき。
  • workingDirectory

  • readonlyRootFilesystem

  • dockerSecurityOptions

    • Fargateだと無効なステータス
    • SELinuxやAppArmerなどのセキュリティモジュールを設定できる項目。
  • interactive

  • pseudoTerminal

    • dockerコマンドでいう --tty
  • dockerLabels

  • ulimits

    • 以下にあるようなLinuxの機能に関する制限をいろいろ行うための項目

      limits.conf(5) - Linux man page

    • Fargateはこの中でファイルディスクリプタ制限(どれだけファイルを同時に開けるか)のみ設定可能。EC2なら上記 limits.conf にある項目の調整ができる。

  • healthCheck

  • systemControls

    • Linuxカーネルの各種カーネルパラメータが設定できるパラメータ

      • Fargate を含む awsvpc ネットワークモードを使用する場合、systemControls をコンテナ用に設定した場合、タスク内のすべてのコンテナに適用される。
      • 単一タスクの複数コンテナに対して異なる systemControls を設定すると、最後に開始されたコンテナによって、有効になる systemControls が決定するため注意。
    • パラメータのチューニングのために設定をいじることが出来る。

      Linuxカーネルパラメータのチューニング&設計 - Qiita

    • Amazon Aurora PostgreSQL による高速フェイルオーバー

    • nginxのチューニング

      • 同時接続数の上限解放のための設定や、キューの上限設定などnet.*系の設定変更がよくあるとのこと。
    • ただし使える項目は以下のみ

      • "kernel.msgmax" | "kernel.msgmnb" | "kernel.msgmni" | "kernel.sem" | "kernel.shmall" | "kernel.shmmax" | "kernel.shmmni" | "kernel.shm_rmid_forced", and Sysctls that start with "fs.mqueue.*"

        SystemControl - Amazon Elastic Container Service

volumes

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specify-volume-config.html

  • name
    • ここで指定した名前を使って、containerDefinitionsmountPoints.sourceVolumeで参照される。
  • configuredAtLaunch
    • EBS ボリュームをタスクに直接アタッチしたい場合には必須。
  • dockerVolumeConfiguration
    • Docker ボリュームを使用する場合に指定する。
  • efsVolumeConfiguration
    • EFS ボリュームを使用する場合に指定する。

ephemeralStorage

デフォルトの20GBのストレージを超えたい場合に指定する。(最大 200 GiB まで)

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/bind-mounts.html

pidMode

PID namespace共有設定ができる。

  • PID namespaceとは

    PIDはそもそも新しいプロセスが起動するたびにインクリメントされるようになっている。

    しかし、コンテナ内では独立したプロセスIDのインクリメントが行われ、コンテナ毎にプロセスが1から始まるようになっている。この仕組みを実現しているのがPID namespaceである。

    Linux の PID Namespace について - CUBE SUGAR CONTAINER

  • unshareコマンド

    第2回 コンテナの仕組みとLinuxカーネルのコンテナ機能[1]名前空間とは? | gihyo.jp

  • PID namespace共有の何が嬉しいか

    • 通常、コンテナ間を横断して操作するようなことはあまりないが、コンテナを横断してトレース情報収集やモニタリングなどをする際にはプロセスIDが共通のものであったほうが良い。

      FargateでPID namespace共有を試す - Qiita

    • 例えば、straceコンテナを立ててそのコンテナからトレース監視を行うといった際に、全てのタスク内プロセスのシステムコールにアクセスできるため横断的監視目的には最適。

Fargate では、有効な値は task のみです。

task が指定されている場合、指定したタスク内のすべてのコンテナは同じプロセス名前空間を共有します。

値が指定されていない場合、デフォルトは各コンテナのプライベート名前空間です。

ipcMode

IPC Namespaceを使ったプロセス間通信を有効化できる。

task を指定した場合、同じタスク内のコンテナは同じNamespaceを共有する。

systemControls の設定をしている場合、IPC 名前空間に関連する項目がタスク内のすべてのコンテナに適用される。といった挙動をする。

proxyConfiguration

App Mesh用の設定項目だが、調べたらサービス終了するらしい。今後はECS Service Connectを代わりに使うのが良いとのこと。

https://aws.amazon.com/jp/blogs/news/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect/

どちらもサービスメッシュと呼ばれるものでマイクロサービスで使用される。

  • サービスメッシュとは: マイクロサービス間通信を仲介(プロキシ)して、通信の制御 / オブザーバビリティ確保 などを行ってくれる。アプリケーションレイヤと分離してこのようなマイクロサービスに必要な機能を提供してくれる。

inferenceAccelerators

機械学習向けの設定

placementConstraints

条件と一致するインスタンスにのみタスクを配置するように設定できる項目。

以下のようにすると、t3.large のインスタンスタイプを持つEC2インスタンスのみにタスクを配置することになる。

"placementConstraints": [
  {
    "type": "memberOf",
    "expression": "attribute:ecs.instance-type == t3.large"
  }
]

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-placement-constraints.html

Discussion