概要
タスク定義(JSON)で指定できる全てを Docker Compose Yaml 形式で指定できるわけではありません。
そのため、一度 Docker Compose Yaml 形式でタスク定義を作成したあとに、jqコマンドで修正します。
今回は設定したい優先度が(私の中で)高いDependsOnを設定するのが主目的ですが、似たような方法で他の項目も修正可能です。
Docker Compose Yaml形式でのタスク定義作成
version: '3'
services:
app:
image: nginx
ports:
- "80:80"
logging:
driver: awsfirelens
options:
Name: datadog
apiKey: "hogehoge"
dd_service: "app-service"
dd_source: "nginx"
dd_tags: "project:example"
provider: "ecs"
log_router:
image: 906394416424.dkr.ecr.ap-northeast-1.amazonaws.com/aws-for-fluent-bit:latest
logging:
driver: awslogs
options:
awslogs-group: firelens-container
awslogs-region: ap-northeast-1
awslogs-stream-prefix: firelens
awslogs-create-group: "true"
Taskは以前の私の記事を流用してます。
中身そのものに興味がある場合は読んでいただければと思います。
また、Docker Compose Yaml形式でのタスク定義そのものについてはAWS公式を見てください。
ここでは、app
と log_router
に依存関係を設定したい(DependsOn)と思います。
ecs-cli compose --project-name app-task \
-f docker-compose.yml \
--ecs-params "ecs-params.yml" \
create --region ap-northeast-1 \
--launch-type EC2
DependsOn設定
taskDefinitionArn=$(aws ecs list-task-definitions --family-prefix app-task --status ACTIVE --sort DESC --max-items 1 | jq -r '.taskDefinitionArns[0]')
taskDefinition=$(echo ${taskDefinition} | jq -r '.containerDefinitions[] |= if .name == "app" then . + {"dependsOn":[{"containerName":"log_router","condition":"HEALTHY"}]} else . end')
aws ecs deregister-task-definition --task-definition ${taskDefinitionArn}
aws ecs register-task-definition --cli-input-json "${taskDefinition}"
一度作成されたTask情報を出力して、JSON構文を解析し、適切な箇所に dependesOn
設定を埋め込みます。
jqで必要な箇所を特定して埋め込むのは少し慣れが必要です(私は必要でした)。
詳細は下記公式を参照して、機能を駆使してください。
Task定義のJSON構文は下記公式情報を参照してください。
その後、改修したTask情報(JSON)でTask定義を再作成します。
再作成前に元のTask定義は削除(deretister)しておきます。
まとめ
こんな感じで、タスク定義を作成したあとに修正したタスク定義をもう一度作成するという方法で可能です。
タスク定義のリビジョンは2つインクリメントされますが、リビジョンは1万まで増やせるのでたぶん、大丈夫だと思います。
問題は埋め込む箇所がちょっと入り組んでると、jqコマンドを組み立てるのがちょっと難しいというのがあります。
ecs-cli
ツールがバージョンアップすれば対応する設定も増えていくと思います。
ですが、残念ながら現状では記述のし安さや可読性と引き換えに、タスク定義の全ての設定をYamlで記述することはできません。
需要は少ないかもしれないですが、AWSにはアップデートをがんばってもらいたいです。