在 Lambda 上启用应用程序 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在 Lambda 上启用应用程序

可以为 Lambda 函数启用 Application Signals。Application Signals 使用通过 Lambda 层提供的增强型 Amazon Distro for OpenTelemetry(ADOT)库自动检测 Lambda 函数。这个 Amazon Lambda Layer for OpenTelemetry 会打包并部署自动检测 Application Signals 所需的库。

除了支持 Application Signals 外,此 Lambda 层还是 Lambda OpenTelemetry 支持的组件,可提供跟踪功能。

入门

有三种方法可以为 Lambda 函数启用 Application Signals。

为 Lambda 函数启用 Application Signals 后,该函数的遥测数据需要几分钟才能显示在 Application Signals 控制台中。

  • 使用 CloudWatch Application Signals 控制台

  • 使用 Lambda 控制台

  • 手动将 Amazon Lambda Layer for OpenTelemetry 添加到 Lambda 函数运行时。

每一种方法都会将 Amazon Lambda Layer for OpenTelemetry 添加到函数。

使用 CloudWatch Application Signals 控制台

按照以下步骤使用 Application Signals 控制台为 Lambda 函数启用 Application Signals。

  1. 通过 https://console.aws.amazon.com/cloudwatch/ 打开 CloudWatch 控制台。

  2. 在导航窗格中,选择 Application Signals服务

  3. 服务列表区域中,选择启用 Application Signals

  4. 选择 Lambda 磁贴。

  5. 选择要为 Application Signals 启用的每个函数,然后选择完成

使用 Lambda 控制台

按照以下步骤使用 Lambda 控制台为 Lambda 函数启用 Application Signals。

  1. 通过 https://console.aws.amazon.com/lambda/ 打开 Amazon Lambda 控制台。

  2. 在导航窗格中,选择函数,然后选择要启用的函数名称。

  3. 选择配置选项卡,然后选择监控和操作工具

  4. 选择编辑

  5. CloudWatch Application Signals 和 X-Ray 部分中,选择使用 Application Signals 自动收集应用程序跟踪和标准应用程序指标使用 X-Ray 自动收集 Lambda 服务跟踪来实现端到端可见性

  6. 选择保存

使用 Amazon CDK 在 Lambda 上启用 Application Signals

如果您尚未在此账户中启用 Application Signals,则必须向 Application Signals 授予发现您的服务所需的权限。有关更多信息,请参阅 在账户中启用 Application Signals

  1. 为您的应用程序启用 Application Signals

    import { aws_applicationsignals as applicationsignals } from 'aws-cdk-lib'; const cfnDiscovery = new applicationsignals.CfnDiscovery(this, 'ApplicationSignalsServiceRole', { } );

    Discovery CloudFormation 资源授予 Application Signals 下列权限:

    • xray:GetServiceGraph

    • logs:StartQuery

    • logs:GetQueryResults

    • cloudwatch:GetMetricData

    • cloudwatch:ListMetrics

    • tag:GetResources

    有关该角色的更多信息,请参阅CloudWatch Application Signals 的服务相关角色权限

  2. 向 Lambda 函数添加 IAM 策略 CloudWatchLambdaApplicationSignalsExecutionRolePolicy

    const fn = new Function(this, 'DemoFunction', { code: Code.fromAsset('$YOUR_LAMBDA.zip'), runtime: Runtime.PYTHON_3_12, handler: '$YOUR_HANDLER' }) fn.role?.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName('CloudWatchLambdaApplicationSignalsExecutionRolePolicy'));
  3. 在相应的区域中,将 $AWS_LAMBDA_LAYER_FOR_OTEL_ARN 替换为实际的 Amazon Lambda Layer for OpenTelemetry ARN

    fn.addLayers(LayerVersion.fromLayerVersionArn( this, 'AwsLambdaLayerForOtel', '$AWS_LAMBDA_LAYER_FOR_OTEL_ARN' )) fn.addEnvironment("AWS_LAMBDA_EXEC_WRAPPER", "/opt/otel-instrument");

(可选)监控应用程序运行状况

在 Lambda 上启用应用程序后,就可以监控应用程序的运行状况。有关更多信息,请参阅 使用 Application Signals 监控应用程序的运行状况

手动启用 Application Signals。

