Проблема при создании AWS определения задачи fargate json - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь создать файл json (определение задачи для AWS fargate), используя jq из моего конвейера gitlab.

Я хочу добиться этой конфигурации, создав блок с помощью logConfiguration и "logDriver", см. справа ниже:

"logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "awslogs-wordpress",
                    "awslogs-region": "us-west-2",
                    "awslogs-stream-prefix": "awslogs-example"
                }
            },

1) У меня есть мой исходный файл json ниже, где я ввожу некоторые значения с помощью команд в точке # 2:

{
  "family": "",
  "networkMode": "awsvpc",
  "executionRoleArn": "arn:aws:iam::XXXXXXXXX:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "name": "",
      "image": ":",
      "portMappings": [
        {
          "containerPort": 3091,
          "hostPort": 3091,
          "protocol": "tcp"
        }
      ],
      "essential": true
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "256",
  "memory": "512"
}

2) Когда я делаю эти команды с jq на моем конвейере gitlab, я добиваюсь части того, что хочу, это нормально, и я получаю json в точке # 2.A, но Я понял, что выводит 3 раза "LogDriver «, что неверно:

jq '.containerDefinitions[0].logConfiguration.options."awslogs-group"="'my_grup'"' tmp_task > ejm.json &&
jq '.containerDefinitions[0].logConfiguration.options."awslogs-region"="'eu-west-2'"' ejm.json > tmp_task &&
jq '.containerDefinitions[0].logConfiguration.options."awslogs-stream-prefix"="'ecsx'"' tmp_task > ejm.json

2.A)

{
  "family": "my_branch",
  "networkMode": "awsvpc",
  "executionRoleArn": "arn:aws:iam::235907124541:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "name": "",
      "image": ":",
      "portMappings": [
        {
          "containerPort": 3091,
          "hostPort": 3091,
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "logConfiguration": {
        "options": {
          "awslogs-group": "my_grup",
          "awslogs-region": "eu-west-2",
          "awslogs-stream-prefix": "ecsx"
        },
        "logDriver": "awslogs"
      },
      "logDriver": "awslogs"
    },
    {
      "logConfiguration": {
        "logDriver": "awslogs"
      }
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "256",
  "memory": "512"
}

Как видно из пункта 2.А выше, в конфигурации« logDriver »написано несколько раз, и когда определение задачи создается в AWS fargate, журналы недоступны в CloudWatch, поскольку он не выбирает конфигурацию «logDriver», да, в CloudWatch есть группа журналов, но ни stdout, ни stderr не регистрируются из контейнер, потому что "logDriver" не является правильно введено в задачу json.

ПРАВО JSON ОПРЕДЕЛЕНИЕ ЗАДАЧ ДОЛЖНО БЫТЬ ЕДИНСТВЕННЫМ В ССЫЛКЕ НИЖЕ.

https://docs.aws.amazon.com/AmazonECS/latest/userguide/using_awslogs.html

Потенциальное решение состоит в том, чтобы понять, как правильно записать в файл json, или если у кого-то есть лучшее представление о том, как поместить эту задачу json в конвейер.

Надеемся получить некоторые идеи от вас, и большое спасибо в продвинутом.

1 Ответ

0 голосов
/ 02 февраля 2020

Вы можете выполнить sh задачу только одним вызовом jq и без использования поддержки оболочки для интерполяции строк, которая подвержена ошибкам. Например:

jq --arg group my_grup --arg region eu-west-2 --arg prefix ecsx '
  .containerDefinitions[0].logConfiguration.options
    = {"awslogs-group": $group,
       "awslog-region": $region,
       "awslogs-stream-prefix": $prefix}' input.json

Аналогичным образом можно добавить .logDriver (в одном вызове jq).

...