无法通过node.js从lambda获取Amazon CloudWatch日志

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法通过node.js从lambda获取Amazon CloudWatch日志相关的知识,希望对你有一定的参考价值。

我想使用AWS.CloudWatchLogs.describeLogStreams获取cloudwatch日志,但返回的响应是httpstatuscode ='undefined',并且没有数据。

我应该如何处理此问题?

我执行以下代码进行调试。

const aws = require('aws-sdk')

exports.handler = async (event, context) => 
  const cloudwatchlogs = new aws.CloudWatchLogs();
  const params = 
    logGroupName: '/aws/lambda/test'
  
  var tmp = await cloudwatchlogs.describeLogStreams(params);
  console.log(tmp);
;

并获取以下日志。

2020-05-26T22:48:25.869Z    51891acf-302d-4d71-8f3b-b98cab65192d    INFO    Request 
  domain: null,
  service: Service 
    config: Config 
      credentials: [EnvironmentCredentials],
      credentialProvider: [CredentialProviderChain],
      region: 'ap-northeast-1',
      logger: null,
      apiVersions: ,
      apiVersion: null,
      endpoint: 'logs.ap-northeast-1.amazonaws.com',
      httpOptions: [Object],
      maxRetries: undefined,
      maxRedirects: 10,
      paramValidation: true,
      sslEnabled: true,
      s3ForcePathStyle: false,
      s3BucketEndpoint: false,
      s3DisableBodySigning: true,
      s3UsEast1RegionalEndpoint: 'legacy',
      s3UseArnRegion: undefined,
      computeChecksums: true,
      convertResponseTypes: true,
      correctClockSkew: false,
      customUserAgent: null,
      dynamoDbCrc32: true,
      systemClockOffset: 0,
      signatureVersion: 'v4',
      signatureCache: true,
      retryDelayOptions: ,
      useAccelerateEndpoint: false,
      clientSideMonitoring: false,
      endpointDiscoveryEnabled: false,
      endpointCacheSize: 1000,
      hostPrefixEnabled: true,
      stsRegionalEndpoints: 'legacy'
    ,
    isGlobalEndpoint: false,
    endpoint: Endpoint 
      protocol: 'https:',
      host: 'logs.ap-northeast-1.amazonaws.com',
      port: 443,
      hostname: 'logs.ap-northeast-1.amazonaws.com',
      pathname: '/',
      path: '/',
      href: 'https://logs.ap-northeast-1.amazonaws.com/'
    ,
    _events:  apiCallAttempt: [Array], apiCall: [Array] ,
    MONITOR_EVENTS_BUBBLE: [Function: EVENTS_BUBBLE],
    CALL_EVENTS_BUBBLE: [Function: CALL_EVENTS_BUBBLE],
    _clientId: 1
  ,
  operation: 'describeLogGroups',
  params: ,
  httpRequest: HttpRequest 
    method: 'POST',
    path: '/',
    headers: 
      'User-Agent': 'aws-sdk-nodejs/2.682.0 linux/v12.16.3 exec-env/AWS_Lambda_nodejs12.x'
    ,
    body: '',
    endpoint: Endpoint 
      protocol: 'https:',
      host: 'logs.ap-northeast-1.amazonaws.com',
      port: 443,
      hostname: 'logs.ap-northeast-1.amazonaws.com',
      pathname: '/',
      path: '/',
      href: 'https://logs.ap-northeast-1.amazonaws.com/',
      constructor: [Function]
    ,
    region: 'ap-northeast-1',
    _userAgent: 'aws-sdk-nodejs/2.682.0 linux/v12.16.3 exec-env/AWS_Lambda_nodejs12.x'
  ,
  startTime: 2020-05-26T22:48:25.866Z,
  response: Response 
    request: [Circular],
    data: null,
    error: null,
    retryCount: 0,
    redirectCount: 0,
    httpResponse: HttpResponse 
      statusCode: undefined,
      headers: ,
      body: undefined,
      streaming: false,
      stream: null
    ,
    maxRetries: 3,
    maxRedirects: 10
  ,
  _asm: AcceptorStateMachine 
    currentState: 'validate',
    states: 
      validate: [Object],
      build: [Object],
      afterBuild: [Object],
      sign: [Object],
      retry: [Object],
      afterRetry: [Object],
      send: [Object],
      validateResponse: [Object],
      extractError: [Object],
      extractData: [Object],
      restart: [Object],
      success: [Object],
      error: [Object],
      complete: [Object]
    
  ,
  _haltHandlersOnError: false,
  _events: 
    validate: [
      [Function],
      [Function],
      [Function: VALIDATE_REGION],
      [Function: BUILD_IDEMPOTENCY_TOKENS],
      [Function: VALIDATE_PARAMETERS]
    ],
    afterBuild: [
      [Function],
      [Function: SET_CONTENT_LENGTH],
      [Function: SET_HTTP_HOST]
    ],
    restart: [ [Function: RESTART] ],
    sign: [ [Function], [Function], [Function] ],
    validateResponse: [ [Function: VALIDATE_RESPONSE], [Function] ],
    send: [ [Function] ],
    httpHeaders: [ [Function: HTTP_HEADERS] ],
    httpData: [ [Function: HTTP_DATA] ],
    httpDone: [ [Function: HTTP_DONE] ],
    retry: [
      [Function: FINALIZE_ERROR],
      [Function: INVALIDATE_CREDENTIALS],
      [Function: EXPIRED_SIGNATURE],
      [Function: CLOCK_SKEWED],
      [Function: REDIRECT],
      [Function: RETRY_CHECK],
      [Function: API_CALL_ATTEMPT_RETRY]
    ],
    afterRetry: [ [Function] ],
    build: [ [Function: buildRequest] ],
    extractData: [ [Function: extractData], [Function: extractRequestId] ],
    extractError: [ [Function: extractError], [Function: extractRequestId] ],
    httpError: [ [Function: ENOTFOUND_ERROR] ],
    success: [ [Function: API_CALL_ATTEMPT] ],
    complete: [ [Function: API_CALL] ]
  ,
  emit: [Function: emit],
  API_CALL_ATTEMPT: [Function: API_CALL_ATTEMPT],
  API_CALL_ATTEMPT_RETRY: [Function: API_CALL_ATTEMPT_RETRY],
  API_CALL: [Function: API_CALL]

补充:

  • 我的lambda函数具有CloudWatchFullAccess策略
  • 我可以在cloudwatch控制台中看到此功能的cloudwatch日志。
  • 我的lambda函数运行时是Node.js 12.x
答案

我认为这是因为您的函数在获得任何结果之前就已完成。解决此问题的一种方法是使用aws docs:中所示的异步处理程序

模式
const aws = require('aws-sdk')

exports.handler = async (event, context) => 
  const promise = new Promise(function(resolve, reject) 
    const cloudwatchlogs = new aws.CloudWatchLogs();
    const params = 
      logGroupName: '/aws/lambda/test'
    
    cloudwatchlogs.describeLogStreams(params, function(err, data) 
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    );
  )
  return promise;

;

以上是关于无法通过node.js从lambda获取Amazon CloudWatch日志的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 制作视频缩略图

AWS lambda 调用不调用另一个 lambda 函数 - Node.js

无法在 Lambda 函数(Node JS)中下载 S3 视频

有没有办法从 node.js 同步调用 AWS Lambda?

从调用 AWS Lambda 的 Angular 工厂获取数据到控制器中

Node.js Lambda 函数从 REST 调用将“响应无效”返回给 Alexa 服务模拟器