按照以下步骤为 Lambda 函数手动启用 Application Signals。

  1. 手动将 Amazon Lambda Layer for OpenTelemetry ARN 添加到 Lambda 运行时。要查找层 ARN,请参阅 Amazon Lambda Layer for OpenTelemetry ARN

  2. 添加环境变量 AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument

    添加环境变量 LAMBDA_APPLICATION_SIGNALS_REMOTE_ENVIRONMENT 以配置自定义 Lambda 环境。lambda 环境默认配置为 lambda:default

  3. 将 Amazon 托管式 IAM 策略 CloudWatchLambdaApplicationSignalsExecutionRolePolicy 策略附加到 Lambda 执行角色。

  4. (可选)我们建议您启用 Lambda 主动跟踪来获得更好的跟踪体验。有关更多信息,请参阅使用 Amazon X-Ray 可视化 Lambda 函数调用

手动禁用 Application Signals

要为 Lambda 函数手动禁用 Application Signals,请从 Lambda 运行时中移除 Amazon Lambda Layer for OpenTelemetry ARN,然后移除 AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument 环境变量。

配置 Application Signals

您可以遵照此部分在 Lambda 中配置 Application Signals。

将多个 Lambda 函数组为一项服务

环境变量 OTEL_SERVICE_NAME 设置服务的名称。这将作为应用程序的服务名称在 Application Signals 控制面板中显示。您可以为多个 Lambda 函数分配相同的服务名称,它们将在 Application Signals 中合并为单项服务。如果您不提供此键的值,将使用默认的 Lambda 函数。

采样

默认情况下,跟踪信息采样策略是基于父项的。您可以通过设置环境变量 OTEL_TRACES_SAMPLER 来调整采样策略。

例如,将跟踪信息采样率设置为 30%。

OTEL_TRACES_SAMPLER=traceidratio OTEL_TRACES_SAMPLER_ARG=0.3

有关更多信息,请参阅 OpenTelemetry Environment Variable Specification

启用所有库检测

为了减少 Lambda 冷启动,默认情况下,仅为 Python、Node 和 Java 启用 Amazon SDK 和 HTTP 检测。您可以设置环境变量,以便针对 Lambda 函数中使用的其他库启用检测。

  • Python – OTEL_PYTHON_DISABLED_INSTRUMENTATIONS=none

  • 节点 – OTEL_NODE_DISABLED_INSTRUMENTATIONS=none

  • Java - OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED=true

Amazon Lambda Layer for OpenTelemetry ARN

下表列出了每个支持 Amazon Lambda Layer for OpenTelemetry 的区域使用的 ARN。

Python
区域 ARN

美国东部(弗吉尼亚州北部)

arn:aws:lambda:us-east-1:615299751070:layer:AWSOpenTelemetryDistroPython:16

美国东部(俄亥俄州)

arn:aws:lambda:us-east-2:615299751070:layer:AWSOpenTelemetryDistroPython:13

美国西部(加利福尼亚北部)

arn:aws:lambda:us-west-1:615299751070:layer:AWSOpenTelemetryDistroPython:20

美国西部(俄勒冈州)

arn:aws:lambda:us-west-2:615299751070:layer:AWSOpenTelemetryDistroPython:20

非洲(开普敦)

arn:aws:lambda:af-south-1:904233096616:layer:AWSOpenTelemetryDistroPython:10

亚太地区(香港)

arn:aws:lambda:ap-east-1:888577020596:layer:AWSOpenTelemetryDistroPython:10

亚太地区(海得拉巴)

arn:aws:lambda:ap-south-2:796973505492:layer:AWSOpenTelemetryDistroPython:10

亚太地区(雅加达)

arn:aws:lambda:ap-southeast-3:039612877180:layer:AWSOpenTelemetryDistroPython:10

亚太地区(墨尔本)

arn:aws:lambda:ap-southeast-4:713881805771:layer:AWSOpenTelemetryDistroPython:10

亚太地区(孟买)

arn:aws:lambda:ap-south-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

亚太地区(大阪)

arn:aws:lambda:ap-northeast-3:615299751070:layer:AWSOpenTelemetryDistroPython:12

亚太地区(首尔)

arn:aws:lambda:ap-northeast-2:615299751070:layer:AWSOpenTelemetryDistroPython:13

亚太地区(新加坡)

arn:aws:lambda:ap-southeast-1:615299751070:layer:AWSOpenTelemetryDistroPython:12

亚太地区(悉尼)

arn:aws:lambda:ap-southeast-2:615299751070:layer:AWSOpenTelemetryDistroPython:13

亚太地区(东京)

arn:aws:lambda:ap-northeast-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

加拿大(中部)

arn:aws:lambda:ca-central-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

欧洲地区(法兰克福)

arn:aws:lambda:eu-central-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

欧洲地区(爱尔兰)

arn:aws:lambda:eu-west-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

欧洲地区(伦敦)

arn:aws:lambda:eu-west-2:615299751070:layer:AWSOpenTelemetryDistroPython:13

