在 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 控制台中。
每一种方法都会将 AWS Lambda Layer for OpenTelemetry 添加到函数。
使用 CloudWatch Application Signals 控制台
按照以下步骤使用 Application Signals 控制台为 Lambda 函数启用 Application Signals。
使用 Lambda 控制台
按照以下步骤使用 Lambda 控制台为 Lambda 函数启用 Application Signals。
使用 AWS CDK 在 Lambda 上启用 Application Signals
如果您尚未在此账户中启用 Application Signals,则必须向 Application Signals 授予发现您的服务所需的权限。有关更多信息,请参阅 在账户中启用 Application Signals。
-
为您的应用程序启用 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 的服务相关角色权限。
-
向 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'));
-
请将 $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 服务器
在 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。
-
手动将 AWS Lambda Layer for OpenTelemetry ARN 添加到 Lambda 运行时。要查找您所在区域的层 ARN,请参阅 ADOT Lambda Layer ARNs。
-
添加环境变量 AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument
添加环境变量 LAMBDA_APPLICATION_SIGNALS_REMOTE_ENVIRONMENT 以配置自定义 Lambda 环境。lambda 环境默认配置为 lambda:default。
-
将 AWS 托管式 IAM 策略 CloudWatchLambdaApplicationSignalsExecutionRolePolicy 策略附加到 Lambda 执行角色。
-
(可选)我们建议您启用 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 平台
-
设置项目结构
为 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
-
创建 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 函数。
层提取步骤可确保:
-
Lambda 函数代码:在 src/main/java/com/example/lambda/App.java: 为您的 Lambda 处理程序创建 Java 文件
您的项目应该如下所示:
.
├── Dockerfile
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── example
│ └── java
│ └── lambda
│ └── App.java
└── resources
-
构建和部署容器映像
设置环境变量
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
-
创建并配置 Lambda 函数
使用 Lambda 控制台创建新函数。
选择容器映像作为部署选项。
单击浏览映像以选择您的 Amazon ECR 映像。
-
测试和验证 – 使用简单的事件测试您的 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 平台
-
设置项目结构
为您的 Lambda 函数容器映像创建目录
mkdir dotnet-appsignals-container-lambda && \
cd dotnet-appsignals-container-lambda
-
创建 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 函数。
层提取步骤可确保:
-
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
-
构建和部署容器映像
设置环境变量
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>
-
构建和部署容器映像
设置环境变量
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
-
创建并配置 Lambda 函数
使用 Lambda 控制台创建新函数。
选择容器映像作为部署选项。
单击浏览映像以选择您的 Amazon ECR 映像。
-
测试和验证 – 使用简单的事件测试您的 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 平台
-
设置项目结构
为您的 Lambda 函数容器映像创建目录
mkdir nodejs-appsignals-container-lambda &&\
cd nodejs-appsignals-container-lambda
-
创建 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 函数。
层提取步骤可确保:
-
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
-
构建和部署容器映像
设置环境变量
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
-
创建并配置 Lambda 函数
使用 Lambda 控制台创建新函数。
选择容器映像作为部署选项。
单击浏览映像以选择您的 Amazon ECR 映像。
-
测试和验证 – 使用简单的事件测试您的 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 平台
-
设置项目结构
为您的 Lambda 函数容器映像创建目录
mkdir python-appsignals-container-lambda &&\
cd python-appsignals-container-lambda
-
创建 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 函数。
层提取步骤可确保:
-
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
-
构建和部署容器映像
设置环境变量
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
-
创建并配置 Lambda 函数
使用 Lambda 控制台创建新函数。
选择容器映像作为部署选项。
单击浏览映像以选择您的 Amazon ECR 映像。
-
测试和验证 – 使用简单的事件测试您的 Lambda。如果层集成成功,您的 Lambda 将显示在 Application Signals 服务地图下。
可以在 CloudWatch 控制台中查看 Lambda 函数的跟踪信息和指标。
故障排查
如果 Application Signals 不起作用,请检查以下内容:
-
检查函数日志中是否存在与 OpenTelemetry 检测相关的任何错误
-
验证环境变量 AWS_LAMBDA_EXEC_WRAPPER 的设置是否正确
-
确保 Docker 文件中的层提取已成功完成
-
确认是否已正确附加 IAM 权限
-
如果需要,可在 Lambda 函数的常规配置中增大超时和内存设置