【问题标题】:Can I get information about AWS Lambda request IDs, e.g. the trigger?我能否获取有关 AWS Lambda 请求 ID 的信息,例如触发?
【发布时间】:2020-10-04 21:10:13
【问题描述】:

在我的日志中我发现

START RequestId: 123a1a12-1234-1234-1234-123456789012 Version: $LATEST

对于 AWS lambda 的每次调用。是否可以获得有关请求的更多信息,例如是什么触发了它?

【问题讨论】:

    标签: aws-lambda amazon-cloudwatch


    【解决方案1】:

    您可以从上下文对象获取请求ID和其他信息。

    当 Lambda 运行您的函数时,它会将上下文对象传递给处理程序。该对象提供的方法和属性提供有关调用、函数和执行环境的信息。 https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html

    您可以从 process.env 变量中获取更多信息。

    我编写了一个简短的 lambda 函数 (node.js),它将这些信息记录到控制台并最终显示在 aws cloud watch 中

    exports.handler = async (event, context) => {
        console.log('context:', JSON.stringify(context));
        console.log('process.env:', JSON.stringify(process.env));
    
        return {statusCode: 200, body: 'Hello World'};
    };
    

    日志输出:

    START RequestId: 6f3c103e-f0a5-4982-934c-dabedda0065e Version: $LATEST
    context:
    {
        "callbackWaitsForEmptyEventLoop": true,
        "functionVersion": "$LATEST",
        "functionName": "my_lambda_function_name",
        "memoryLimitInMB": "128",
        "logGroupName": "/aws/lambda/my_lambda_function_name",
        "logStreamName": "2020/10/01/[$LATEST]8adb13668eed4ac8b3e7f8d796fe4d49",
        "invokedFunctionArn": "arn:aws:lambda:us-east-1:636121343751:function:my_lambda_function_name",
        "awsRequestId": "6f3c103e-f0a5-4982-934c-dabedda0065e"
    }
    process.env:
    {
        "AWS_LAMBDA_FUNCTION_VERSION": "$LATEST",
        "AWS_SESSION_TOKEN": "IZZ3eS6vFF...",
        "LD_LIBRARY_PATH": "/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib",
        "LAMBDA_TASK_ROOT": "/var/task",
        "AWS_LAMBDA_LOG_GROUP_NAME": "/aws/lambda/my_lambda_function_name",
        "AWS_LAMBDA_RUNTIME_API": "127.0.0.1:9001",
        "AWS_LAMBDA_LOG_STREAM_NAME": "2020/10/01/[$LATEST]8adb13668eed4ac8b3e7f8d796fe4d49",
        "AWS_EXECUTION_ENV": "AWS_Lambda_nodejs12.x",
        "AWS_LAMBDA_FUNCTION_NAME": "my_lambda_function_name",
        "AWS_XRAY_DAEMON_ADDRESS": "169.254.79.2:2000",
        "PATH": "/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin",
        "AWS_DEFAULT_REGION": "us-east-1",
        "PWD": "/var/task",
        "AWS_SECRET_ACCESS_KEY": "5nQrpKhBwF...",
        "LAMBDA_RUNTIME_DIR": "/var/runtime",
        "LANG": "en_US.UTF-8",
        "NODE_PATH": "/opt/nodejs/node12/node_modules:/opt/nodejs/node_modules:/var/runtime/node_modules:/var/runtime:/var/task",
        "AWS_REGION": "us-east-1",
        "TZ": ":UTC",
        "AWS_ACCESS_KEY_ID": "ASIAZNANWY3473BTADSB",
        "SHLVL": "0",
        "_AWS_XRAY_DAEMON_ADDRESS": "169.254.79.2",
        "_AWS_XRAY_DAEMON_PORT": "2000",
        "AWS_XRAY_CONTEXT_MISSING": "LOG_ERROR",
        "_HANDLER": "index.handler",
        "AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "128",
        "_X_AMZN_TRACE_ID": "Root=1-6f75f4e5-5801599f17fd63e74ecd0833;Parent=73fb93812cdbf83f;Sampled=0"
    }
    END RequestId: 6f3c103e-f0a5-4982-934c-dabedda0065e
    REPORT RequestId: 6f3c103e-f0a5-4982-934c-dabedda0065e
    Duration: 21.71 ms  Billed Duration: 100 ms 
    Memory Size: 128 MB Max Memory Used: 64 MB  Init Duration: 132.35 ms    
    

    【讨论】:

      【解决方案2】:

      一个 lambda 函数有两个参数:Event 和context

      正常的调用如下所示:

      {
          "event": {
              "version": "0",
              "id": "abcdefgh-1234-5678-1234-abcdefghijkl",
              "detail-type": "Scheduled Event",
              "source": "aws.events",
              "account": "123456789012",
              "time": "2018-01-01T12:00:00Z",
              "region": "us-east-1",
              "resources": [
                  "arn:aws:events:us-east-1:123456788901:rule/foo"
              ],
              "detail": {}
          },
          "context": "<__main__.LambdaContext object at 0x123456ax1234>"
      }
      

      测试调用有你得到的元素。

      【讨论】:

      • 我的事件调用(从 appsync 调用 lambda 函数)没有 id 字段。但是,我的上下文确实有一个 aws_request_id 字段,即日志中显示的 UUID。回复:docs.aws.amazon.com/lambda/latest/dg/python-context-object.html
      • 嗨@Martin Thoma,当我们在 lambda 中使用 SNS 时,我必须获取消息 ID 和请求 ID。如何使用 message 和 request-id 验证消息是否发送
      【解决方案3】:

      不确定我理解您所说的what triggered it 是什么意思?如果它连接到 API 网关,则请求通过网关代理到您的 Lambda。在这种情况下,网关触发了它,即使它是一个代理请求。

      此外,您还可以扩充您的网关以将额外的请求信息传递给您的 Lambda。 See how

      此外,要将请求详细信息附加到您看到的 RequestID,您可以查看context.awsRequestId

      我假设您想要进行某种形式的日志监控,在这种情况下,我认为您可以捆绑这些请求信息(标头、查询、参数、正文)并与 awsRequestId 一起发送到您的日志聚合器。 让我知道这是否有帮助

      Further reference

      【讨论】:

      • 我想知道它是由我点击“测试”或其他东西触发的。
      • 在这种情况下,我认为我的回复应该能够回答这个问题。我的意思是您可以记录 requestId 并与 cloudwatch 日志中的内容进行交叉检查,除非您想增加 Cloudwatch 中的内容。此外,点击“测试”是一个深思熟虑的动作,因此您可以轻松查看记录的 requestID 并与 Cloudwatch 上的记录进行比较
      • 根本不要点击“测试”。这种测试方法很容易被误解。 (不是你的错。这是 AWS 糟糕的 UI/UX)。
      • 从 API Gateway 调用时,上下文对象包含一个 requestId 属性,即 API Gateway 请求 ID。这与 Lambda 写入 CloudWatch 日志的 Lambda 请求 ID 不匹配。 API Gateway 在响应标头中返回其自己的请求 ID,但这无法用于查找该请求的相应 Lambda 日志。我想在我的应用程序的响应标头中返回 Lambda 请求 ID。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多