欧洲地区(米兰)

arn:aws:lambda:eu-south-1:257394471194:layer:AWSOpenTelemetryDistroPython:10

欧洲地区(巴黎)

arn:aws:lambda:eu-west-3:615299751070:layer:AWSOpenTelemetryDistroPython:13

欧洲地区(西班牙)

arn:aws:lambda:eu-south-2:490004653786:layer:AWSOpenTelemetryDistroPython:10

欧洲地区(斯德哥尔摩)

arn:aws:lambda:eu-north-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

欧洲(苏黎世)

arn:aws:lambda:eu-central-2:156041407956:layer:AWSOpenTelemetryDistroPython:10

以色列(特拉维夫)

arn:aws:lambda:il-central-1:746669239226:layer:AWSOpenTelemetryDistroPython:10

中东(巴林)

arn:aws:lambda:me-south-1:980921751758:layer:AWSOpenTelemetryDistroPython:10

中东(阿联酋)

arn:aws:lambda:me-central-1:739275441131:layer:AWSOpenTelemetryDistroPython:10

南美洲(圣保罗)

arn:aws:lambda:sa-east-1:615299751070:layer:AWSOpenTelemetryDistroPython:13

Node.js
区域 ARN

美国东部(弗吉尼亚州北部)

arn:aws:lambda:us-east-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

美国东部(俄亥俄州)

arn:aws:lambda:us-east-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

美国西部(加利福尼亚北部)

arn:aws:lambda:us-west-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

美国西部(俄勒冈州)

arn:aws:lambda:us-west-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

非洲(开普敦)

arn:aws:lambda:af-south-1:904233096616:layer:AWSOpenTelemetryDistroJs:8

亚太地区(香港)

arn:aws:lambda:ap-east-1:888577020596:layer:AWSOpenTelemetryDistroJs:8

亚太地区(海得拉巴)

arn:aws:lambda:ap-south-2:796973505492:layer:AWSOpenTelemetryDistroJs:6

亚太地区(雅加达)

arn:aws:lambda:ap-southeast-3:039612877180:layer:AWSOpenTelemetryDistroJs:8

亚太地区(墨尔本)

arn:aws:lambda:ap-southeast-4:713881805771:layer:AWSOpenTelemetryDistroJs:8

亚太地区(孟买)

arn:aws:lambda:ap-south-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

亚太地区(大阪)

arn:aws:lambda:ap-northeast-3:615299751070:layer:AWSOpenTelemetryDistroJs:8

亚太地区(首尔)

arn:aws:lambda:ap-northeast-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

亚太地区(新加坡)

arn:aws:lambda:ap-southeast-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

亚太地区(悉尼)

arn:aws:lambda:ap-southeast-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

亚太地区(东京)

arn:aws:lambda:ap-northeast-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

加拿大(中部)

arn:aws:lambda:ca-central-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

欧洲地区(法兰克福)

arn:aws:lambda:eu-central-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

欧洲地区(爱尔兰)

arn:aws:lambda:eu-west-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

欧洲地区(伦敦)

arn:aws:lambda:eu-west-2:615299751070:layer:AWSOpenTelemetryDistroJs:8

欧洲地区(米兰)

arn:aws:lambda:eu-south-1:257394471194:layer:AWSOpenTelemetryDistroJs:8

欧洲地区(巴黎)

arn:aws:lambda:eu-west-3:615299751070:layer:AWSOpenTelemetryDistroJs:8

欧洲地区(西班牙)

arn:aws:lambda:eu-south-2:490004653786:layer:AWSOpenTelemetryDistroJs:8

欧洲地区(斯德哥尔摩)

arn:aws:lambda:eu-north-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

欧洲(苏黎世)

arn:aws:lambda:eu-central-2:156041407956:layer:AWSOpenTelemetryDistroJs:8

以色列(特拉维夫)

arn:aws:lambda:il-central-1:746669239226:layer:AWSOpenTelemetryDistroJs:8

中东(巴林)

arn:aws:lambda:me-south-1:980921751758:layer:AWSOpenTelemetryDistroJs:8

中东(阿联酋)

arn:aws:lambda:me-central-1:739275441131:layer:AWSOpenTelemetryDistroJs:8

南美洲(圣保罗)

arn:aws:lambda:sa-east-1:615299751070:layer:AWSOpenTelemetryDistroJs:8

.Net
区域 ARN

美国东部(弗吉尼亚州北部)

arn:aws:lambda:us-east-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:6

美国东部(俄亥俄州)

arn:aws:lambda:us-east-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

美国西部(加利福尼亚北部)

