【问题标题】:aws cli lambda `update-function-configuration` deletes existing environment variablesaws cli lambda `update-function-configuration` 删除现有环境变量
【发布时间】:2018-09-28 05:14:18
【问题描述】:

AWS cil lambda 上的文档指出

...You provide only the parameters you want to change...

我认为这意味着其余设置仍将保持不变。 但是,假设我的 lambda 函数有环境变量:

var1=old_val1
var2=old_val2
var3=old_val3

然后当我尝试做这样的事情时:

aws lambda update-function-configuration --function-name dummy_fun --environment '{"Variables":{"var1":"new_val1","var2":"new_val2"}}'

为了更新变量: var1var2 分别具有新值 new_val1 和 new_val2,尽管这两个变量 DO em> 更新了,但第三个 var3 被删除了!

我做错了吗?或者有没有办法确保不会发生这种情况?

我绝对可以使用一种解决方法来处理它,其中我可以获取当前配置,然后在本地更新 env 变量,然后推送整个更新的配置,所有这些都通过 python 代码等。 但是,这是唯一的方法吗?或者有更简单的方法吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda environment-variables aws-cli


    【解决方案1】:

    您误解了文档的意图。

    您只提供要更改的参数。

    --environment 是您指定的应该更改的(单数)“参数”——而不是单个变量。

    环境变量已配置整体,因此没有仅指定您希望不同的某些环境变量的概念。

    【讨论】:

    • 好的,知道了。但我认为,我至少会尝试在 boto 上提出 PR,比如说:selective-update-function-configuration,以尝试容纳相同的 :) 不过还是感谢您的回复。干杯!
    • 你可以试试……但 SDK 倾向于对底层服务 API 进行相当紧密的建模……而 UpdateFunctionConfiguration 也不支持。
    • 是的,这是真的。实际的 API 也是如此。但是,恕我直言,这将是一件好事:)
    • 哦,同意。 aws cloudfront update-distribution 是另一个例子,除了底层 API 更加严格,需要重新提交完整的重复 all 参数(不仅仅是你想要改变的)......我强烈怀疑起源于this design philosophy
    【解决方案2】:
    aws lambda update-function-configuration --function-name my-function-name --environment Variables="{VAR1=variable_value, VAR2=variable_value}" 
    

    说明:上述命令将更新aws中lambda函数的环境变量。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我想只更新一个函数的一个 env 变量,而不触及其他变量。

      我最终在节点中编写了一个脚本并发布了它:

      https://www.npmjs.com/package/aws-lambda-update-env

      使用起来非常简单:

      update-lambda-env KEY "My New Test Value" --stack-name myApplicationStack
      

      这只会更改位于堆栈中的函数中的变量 KEY myApplicationStack

      如果您的变量要经常更改,更好的解决方案可能是使用 AWS Parameter Store。

      https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html

      【讨论】:

      • 很酷的工具 - 恐怕它不适用于多个嵌套堆栈。我有 A 包括 B 包括 C,其中 C 是 lambda 堆栈。我可以将它应用于 B(它会更新 C),但不能应用于 A。
      • @Roelant 我不确定我是否能够使其递归工作。您只需为每个堆栈调用脚本。它在幕后执行“aws cloudformation list-stack-resources --stack-name {mystack}”
      • 是的,最终围绕您的工具编写了一个小 boto 循环来获取正确的堆栈:)
      【解决方案4】:

      使用awscli 部分更新 lambda 的环境变量似乎并不容易。

      但是通过使用 built-in JSON-based client-side filteringJMESPath 语法,我找到了一种方法来实现我需要做的事情。

      NEW_ENVVARS=$(aws lambda get-function-configuration --function-name your-func-name --query "Environment.Variables | merge(@, \`{\"ENV_VAR_TO_UPDATE\":\"value_here\"}\`)")
      
      aws lambda update-function-configuration --function-name your-func-name --environment "{ \"Variables\": $NEW_ENVVARS }"
      
      

      当然,您可以使用该技巧更新多个环境变量。

      【讨论】:

        猜你喜欢
        • 2017-12-05
        • 2019-01-17
        • 2017-12-17
        • 2017-08-18
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多