【问题标题】:How to get Latest Published version of a Lambda Function in AWS CLI如何在 AWS CLI 中获取 Lambda 函数的最新发布版本
【发布时间】:2019-09-25 17:30:57
【问题描述】:

如何获取 Lambda 函数的最新发布版本? 除了$LATEST,我怎样才能得到结果为“5”

$ aws lambda list-versions-by-function --function-name My_Lambda_Function --query 'Versions[*][Version, FunctionArn]' --output json
[
    [
        "$LATEST",
        "arn:aws:lambda:us-east-2:123456789000:function:My_Lambda_Function:$LATEST"
    ],
    [
        "1",
        "arn:aws:lambda:us-east-2:123456789000:function:My_Lambda_Function:1"
    ],
    [
        "2",
        "arn:aws:lambda:us-east-2:123456789000:function:My_Lambda_Function:2"
    ],
    [
        "3",
        "arn:aws:lambda:us-east-2:123456789000:function:My_Lambda_Function:3"
    ],
    [
        "4",
        "arn:aws:lambda:us-east-2:123456789000:function:My_Lambda_Function:4"
    ],
    [
        "5",
        "arn:aws:lambda:us-east-2:123456789000:function:My_Lambda_Function:5"
    ]
]

【问题讨论】:

    标签: amazon-web-services command-line-interface


    【解决方案1】:

    我发现this thread on GitHub 很有见地,您可以通过几种方法获得最大的非$LATEST 项目,但只有其中一种是正确的:

    错误的方式,此命令仅在版本9 中是正确的,因为它将对版本进行字符串比较并确定"9" 大于"10"

    aws lambda list-versions-by-function --function-name my_lambda \
      --query "max_by(Versions, &Version)"
    

    错误的方式,此命令仅在版本50(或任何页面大小)是正确的,因为它只会过滤第一页中返回的结果。

    aws lambda list-versions-by-function --function-name my_lambda \
      --query "Versions[-1]"
    

    错误的方式,此命令会在过滤之前考虑所有结果,但仍假定它们的顺序正确

    aws lambda list-versions-by-function --function-name my_lambda \
      --no-paginate \
      --query "Versions[-1]"
    

    错误的方式,这个命令看起来很适合排序,但会在to_number("$LATEST")返回null时阻塞。

    aws lambda list-versions-by-function --function-name my_lambda \
      --no-paginate \
      --query "max_by(Versions, &to_number(Version))" 
    

    错误的方式,这个命令看起来适合排序,但(在我的机器上)不接受文字 0

    aws lambda list-versions-by-function --function-name my_lambda \
      --no-paginate \
      --query "max_by(Versions, &to_number(Version) || '0')"
    

    正确的方式,此命令将在考虑所有结果之前获取所有结果,并通过两次转换为数字来解决数字文字的问题。

    aws lambda list-versions-by-function --function-name my_lambda \
      --no-paginate \
      --query "max_by(Versions, &to_number(to_number(Version) || '0'))"
    

    【讨论】:

    • --no-paginate 被误解了。来自文档:“要禁用分页并仅返回结果的第一页,请使用 --no-paginate 选项。”。所以“正确的方式”必须不用分页。这是在实践和文档中看到的。
    • 你知道这个命令是怎么用python和boto3写的吗? client.list_versions_by_function(FunctionName='string')
    • @Matrix 对于 boto3,我不喜欢使用标记遍历页面,所以我使用:boto3.client('lambda').get_paginator('list_versions_by_function').paginate(FunctionName='my_lambda_name').build_full_result()
    • 我对这个解决方案的主要问题是,如果这个 lambda 函数有 51 个版本,对这个调用的响应将返回关于 $Latest 和版本 1 - 49 的信息。而 49 不会成为 $Latest 的正确版本...
    • 删除--no-paginate是这里唯一需要更改的部分吗?
    【解决方案2】:

    您可以使用list-versions-by-function 获取所有版本,然后使用jq 提取倒数第​​二个

    aws lambda  list-versions-by-function --function-name LogsToElasticsearch_goabode --max-items 5 \
     --query 'Versions[*].[Version,FunctionName]' | jq '.[-1]'
    

    或者获取所有的名字

     aws lambda  list-versions-by-function --function-name my_lambda \
     --max-items 5 --query 'Versions[*].[Version,FunctionName]'
    

    【讨论】:

    • 这似乎假设$LATEST 必须始终存在并且所有函数版本的列表将适合一页结果。我不知道这对于编写脚本是否足够安全。
    • 看起来 aws lambda list-versions-by-function 命令最多只返回 50 个结果,无论是否在命令中指定了 --no-paginate。这是我现在遇到的事情。 API 文档在其描述中说明了这一限制:docs.aws.amazon.com/cli/latest/reference/lambda/… - “返回一个版本列表,每个版本都有特定于版本的配置。Lambda 每次调用最多返回 50 个版本。”因此,当您发布超过 50 个版本时,事实证明无法获得最新的实际版本号。
    猜你喜欢
    • 1970-01-01
    • 2018-06-16
    • 2019-10-30
    • 2021-02-24
    • 1970-01-01
    • 2016-04-26
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多