arn:aws:lambda:us-west-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

美国西部(俄勒冈州)

arn:aws:lambda:us-west-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

非洲(开普敦)

arn:aws:lambda:af-south-1:904233096616:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(香港)

arn:aws:lambda:ap-east-1:888577020596:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(海得拉巴)

arn:aws:lambda:ap-south-2:796973505492:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(雅加达)

arn:aws:lambda:ap-southeast-3:039612877180:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(墨尔本)

arn:aws:lambda:ap-southeast-4:713881805771:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(孟买)

arn:aws:lambda:ap-south-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(大阪)

arn:aws:lambda:ap-northeast-3:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(首尔)

arn:aws:lambda:ap-northeast-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(新加坡)

arn:aws:lambda:ap-southeast-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(悉尼)

arn:aws:lambda:ap-southeast-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

亚太地区(东京)

arn:aws:lambda:ap-northeast-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

加拿大(中部)

arn:aws:lambda:ca-central-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

欧洲地区(法兰克福)

arn:aws:lambda:eu-central-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

欧洲地区(爱尔兰)

arn:aws:lambda:eu-west-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

欧洲地区(伦敦)

arn:aws:lambda:eu-west-2:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

欧洲地区(米兰)

arn:aws:lambda:eu-south-1:257394471194:layer:AWSOpenTelemetryDistroDotNet:5

欧洲地区(巴黎)

arn:aws:lambda:eu-west-3:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

欧洲地区(西班牙)

arn:aws:lambda:eu-south-2:490004653786:layer:AWSOpenTelemetryDistroDotNet:5

欧洲地区(斯德哥尔摩)

arn:aws:lambda:eu-north-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

欧洲(苏黎世)

arn:aws:lambda:eu-central-2:156041407956:layer:AWSOpenTelemetryDistroDotNet:5

以色列(特拉维夫)

arn:aws:lambda:il-central-1:746669239226:layer:AWSOpenTelemetryDistroDotNet:5

中东(巴林)

arn:aws:lambda:me-south-1:980921751758:layer:AWSOpenTelemetryDistroDotNet:5

中东(阿联酋)

arn:aws:lambda:me-central-1:739275441131:layer:AWSOpenTelemetryDistroDotNet:5

南美洲(圣保罗)

arn:aws:lambda:sa-east-1:615299751070:layer:AWSOpenTelemetryDistroDotNet:5

Java
区域 ARN

美国东部(弗吉尼亚州北部)

arn:aws:lambda:us-east-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

美国东部(俄亥俄州)

arn:aws:lambda:us-east-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

美国西部(加利福尼亚北部)

arn:aws:lambda:us-west-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

美国西部(俄勒冈州)

arn:aws:lambda:us-west-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

非洲(开普敦)

arn:aws:lambda:af-south-1:904233096616:layer:AWSOpenTelemetryDistroJava:5

亚太地区(香港)

arn:aws:lambda:ap-east-1:888577020596:layer:AWSOpenTelemetryDistroJava:5

亚太地区(海得拉巴)

arn:aws:lambda:ap-south-2:796973505492:layer:AWSOpenTelemetryDistroJava:5

亚太地区(雅加达)

arn:aws:lambda:ap-southeast-3:039612877180:layer:AWSOpenTelemetryDistroJava:5

亚太地区(墨尔本)

arn:aws:lambda:ap-southeast-4:713881805771:layer:AWSOpenTelemetryDistroJava:5

亚太地区(孟买)

arn:aws:lambda:ap-south-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

亚太地区(大阪)

arn:aws:lambda:ap-northeast-3:615299751070:layer:AWSOpenTelemetryDistroJava:5

亚太地区(首尔)

arn:aws:lambda:ap-northeast-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

亚太地区(新加坡)

arn:aws:lambda:ap-southeast-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

亚太地区(悉尼)

arn:aws:lambda:ap-southeast-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

亚太地区(东京)

arn:aws:lambda:ap-northeast-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

加拿大(中部)

arn:aws:lambda:ca-central-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

欧洲地区(法兰克福)

arn:aws:lambda:eu-central-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

欧洲地区(爱尔兰)

arn:aws:lambda:eu-west-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

欧洲地区(伦敦)

arn:aws:lambda:eu-west-2:615299751070:layer:AWSOpenTelemetryDistroJava:5

欧洲地区(米兰)

arn:aws:lambda:eu-south-1:257394471194:layer:AWSOpenTelemetryDistroJava:5

欧洲地区(巴黎)

arn:aws:lambda:eu-west-3:615299751070:layer:AWSOpenTelemetryDistroJava:5

欧洲地区(西班牙)

