基于子对象数组中的值进行选择

3

我正在尝试自动化更新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"
    }
  ]
}

在上面的例子中,我定义了三个函数,其中两个函数至少使用了一个层。我需要做的是获取使用特定层的FunctionArn值的列表。到目前为止,我已经能够使用以下命令过滤掉不使用任何层的函数:
aws lambda list-functions | jq '.Functions[] | select(.Layers)'

我需要做的是创建一个能够在"Layers"数组的顶层内进行过滤的select()语句。
aws lambda list-functions | jq '.Functions[] | select(.Layers[] | contains("layer2"))'

https://jqplay.org/s/SiFSE3RxZV

但我一直收到“无法遍历null”错误消息,我认为这些消息来自select()语句内部?

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

1个回答

6

Functions元素中选择那些具有一个Layers键的函数,其值-一个数组-包含至少一个对象,其中该对象的Arn字段-一个字符串-包含layer2作为子字符串,并提取它们的FunctionArn。例如:

.Functions[] | select(has("Layers") and any(.Layers[].Arn; index("layer2"))) | .FunctionArn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接