如何使用 X-Ray 语句在本地调用 SAM Lambda 函数?

How do I invoke a SAM Lambda function locally with X-Ray statements?

我在本地调用 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。

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

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

The component does not support X-ray and other Lambda integrations locally.


如果您不关心 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()
}

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

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