arn:aws:lambda:eu-south-2:490004653786:layer:AWSOpenTelemetryDistroJava:5

欧洲地区(斯德哥尔摩)

arn:aws:lambda:eu-north-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

欧洲(苏黎世)

arn:aws:lambda:eu-central-2:156041407956:layer:AWSOpenTelemetryDistroJava:5

以色列(特拉维夫)

arn:aws:lambda:il-central-1:746669239226:layer:AWSOpenTelemetryDistroJava:5

中东(巴林)

arn:aws:lambda:me-south-1:980921751758:layer:AWSOpenTelemetryDistroJava:5

中东(阿联酋)

arn:aws:lambda:me-central-1:739275441131:layer:AWSOpenTelemetryDistroJava:5

南美洲(圣保罗)

arn:aws:lambda:sa-east-1:615299751070:layer:AWSOpenTelemetryDistroJava:5

使用 Amazon ECR 容器部署 Lambda 函数

作为容器映像部署的 Lambda 函数不以传统方式支持 Lambda 层。使用容器映像时,不能像使用其他 Lambda 部署方法那样附加层。相反,必须在构建过程中手动将层的内容合并到容器映像中。

Java

您可以了解如何将 Amazon Lambda Layer for OpenTelemetry 集成到容器化 Java Lambda 函数中,下载 layer.zip 构件,然后将其集成到您的 Java Lambda 函数容器中,以启用 Application Signals 监控。

先决条件

  • 使用凭证配置的 Amazon CLI

  • 已安装 Docker

  • 这些说明假设您使用的是 x86_64 平台

  1. 设置项目结构

    为 Lambda 函数创建目录

    mkdir java-appsignals-container-lambda && \ cd java-appsignals-container-lambda

    创建 Maven 项目结构

    mkdir -p src/main/java/com/example/java/lambda mkdir -p src/main/resources
  2. 创建 Dockerfile

    将支持 Application Signals 的 OpenTelemetry 层直接下载并集成到 Lambda 容器映像中。为此,系统创建了 Dockerfile 文件。

    FROM public.ecr.aws/lambda/java:21 # Install utilities RUN dnf install -y unzip wget maven # Download the OpenTelemetry Layer with AppSignals Support RUN wget https://github.com/aws-observability/aws-otel-java-instrumentation/releases/latest/download/layer.zip -O /tmp/layer.zip # Extract and include Lambda layer contents RUN mkdir -p /opt && \ unzip /tmp/layer.zip -d /opt/ && \ chmod -R 755 /opt/ && \ rm /tmp/layer.zip # Copy and build function code COPY pom.xml ${LAMBDA_TASK_ROOT} COPY src ${LAMBDA_TASK_ROOT}/src RUN mvn clean package -DskipTests # Copy the JAR file to the Lambda runtime directory (from inside the container) RUN mkdir -p ${LAMBDA_TASK_ROOT}/lib/ RUN cp ${LAMBDA_TASK_ROOT}/target/function.jar ${LAMBDA_TASK_ROOT}/lib/ # Set the handler CMD ["com.example.java.lambda.App::handleRequest"]
    注意

    layer.zip 文件包含支持 Amazon Application Signals 所需的 OpenTelemetry 检测,以监控您的 Lambda 函数。

    层提取步骤可确保:

    • layer.zip 内容已正确提取到 /opt/ directory

    • otel-instrument 脚本获得适当的执行权限

    • 已移除临时 layer.zip 文件,以减小映像

  3. Lambda 函数代码:在 src/main/java/com/example/lambda/App.java: 为您的 Lambda 处理程序创建 Java 文件

    您的项目应该如下所示:

    . ├── Dockerfile ├── pom.xml └── src └── main ├── java │ └── com │ └── example │ └── java │ └── lambda │ └── App.java └── resources
  4. 构建和部署容器映像

    设置环境变量

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    使用 ECR 进行身份验证

    首先使用公共 ECR(适用于基础映像):

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws

    然后使用私有 ECR:

    aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

    构建、标记和推送映像

    # Build the Docker image docker build -t lambda-appsignals-demo . # Tag the image docker tag lambda-appsignals-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest # Push the image docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest
  5. 创建并配置 Lambda 函数

    使用 Lambda 控制台创建新函数。

    选择容器映像作为部署选项。

    单击浏览映像以选择您的 Amazon ECR 映像。

  6. 测试和验证 – 使用简单的事件测试您的 Lambda。如果层集成成功,您的 Lambda 将显示在 Application Signals 服务地图下。

    可以在 CloudWatch 控制台中查看 Lambda 函数的跟踪信息和指标。

