0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Docker Compose Yaml形式のECSタスク定義で、DependsOnを利用する方法

Posted at

概要

タスク定義(JSON)で指定できる全てを Docker Compose Yaml 形式で指定できるわけではありません。
そのため、一度 Docker Compose Yaml 形式でタスク定義を作成したあとに、jqコマンドで修正します。
今回は設定したい優先度が(私の中で)高いDependsOnを設定するのが主目的ですが、似たような方法で他の項目も修正可能です。

Docker Compose Yaml形式でのタスク定義作成

docker-compose.yml
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公式を見てください。

ここでは、applog_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にはアップデートをがんばってもらいたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?