【问题标题】:Change value of environment variable while invoking Lambda function调用 Lambda 函数时更改环境变量的值
【发布时间】:2022-01-02 23:14:59
【问题描述】:

我正在学习 lambda,目前正在尝试了解环境变量。下面是一个非常简单的代码来显示我的问题。 (一个 nodejs 函数,它将简单地打印 name 常量的值)。

exports.handler =  async function(event, context) {
   
   const name = process.env.NAME;
    return name;
  
};

我已经在 lambda 上定义了一个环境变量如下

现在这个 lambda 肯定会在完成后打印“xyz”。但是我们如何在运行 Lambda 时覆盖/更改“名称”变量的值。所以在调用它时会显示新值?例如 --NAME = "abc" 或 --NAME abc

【问题讨论】:

  • 您为什么要这样做?您可能可以执行process.env.NAME = "foobar",但这仅适用于当前调用(如果有的话)。如果您想为将来的调用更改环境变量的值,您需要更新您的 lambda 函数。在 AWS 控制台中或通过一些 aws-cli 调用
  • @kiner_shah — AWS Lambda 的上下文意味着这里不是一个好的重复目标。
  • @derpirscher 我需要在另一个脚本上执行此操作,我正在使用 lambda 函数创建一些 route53 记录。所以每次我运行 lambda 函数时,我都需要传递变量“domain”的值
  • @FaisalShani 这不是环境变量的用途,您不能以这种方式使用它们。如果您需要将参数传递给 lambda 函数,请使用其中一种官方方式,即通过查询参数或在事件主体中...

标签: javascript node.js amazon-web-services aws-lambda aws-serverless


【解决方案1】:

根据原始问题和 cmets,我为您的 Lambda 收集了以下要求:

  1. 您想与 Route53 API 对话。
  2. 您希望对 Lambda 进行参数化,以允许在每次调用时将域名传递给 Lambda。

实现此目的的最简单且可能最合适的方法是在每次调用时将域作为“事件”数据传递。

exports.handler = async (event) => {
    const domain = event["domain"];
    console.log("Domain: %s", domain);

    // your Route53 code goes here...
};

要运行 Lambda 并传递“域”,您有很多选择。

选项 1:AWS 控制台

您可以转到 AWS 控制台,打开 Lambda,切换到“测试”选项卡,然后使用以下输入 JSON:

{
  "domain": "www.google.com"
}

选项 2:AWS CLI v2

您可以从命令行invoke that Lambda using the AWS CLI

aws \
    lambda \
    invoke \
    --cli-binary-format raw-in-base64-out \
    --function-name <function-name> \
    --payload '{"domain":"www.google.com"}' \
    outfile.txt

选项 3:AWS 开发工具包

您还可以在其他 Lambda 中、在本地机器上的脚本中或任何其他可以使用 AWS Lambda 并像这样调用 Lambda 的方式中编写一些代码。

以下是使用 AWS SDK v3 的简单 NodeJS CLI“代码”示例。

import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";

async function main() {
    const client = new LambdaClient({ region: "<your-region>" });

    const payload = JSON.stringify({
        "domain": "www.google.com"
    });

    const input = {
        "FunctionName": "<function-name>",
        "Payload": payload
    };
    
    const command = new InvokeCommand(input);
    const response = await client.send(command);
    
    console.log(response);
}

main()

如果您运行 node index.js,您将使用给定的有效负载调用 Lambda。

设置节点:

npm init
npm install @aws-sdk/client-lambda

记得在package.json 中将type 设置为module

【讨论】:

    【解决方案2】:

    来自AWS Knowledge Center: Can I change the environment variables in a published version of my Lambda function?

    您无法更改已发布的 Lambda 函数版本中的配置(包括环境变量)或函数代码。您只能更改当前未发布的函数版本 ($LATEST)。

    因此,除非让您的 Lambda 连接到 AWS API 并发布其自身的全新版本,否则您不能。

    您似乎试图将环境变量用作本地存储空间,但从根本上说,它们并非如此。使用数据库可能会更好。我希望为此使用 DynamoDB。

    【讨论】:

    • 感谢您的回复。关于我的案例的更多信息是,我在本地有一个 nodejs 函数,它在运行时会创建一些 route53 记录。为此,我必须通过 --AWS_PROFILE=qa DOMAIN=abc.ss.com nodejs index.js 之类的方式传递“DOMAIN”变量的值
    • 无论如何我可以在 AWS lambda 端复制相同的内容?
    • 他们甚至没有尝试使用环境变量作为本地存储,他们只是尝试使用它来将参数传递到他们的脚本中。 @FaisalShani,您需要更改代码以从事件参数而不是环境变量中提取域。
    猜你喜欢
    • 1970-01-01
    • 2022-11-20
    • 2013-02-22
    • 2022-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2020-12-02
    • 2017-12-17
    相关资源
    最近更新 更多