在 Lambda 上启用应用程序 - Amazon CloudWatch

在 Lambda 上启用应用程序

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

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

您还可以使用事务搜索来增强 Lambda 的可观测性,这样无需采样即可捕获 Lambda 函数调用的跟踪跨度。通过此功能,您可以收集函数的跨度,而不受跟踪上下文传播中 sampled 标志的影响。这可确保不会对下游依赖服务产生额外影响。通过在 Lambda 上启用事务搜索,您可以全面了解自己的函数性能,并可以解决很少发生的问题。要了解其用法,请参阅 Transaction Search

开始使用

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

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

  • 使用 CloudWatch Application Signals 控制台

  • 使用 Lambda 控制台

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

每一种方法都会将 AWS 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/ 打开 AWS Lambda 控制台。

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

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

  4. 选择编辑

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

  6. 选择保存

使用 AWS 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 替换为您所在区域实际的 AWS 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");

使用模型上下文协议(MCP)服务器在 Lambda 上启用 Application Signals

您可以使用 CloudWatch Application Signals 模型上下文协议(MCP)服务器,通过对话式人工智能交互在 Lambda 函数上启用 Application Signals。这为设置 Application Signals 监控提供了自然语言界面。

MCP 服务器通过理解您的需求并生成相应的配置来自动执行启用过程。您只需简单描述要启用的功能,无需手动执行控制台步骤或编写 CDK 代码。

先决条件

在使用 MCP 服务器启用 Application Signals 之前,请确保满足以下条件:

  • 支持 MCP 的开发环境(例如 Kiro、Claude Desktop、带有 MCP 扩展的 VSCode 或其他与 MCP 兼容的工具)

  • 已在 IDE 中配置 CloudWatch Application Signals MCP 服务器。有关详细的设置说明,请参阅 CloudWatch Application Signals MCP 服务器文档

使用 MCP 服务器

在 IDE 中配置好 CloudWatch Application Signals MCP 服务器后,即可使用自然语言提示来请求启用指导。尽管编码助手可以从项目结构中推断出上下文,但在提示中提供具体细节有助于确保获得更准确、更相关的指导。包括一些信息,例如 Lambda 函数的编程语言、函数名称以及 Lambda 函数代码和基础设施代码的绝对路径等等。

最佳实践提示(具体且完整):

"Enable Application Signals for my Python Lambda function. My function code is in /home/user/order-processor/lambda and IaC is in /home/user/order-processor/terraform" "I want to add observability to my Node.js Lambda function 'checkout-handler'. The function code is at /Users/dev/checkout-function and the CDK infrastructure is at /Users/dev/checkout-function/cdk" "Help me instrument my Java Lambda function with Application Signals. Function directory: /opt/apps/payment-lambda CDK infrastructure: /opt/apps/payment-lambda/cdk"

效果较差的提示:

"Enable monitoring for my Lambda" → Missing: language, paths "Enable Application Signals. My code is in ./src and IaC is in ./infrastructure" → Problem: Relative paths instead of absolute paths "Enable Application Signals for my Lambda at /home/user/myfunction" → Missing: programming language

快速模板:

"Enable Application Signals for my [LANGUAGE] Lambda function. Function code: [ABSOLUTE_PATH_TO_FUNCTION] IaC code: [ABSOLUTE_PATH_TO_IAC]"

使用 MCP 服务器的优势

使用 CloudWatch Application Signals MCP 服务器具有以下优势:

  • 自然语言界面:无需记住命令或配置语法,即可描述要启用的功能

  • 上下文感知指导:MCP 服务器了解特定环境并提供量身定制的建议

  • 减少错误:自动生成配置可最大限度地减少手动输入错误

  • 更快设置:更快地将想法过渡到实施

  • 学习工具:查看生成的配置,了解 Application Signals 的工作原理

有关配置和使用 CloudWatch Application Signals MCP 服务器的更多信息,请参阅 MCP 服务器文档

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

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

手动启用 Application Signals。

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

  1. 手动将 AWS Lambda Layer for OpenTelemetry ARN 添加到 Lambda 运行时。要查找您所在区域的层 ARN,请参阅 ADOT Lambda Layer ARNs

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

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

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

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

手动禁用 Application Signals

要为 Lambda 函数手动禁用 Application Signals,请从 Lambda 运行时中移除 AWS 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 启用 AWS SDK 和 HTTP 检测。您可以设置环境变量,以便针对 Lambda 函数中使用的其他库启用检测。

  • Python – OTEL_PYTHON_DISABLED_INSTRUMENTATIONS=none

  • 节点 – OTEL_NODE_DISABLED_INSTRUMENTATIONS=none

  • Java - OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED=true

AWS Lambda Layer for OpenTelemetry ARN

有关按区域和运行时划分的 AWS Lambda Layer for OpenTelemetry ARNs 完整列表,请参阅适用于 OpenTelemetry 的 AWS Distro 文档中的 ADOT Lambda Layer ARNs。该层可用于 Python、Node.js、.NET 和 Java 运行时。

使用 Amazon ECR 容器部署 Lambda 函数

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

Java

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

先决条件

  • 使用凭证配置的 AWS 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 文件包含支持 AWS 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 监控。

先决条件

  • 使用凭证配置的 AWS 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 文件包含支持 AWS Application Signals 所需的 OpenTelemetry 检测,以监控您的 Lambda 函数。

    层提取步骤可确保:

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

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

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

  3. Lambda 函数代码:使用 AWS 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 监控。

先决条件

  • 使用凭证配置的 AWS 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 文件包含支持 AWS 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 监控。

先决条件

  • 使用凭证配置的 AWS CLI

  • 已安装 Docker

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

  1. 设置项目结构

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

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

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

    # Dockerfile FROM public.ecr.aws/lambda/python:3.13 # Copy function code COPY app.py ${LAMBDA_TASK_ROOT} # Install unzip and wget utilities RUN dnf install -y unzip wget # Download the OpenTelemetry Layer with AppSignals Support RUN wget https://github.com/aws-observability/aws-otel-python-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 # Set the CMD to your handler CMD [ "app.lambda_handler" ]
    注意

    layer.zip 文件包含支持 AWS 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 函数的常规配置中增大超时和内存设置