根据子对象数组中的值进行选择

dan*_*gie 3 select json jq

我正在尝试自动化更新 AWS Lambda 层和使用它们的函数的过程。为了获取使用特定层的函数列表,我在我的账户中列出当前函数时解析 AWS CLI 的 JSON 输出。调用aws lambda list-functions返回一个类似于下例的 JSON 块(我特意去掉了一些不相关的内容来关注这个问题):

{
  "Functions": [
    {
      "TracingConfig": {
        "Mode": "PassThrough"
      },
      "FunctionArn": "arn:aws:lambda:eu-west-2:000000000000:function:function-1"
    },
    {
      "Layers": [
        {
          "CodeSize": 11359101,
          "Arn": "arn:aws:lambda:eu-west-2:000000000000:layer:layer1:12"
        }
      ],
      "TracingConfig": {
        "Mode": "PassThrough"
      },
      "FunctionArn": "arn:aws:lambda:eu-west-2:000000000000:function:function-2"
    },
    {
      "Layers": [
        {
          "CodeSize": 11359101,
          "Arn": "arn:aws:lambda:eu-west-2:000000000000:layer:layer1:12"
        },
        {
          "CodeSize": 11359101,
          "Arn": "arn:aws:lambda:eu-west-2:000000000000:layer:layer2:5"
        }
      ],
      "TracingConfig": {
        "Mode": "PassThrough"
      },
      "FunctionArn": "arn:aws:lambda:eu-west-2:000000000000:function:function-3"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我定义了三个函数,其中两个至少使用了一层。我需要做的是获取FunctionArn使用特定层的函数的值列表。到目前为止,我已经能够使用以下命令过滤掉不使用任何图层的函数:

aws lambda list-functions | jq '.Functions[] | select(.Layers)'
Run Code Online (Sandbox Code Playgroud)

我真正需要做的是创建一个select()语句,可以从顶层过滤“层”数组:

aws lambda list-functions | jq '.Functions[] | select(.Layers[] | contains("layer2"))'
Run Code Online (Sandbox Code Playgroud)

https://jqplay.org/s/SiFSE3RxZV

但是我不断收到我认为来自select()语句内部的“无法迭代空值”错误消息?

计划是将列表过滤到使用相关特定层的函数,然后返回FunctionArn每个结果的值以在我的脚本中使用。

ogu*_*ail 6

从 的元素中Functions,选择具有Layers键值的元素- 一个数组 - 包含至少一个layer2在其Arn字段中具有子字符串的对象-a string- ,并提取它们的FunctionArns。例如:

.Functions[] | select(has("Layers") and any(.Layers[].Arn; index("layer2"))) | .FunctionArn
Run Code Online (Sandbox Code Playgroud)