创建AWS Fargate任务定义json时的问题

问题描述 投票:1回答:1

我正在尝试从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中有一个日志组,但是没有从容器中捕获stdout和stderr,因为json任务中未正确引入“ logDriver”。

正确的JSON任务定义应该作为下面链接中的一个。

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

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

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

json jq
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.