ECS タスク定義パラメータとサービス定義パラメータの主要な項目の内容を洗い出してみる。
この記事について
ECSの様々なパラメータの挙動、意味を調べて今後自分が見返す用にまとめておく。
結構雑なので後から加筆修正するつもり。
タスク定義パラメータとサービス定義パラメータ
networkMode
-
awsvpc
- ホストインスタンス用ENIとは別で、コンテナ毎にENIを生成するモード
-
host(非推奨)
- ホストのENIを使用する方法。同じポートのコンテナを立てれないため負荷分散できない。
-
bridge
- ホストのENIを使用する方法。
- Dockerのネットワークと同じ構成でポートマッピングにより同じポートのコンテナを立てることができるため負荷分散が可能。
containerDefinitions
-
entryPoint
-
コマンドの上書きができそう。(dockerと同じ)
-
-
command
- dockerfileのCMDとかと同じっぽい。
-
mountPoints
-
linuxParameters
-
capabilities
-
root権限をさらに機能ごとに分けたような仕組み。
-
Linuxの機能の一つだがコンテナの権限管理にも影響がある。詳しくは別途まとめる。
-
Fargateでは、
SYS_PTRACE
というcapabilitiesしか変更できない。(トレース用の権限調整のため)それ以外の値はデフォルト値のままとなっている。ECS Fargate で strace してみる - kashinoki38 blog
AWS Fargate のプラットフォームバージョン 1.4.0 をリリース | Amazon Web Services
-
-
capabilities
-
initProcessEnabled
-
initプロセスをコンテナ内で起動してゾンビプロセスが残らないようにできる。とりあえず設定しておくと良さそう
-
-
startTimeout
- コンテナAがコンテナBのステータスに依存する場合、トリガーとなるステータスまでコンテナBが到達しなかった場合、何秒待つかを決める値。Max120秒。
-
stopTimeout
- コンテナが正常終了しなかった場合にコンテナが強制終了されるまでの待機時間。
Max120秒。
- コンテナが正常終了しなかった場合にコンテナが強制終了されるまでの待機時間。
-
user
-
docker run の
—user
オプションに相当するということで、USER命令を上書きできる。
-
-
logConfiguration
使用するログドライバーを選択する。Fargateだとfirelensを利用することでawslogsドライバーより多くのSaasやAWSサービスへの同時出力・連携が可能という利点がある。
-
logDriver
- Fargateだと、
awslogs(cloudwatchlogs),splunk|awsfirelens(firelens)
が選択できる。(splunkが入っているのは意外) - また、Fargateだと外部にサイドカーなどのコンテナをログ出力先として用意する必要がある。
- Fargateだと、
-
logDriver
-
firelensConfiguration
- firelensを使用する場合のログ転送コンテナの設定を行う項目
- type:
fluentd
かfluentbit
から選択する - options
- カスタムconfファイルをどこから取得するかの設定。
- config-file-value: /fluent-bit/custom.conf などとしてfluent-bitコンテナ内の設定ファイルをfirelensに読み込ませる。
- type:
- firelensを使用する場合のログ転送コンテナの設定を行う項目
-
privileged
- コンテナをroot権限で開きつつ、ホスト側rootと同じcapabilitiesの権限を持つことができるdockerの
--privileged
と同じ機能。 - Docker内でさらにDockerを起動するような場合に、このような権限が必要となるがかなり権限的に危険になるためそのような必要性が出たとしてもひとまずはcapabilitiesの個別設定で対処できないか考えるべき。
- コンテナをroot権限で開きつつ、ホスト側rootと同じcapabilitiesの権限を持つことができるdockerの
-
workingDirectory
-
readonlyRootFilesystem
-
dockerSecurityOptions
- Fargateだと無効なステータス
- SELinuxやAppArmerなどのセキュリティモジュールを設定できる項目。
-
interactive
-
pseudoTerminal
- dockerコマンドでいう
--tty
- dockerコマンドでいう
-
dockerLabels
-
ulimits
-
以下にあるようなLinuxの機能に関する制限をいろいろ行うための項目
-
Fargateはこの中でファイルディスクリプタ制限(どれだけファイルを同時に開けるか)のみ設定可能。EC2なら上記
limits.conf
にある項目の調整ができる。
-
-
healthCheck
-
コンテナに対してヘルスチェックを行う用のコマンドを設定できる項目。
$ CMD-SHELL, curl -f http://localhost/ || exit 1
-
ECSエージェントで正常状態かどうかのモニタリングとレポートを行うにはこれを設定するしかない。
コンテナのヘルスチェックを使用して Amazon ECS タスク状態を判定する - Amazon Elastic Container Service
-
-
systemControls
-
Linuxカーネルの各種カーネルパラメータが設定できるパラメータ
- Fargate を含む awsvpc ネットワークモードを使用する場合、systemControls をコンテナ用に設定した場合、タスク内のすべてのコンテナに適用される。
- 単一タスクの複数コンテナに対して異なる systemControls を設定すると、最後に開始されたコンテナによって、有効になる systemControls が決定するため注意。
-
パラメータのチューニングのために設定をいじることが出来る。
-
Amazon Aurora PostgreSQL による高速フェイルオーバー
-
TCP接続のキープアライブを短くすることで素早く切断して新しいエンドポイントに切り返すことが出来るようになったりする。
-
-
nginxのチューニング
- 同時接続数の上限解放のための設定や、キューの上限設定などnet.*系の設定変更がよくあるとのこと。
-
ただし使える項目は以下のみ
-
"kernel.msgmax" | "kernel.msgmnb" | "kernel.msgmni" | "kernel.sem" | "kernel.shmall" | "kernel.shmmax" | "kernel.shmmni" | "kernel.shm_rmid_forced"
, andSysctls
that start with"fs.mqueue.*"
-
-
volumes
- name
- ここで指定した名前を使って、containerDefinitionsのmountPoints.sourceVolumeで参照される。
- configuredAtLaunch
- EBS ボリュームをタスクに直接アタッチしたい場合には必須。
- dockerVolumeConfiguration
- Docker ボリュームを使用する場合に指定する。
- efsVolumeConfiguration
- EFS ボリュームを使用する場合に指定する。
ephemeralStorage
デフォルトの20GBのストレージを超えたい場合に指定する。(最大 200 GiB まで)
pidMode
PID namespace共有設定ができる。
-
PID namespaceとは
PIDはそもそも新しいプロセスが起動するたびにインクリメントされるようになっている。
しかし、コンテナ内では独立したプロセスIDのインクリメントが行われ、コンテナ毎にプロセスが1から始まるようになっている。この仕組みを実現しているのがPID namespaceである。
-
unshareコマンド
-
PID namespace共有の何が嬉しいか
-
通常、コンテナ間を横断して操作するようなことはあまりないが、コンテナを横断してトレース情報収集やモニタリングなどをする際にはプロセスIDが共通のものであったほうが良い。
-
例えば、straceコンテナを立ててそのコンテナからトレース監視を行うといった際に、全てのタスク内プロセスのシステムコールにアクセスできるため横断的監視目的には最適。
-
Fargate では、有効な値は
task
のみです。
task
が指定されている場合、指定したタスク内のすべてのコンテナは同じプロセス名前空間を共有します。
値が指定されていない場合、デフォルトは各コンテナのプライベート名前空間です。
ipcMode
IPC Namespaceを使ったプロセス間通信を有効化できる。
task
を指定した場合、同じタスク内のコンテナは同じNamespaceを共有する。
systemControls
の設定をしている場合、IPC 名前空間に関連する項目がタスク内のすべてのコンテナに適用される。といった挙動をする。
proxyConfiguration
App Mesh用の設定項目だが、調べたらサービス終了するらしい。今後はECS Service Connectを代わりに使うのが良いとのこと。
どちらもサービスメッシュと呼ばれるものでマイクロサービスで使用される。
- サービスメッシュとは: マイクロサービス間通信を仲介(プロキシ)して、通信の制御 / オブザーバビリティ確保 などを行ってくれる。アプリケーションレイヤと分離してこのようなマイクロサービスに必要な機能を提供してくれる。
inferenceAccelerators
機械学習向けの設定
placementConstraints
条件と一致するインスタンスにのみタスクを配置するように設定できる項目。
以下のようにすると、t3.large
のインスタンスタイプを持つEC2インスタンスのみにタスクを配置することになる。
"placementConstraints": [
{
"type": "memberOf",
"expression": "attribute:ecs.instance-type == t3.large"
}
]
Discussion