故障排除

如果 Application Signals 不起作用,请检查以下内容:

  • 检查函数日志中是否存在与 OpenTelemetry 检测相关的任何错误

  • 验证环境变量 AWS_LAMBDA_EXEC_WRAPPER 的设置是否正确

  • 确保 Docker 文件中的层提取已成功完成

  • 确认是否已正确附加 IAM 权限

  • 如果需要,可在 Lambda 函数的常规配置中增大超时和内存设置

.Net

您可以了解如何将支持 Application Signals 的 OpenTelemetry 层集成到容器化 .Net Lambda 函数中,下载 layer.zip 构件,然后将其集成到您的 .Net Lambda 函数中,以启用 Application Signals 监控。

先决条件

  • 使用凭证配置的 Amazon CLI

  • 已安装 Docker

  • .NET 8 SDK

  • 这些说明假设您使用的是 x86_64 平台

  1. 设置项目结构

    为您的 Lambda 函数容器映像创建目录

    mkdir dotnet-appsignals-container-lambda && \ cd dotnet-appsignals-container-lambda
  2. 创建 Dockerfile

    将支持 Application Signals 的 OpenTelemetry 层直接下载并集成到 Lambda 容器映像中。为此,系统创建了 Dockerfile 文件。

    FROM public.ecr.aws/lambda/dotnet:8 # Install utilities RUN dnf install -y unzip wget dotnet-sdk-8.0 which # Add dotnet command to docker container's PATH ENV PATH="/usr/lib64/dotnet:${PATH}" # Download the OpenTelemetry Layer with AppSignals Support RUN wget https://github.com/aws-observability/aws-otel-dotnet-instrumentation/releases/latest/download/layer.zip -O /tmp/layer.zip # Extract and include Lambda layer contents RUN mkdir -p /opt && \ unzip /tmp/layer.zip -d /opt/ && \ chmod -R 755 /opt/ && \ rm /tmp/layer.zip WORKDIR ${LAMBDA_TASK_ROOT} # Copy the project files COPY dotnet-lambda-function/src/dotnet-lambda-function/*.csproj ${LAMBDA_TASK_ROOT}/ COPY dotnet-lambda-function/src/dotnet-lambda-function/Function.cs ${LAMBDA_TASK_ROOT}/ COPY dotnet-lambda-function/src/dotnet-lambda-function/aws-lambda-tools-defaults.json ${LAMBDA_TASK_ROOT}/ # Install dependencies and build the application RUN dotnet restore # Use specific runtime identifier and disable ReadyToRun optimization RUN dotnet publish -c Release -o out --self-contained false /p:PublishReadyToRun=false # Copy the published files to the Lambda runtime directory RUN cp -r out/* ${LAMBDA_TASK_ROOT}/ CMD ["dotnet-lambda-function::dotnet_lambda_function.Function::FunctionHandler"]
    注意

    layer.zip 文件包含支持 Amazon Application Signals 所需的 OpenTelemetry 检测,以监控您的 Lambda 函数。

    层提取步骤可确保:

    • layer.zip 内容已正确提取到 /opt/ directory

    • otel-instrument 脚本获得适当的执行权限

    • 已移除临时 layer.zip 文件,以减小映像

  3. Lambda 函数代码:使用 Amazon Lambda .NET 模板初始化您的 Lambda 项目:

    # Install the Lambda templates if you haven't already dotnet new -i Amazon.Lambda.Templates # Create a new Lambda project dotnet new lambda.EmptyFunction -n dotnet-lambda-function

    您的项目应该如下所示:

    . ├── Dockerfile └── dotnet-lambda-function ├── src │ └── dotnet-lambda-function │ ├── Function.cs │ ├── Readme.md │ ├── aws-lambda-tools-defaults.json │ └── dotnet-lambda-function.csproj └── test └── dotnet-lambda-function.Tests ├── FunctionTest.cs └── dotnet-lambda-function.Tests.csproj
  4. 构建和部署容器映像

    设置环境变量

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    Function.cs 代码更新为:

    dotnet-lambda-function.csproj 代码更新为:

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0>/TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> <AWSProjectType>Lambda</AWSProjectType> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup> <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="2.5.0" /> <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.4.4" /> <PackageReference Include="AWSSDK.S3" Version="3.7.305.23" /> </ItemGroup> </Project>
  5. 构建和部署容器映像

    设置环境变量

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    使用公共 Amazon ECR 进行身份验证

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws

    使用私有 Amazon ECR 进行身份验证

    aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

    创建 Amazon ECR 存储库(如果需要)

    aws ecr create-repository \ --repository-name lambda-appsignals-demo \ --region $AWS_REGION

    构建、标记和推送映像

    # Build the Docker image docker build -t lambda-appsignals-demo . # Tag the image docker tag lambda-appsignals-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest # Push the image docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest 5. Create and Configure the Lambda Function
  6. 创建并配置 Lambda 函数

    使用 Lambda 控制台创建新函数。

    选择容器映像作为部署选项。

    单击浏览映像以选择您的 Amazon ECR 映像。

  7. 测试和验证 – 使用简单的事件测试您的 Lambda。如果层集成成功,您的 Lambda 将显示在 Application Signals 服务地图下。

    可以在 CloudWatch 控制台中查看 Lambda 函数的跟踪信息和指标。

