【问题标题】:Issue when creating AWS fargate task definition json创建 AWS fargate 任务定义 json 时的问题
【发布时间】:2020-02-02 11:04:47
【问题描述】:

我正在尝试使用我的 gitlab 管道中的 jq 创建一个 json 文件(AWS fargate 的任务定义)。

我想用“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) 当我在我的 gitlab 管道上使用 jq 执行这些命令时,我实现了我想要的部分,看起来很好,并且我在点 #2.A 上得到了 json,但是 我意识到它输出了 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.A 点所见,配置“logDriver”被写入了几次,当在 AWS fargate 中创建任务定义时,CloudWatch 中没有可用的日志,因为它没有选择“logDriver” " 配置,是的,CloudWatch 中有一个日志组,但是由于 json 任务中没有正确引入“logDriver”,因此既没有从容器中捕获 stdout 也没有捕获 stderr。

正确的 JSON 任务定义应该是下面链接中的那个。

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

潜在的解决方案是了解如何正确写入 json 文件,或者是否有人对如何将此 json 任务放入管道有更好的了解。

期待从您那里得到一些想法,非常感谢您。

【问题讨论】:

  • 这是 aws 问题还是 jq 问题?
  • @oguzismail 可能两者兼而有之,因为如果我使用 jq 创建此 json 任务的方法错误,AWS 上的经验可以建议更方便的方法来完成此任务。这有意义吗?,干杯。
  • 但是如果有人在此之前完全基于jq发布答案,那对他们来说将是浪费时间
  • @oguzismail 同意你的观点。删除了 AWS 标签,因此将其视为 jq 问题,感谢您的建议。

标签: json jq


【解决方案1】:

您只需调用一次 jq 即可完成任务,而无需使用容易出错的 shell 对字符串插值的支持。例如:

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 的一次调用中)。

【讨论】:

  • 来自 jq 初学者的一件事,我在执行您的示例时遇到了一些错误,如下所示,我不知道如何引入 .logDriver,您可以检查一下吗? $ 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}' ejm.json jq: error: containerDefinitions/0 is not defined at , line 2: containerDefinitions[0].logConfiguration.options jq: 1编译错误
  • 抱歉,. 丢失了。固定。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2021-05-18
  • 2018-12-14
  • 2019-09-10
  • 2020-07-22
  • 2019-12-19
  • 1970-01-01
  • 2022-11-17
相关资源
最近更新 更多