【问题标题】:How do I invoke a SAM Lambda function locally with X-Ray statements?如何使用 X-Ray 语句在本地调用 SAM Lambda 函数?
【发布时间】:2021-10-17 03:06:05
【问题描述】:

我在本地调用 AWS SAM Lambda 函数时收到以下错误:

Missing AWS Lambda trace data for X-Ray. Ensure Active Tracing is enabled and no subsegments are created outside the function handler.

下面你可以看到我的功能:

/** Bootstrap */
require('dotenv').config()
const AWSXRay = require('aws-xray-sdk')

/** Libraries*/
const se                = require('serialize-error')

/** Internal */
const logger            = require('./src/utils/logger')
const ExecuteService    = require('./src/service')

/**
 *
 */
exports.handler = async (event) => {    
    const xraySegement = AWSXRay.getSegment()
    
    const message = process.env.NODE_ENV == 'production' ? JSON.parse(event.Records[0].body) : event

    try {
        await ExecuteService(message)
    } catch (err) {
        logger.error({
            error: se(err)
        })

        return err
    }
}

此外,我在我的 template.yml 中将 Tracing 设置为 Active。

我明显误读、遗漏或阅读了文档的哪一部分?

【问题讨论】:

    标签: aws-lambda aws-sam-cli aws-xray


    【解决方案1】:

    目前您无法使用 X 射线在本地调用 SAM lambda,因为它尚不受支持。

    该组件不支持本地 X 射线和其他 Lambda 集成。


    如果您不关心 X 射线并且只想让您的代码正常工作,您可以检查环境变量 AWS_SAM_LOCAL 以防止使用 X 射线:

    let AWSXRay
    if (!process.env.AWS_SAM_LOCAL) {
        AWSXRay = require('aws-xray-sdk')
    }
    
    // ...
    if (!process.env.AWS_SAM_LOCAL) {
        const xraySegement = AWSXRay.getSegment()
    }
    
    

    【讨论】:

    • 谢谢!我需要想出一个巧妙的设计模式来隐藏一些这种污染。
    【解决方案2】:

    我正在使用SAM CLI, version 1.36.0 我注意到导入 aws-xray-sdk 不会产生此问题,但调用函数会产生此问题。

    为了没有一百万个 if 语句,我创建了一个中间人服务,该服务导入 aws-xray-sdk 然后在设置了环境变量 process.env.AWS_SAM_LOCAL 时导出 noops。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2023-02-17
      • 2021-04-01
      • 2021-05-26
      相关资源
      最近更新 更多