故障排除

如果 Application Signals 不起作用,请检查以下内容:

  • 检查函数日志中是否存在与 OpenTelemetry 检测相关的任何错误

  • 验证环境变量 AWS_LAMBDA_EXEC_WRAPPER 的设置是否正确

  • 确保 Docker 文件中的层提取已成功完成

  • 确认是否已正确附加 IAM 权限

  • 如果需要,可在 Lambda 函数的常规配置中增大超时和内存设置

Node.js

您可以了解如何将支持 Application Signals 的 OpenTelemetry 层集成到容器化 Node.js Lambda 函数中,下载 layer.zip 构件,然后将其集成到您的 Node.js Lambda 函数中,以启用 Application Signals 监控。

先决条件

  • 使用凭证配置的 Amazon CLI

  • 已安装 Docker

  • 这些说明假设您使用的是 x86_64 平台

  1. 设置项目结构

    为您的 Lambda 函数容器映像创建目录

    mkdir nodejs-appsignals-container-lambda &&\ cd nodejs-appsignals-container-lambda
  2. 创建 Dockerfile

    将支持 Application Signals 的 OpenTelemetry 层直接下载并集成到 Lambda 容器映像中。为此,系统创建了 Dockerfile 文件。

    # Dockerfile FROM public.ecr.aws/lambda/nodejs:22 # Install utilities RUN dnf install -y unzip wget # Download the OpenTelemetry Layer with AppSignals Support RUN wget https://github.com/aws-observability/aws-otel-js-instrumentation/releases/latest/download/layer.zip -O /tmp/layer.zip # Extract and include Lambda layer contents RUN mkdir -p /opt && \ unzip /tmp/layer.zip -d /opt/ && \ chmod -R 755 /opt/ && \ rm /tmp/layer.zip # Install npm dependencies RUN npm init -y RUN npm install # Copy function code COPY *.js ${LAMBDA_TASK_ROOT}/ # Set the CMD to your handler CMD [ "index.handler" ]
    注意

    layer.zip 文件包含支持 Amazon Application Signals 所需的 OpenTelemetry 检测,以监控您的 Lambda 函数。

    层提取步骤可确保:

    • layer.zip 内容已正确提取到 /opt/ directory

    • otel-instrument 脚本获得适当的执行权限

    • 已移除临时 layer.zip 文件,以减小映像

  3. Lambda 函数代码

    创建包含以下内容的 index.js 文件:

    const { S3Client, ListBucketsCommand } = require('@aws-sdk/client-s3'); // Initialize S3 client const s3Client = new S3Client({ region: process.env.AWS_REGION }); exports.handler = async function(event, context) { console.log('Received event:', JSON.stringify(event, null, 2)); console.log('Handler initializing:', exports.handler.name); const response = { statusCode: 200, body: {} }; try { // List S3 buckets const command = new ListBucketsCommand({}); const data = await s3Client.send(command); // Extract bucket names const bucketNames = data.Buckets.map(bucket => bucket.Name); response.body = { message: 'Successfully retrieved buckets', buckets: bucketNames }; } catch (error) { console.error('Error listing buckets:', error); response.statusCode = 500; response.body = { message: `Error listing buckets: ${error.message}` }; } return response; };

    您的项目结构应该如下所示:

    . ├── Dockerfile └── index.js
  4. 构建和部署容器映像

    设置环境变量

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    使用公共 Amazon ECR 进行身份验证

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws

    使用私有 Amazon ECR 进行身份验证

    aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

    创建 Amazon ECR 存储库(如果需要)

    aws ecr create-repository \ --repository-name lambda-appsignals-demo \ --region $AWS_REGION

    构建、标记和推送映像

    # Build the Docker image docker build -t lambda-appsignals-demo . # Tag the image docker tag lambda-appsignals-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest # Push the image docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest 5. Create and Configure the Lambda Function
  5. 创建并配置 Lambda 函数

    使用 Lambda 控制台创建新函数。

    选择容器映像作为部署选项。

    单击浏览映像以选择您的 Amazon ECR 映像。

  6. 测试和验证 – 使用简单的事件测试您的 Lambda。如果层集成成功,您的 Lambda 将显示在 Application Signals 服务地图下。

    可以在 CloudWatch 控制台中查看 Lambda 函数的跟踪信息和指标。

故障排除

如果 Application Signals 不起作用,请检查以下内容:

  • 检查函数日志中是否存在与 OpenTelemetry 检测相关的任何错误

  • 验证环境变量 AWS_LAMBDA_EXEC_WRAPPER 的设置是否正确

  • 确保 Docker 文件中的层提取已成功完成

  • 确认是否已正确附加 IAM 权限

  • 如果需要,可在 Lambda 函数的常规配置中增大超时和内存设置

Python

您可以了解如何将支持 Application Signals 的 OpenTelemetry 层集成到容器化 Python Lambda 函数中,下载 layer.zip 构件,然后将其集成到您的 Python Lambda 函数中,以启用 Application Signals 监控。

先决条件

  • 使用凭证配置的 Amazon CLI

  • 已安装 Docker

  • 这些说明假设您使用的是 x86_64 平台

  1. 设置项目结构

    为您的 Lambda 函数容器映像创建目录

    mkdir python-appsignals-container-lambda &&\ cd python-appsignals-container-lambda
  2. 创建 Dockerfile

    将支持 Application Signals 的 OpenTelemetry 层直接下载并集成到 Lambda 容器映像中。为此,系统创建了 Dockerfile 文件。

    注意

    layer.zip 文件包含支持 Amazon Application Signals 所需的 OpenTelemetry 检测,以监控您的 Lambda 函数。

    层提取步骤可确保:

    • layer.zip 内容已正确提取到 /opt/ directory

    • otel-instrument 脚本获得适当的执行权限

    • 已移除临时 layer.zip 文件,以减小映像

  3. Lambda 函数代码

    app.py 文件中创建 Lambda 函数:

    import json import boto3 def lambda_handler(event, context): """ Sample Lambda function that can be used in a container image. Parameters: ----------- event: dict Input event data context: LambdaContext Lambda runtime information Returns: __ dict Response object """ print("Received event:", json.dumps(event, indent=2)) # Create S3 client s3 = boto3.client('s3') try: # List buckets response = s3.list_buckets() # Extract bucket names buckets = [bucket['Name'] for bucket in response['Buckets']] return { 'statusCode': 200, 'body': json.dumps({ 'message': 'Successfully retrieved buckets', 'buckets': buckets }) } except Exception as e: print(f"Error listing buckets: {str(e)}") return { 'statusCode': 500, 'body': json.dumps({ 'message': f'Error listing buckets: {str(e)}' }) }

    您的项目结构应该如下所示:

    . ├── Dockerfile ├── app.py └── instructions.md
  4. 构建和部署容器映像

    设置环境变量

    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) AWS_REGION=$(aws configure get region) # For fish shell users: # set AWS_ACCOUNT_ID (aws sts get-caller-identity --query Account --output text) # set AWS_REGION (aws configure get region)

    使用公共 Amazon ECR 进行身份验证

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws

    使用私有 Amazon ECR 进行身份验证

    aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

    创建 Amazon ECR 存储库(如果需要)

    aws ecr create-repository \ --repository-name lambda-appsignals-demo \ --region $AWS_REGION

    构建、标记和推送映像

    # Build the Docker image docker build -t lambda-appsignals-demo . # Tag the image docker tag lambda-appsignals-demo:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest # Push the image docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/lambda-appsignals-demo:latest 5. Create and Configure the Lambda Function
  5. 创建并配置 Lambda 函数

    使用 Lambda 控制台创建新函数。

    选择容器映像作为部署选项。

    单击浏览映像以选择您的 Amazon ECR 映像。

  6. 测试和验证 – 使用简单的事件测试您的 Lambda。如果层集成成功,您的 Lambda 将显示在 Application Signals 服务地图下。

    可以在 CloudWatch 控制台中查看 Lambda 函数的跟踪信息和指标。

故障排除

如果 Application Signals 不起作用,请检查以下内容:

  • 检查函数日志中是否存在与 OpenTelemetry 检测相关的任何错误

  • 验证环境变量 AWS_LAMBDA_EXEC_WRAPPER 的设置是否正确

  • 确保 Docker 文件中的层提取已成功完成

  • 确认是否已正确附加 IAM 权限

  • 如果需要,可在 Lambda 函数的常规配置中增大超时和内存设置