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 でトランザクション検索を有効にすることにより、関数のパフォーマンスを完全に可視化でき、まれに発生する問題をトラブルシューティングできます。開始するには、「トランザクション検索」を参照してください。
開始方法
Lambda 関数で Application Signals を有効にするには、3 つの方法があります。
Lambda 関数で Application Signals を有効にしたら、その関数からのテレメトリが Application Signals コンソールに表示されるまでに数分かかります。
これらの各メソッドは、AWS Lambda Layer for OpenTelemetry を関数に追加します。
CloudWatch Application Signals コンソールの使用
次の手順に従って Application Signals コンソールを使用し、Lambda 関数で Application Signals を有効にします。
Lambda のコンソールを開く
次の手順に従って Lambda コンソールを使用し、Lambda 関数で Application Signals を有効にします。
AWS Lambda コンソールの https://console.aws.amazon.com/lambda/ を開いてください。
-
ナビゲーションペインで [関数] を選択したら、有効にする関数の名前を選択します。
-
[設定] タブを選択したら、[モニタリングと運用ツール] を選択します。
-
[編集] を選択します。
-
[CloudWatch Application Signals と X-Ray] セクションで、[Application Signals を使用してアプリケーショントレースと標準アプリケーションメトリクスを自動的に収集] および [X-Ray を使用してエンドツーエンドの可視性を実現する Lambda サービストレースを自動的に収集] の両方を選択します。
-
[保存] を選択します。
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) サーバーを使用して、会話で AI とやり取りして 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 を 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 を削除し、AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument 環境変数を削除します。
Application Signals を設定する
このセクションを使用して、Lambda で Application Signals を設定できます。
複数の Lambda 関数を 1 つのサービスにグループ化する
環境変数 OTEL_SERVICE_NAME はサービスの名前を設定します。これは、Application Signals ダッシュボードにアプリケーションのサービス名として表示されます。同じサービス名を複数の Lambda 関数に割り当てることができ、それらは Application Signals の単一のサービスにマージされます。このキーの値を指定しない場合はデフォルトの Lambda 関数の名前が使用されます。
サンプリング
デフォルトでは、トレースサンプリング戦略は親ベースとなります。環境変数 OTEL_TRACES_SAMPLER を設定することで、サンプリング戦略を調整できます。
例えば、トレースサンプリングレートを 30% に設定します。
OTEL_TRACES_SAMPLER=traceidratio
OTEL_TRACES_SAMPLER_ARG=0.3
詳細については、「OpenTelemetry 環境変数の仕様」を参照してください。
すべてのライブラリ計測を有効にする
Lambda コールドスタートを減らすために、デフォルトでは、Python、Node、Java に対して AWS SDK と HTTP の計測のみが有効になっています。環境変数を設定して、Lambda 関数で使用される他のライブラリの計測を有効にできます。
-
Python – OTEL_PYTHON_DISABLED_INSTRUMENTATIONS=none
-
Node – OTEL_NODE_DISABLED_INSTRUMENTATIONS=none
-
Java – OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED=true
AWS Lambda Layer for OpenTelemetry ARN
リージョンとランタイム別の AWS Lambda Layer for OpenTelemetry ARNs の完全なリストについては、AWS Distro for OpenTelemetry ドキュメントの「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 モニタリングを有効にする方法について説明します。
前提条件
-
プロジェクト構造のセットアップ
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 を作成する
OpenTelemetry Layer と Application Signals のサポートをダウンロードして、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 ファイルには、Lambda 関数をモニタリングする AWS Application Signals のサポートに必要な OpenTelemetry 計測が含まれています。
レイヤー抽出ステップにより、以下が保証されます。
-
layer.zip のコンテンツが /opt/ directory に適切に抽出される
-
otel-instrument スクリプトに適切な実行アクセス許可が付与される
-
イメージサイズを小さく保つために一時 Layer.zip ファイルが削除される
-
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
-
OpenTelemetry Layer と Application Signals のサポートをコンテナ化された .Net Lambda 関数に統合し、layer.zip アーティファクトをダウンロードして、それを .Net Lambda 関数コンテナに統合することによって Application Signals モニタリングを有効にする方法について説明します。
前提条件
-
プロジェクト構造のセットアップ
Lambda 関数コンテナイメージ用のディレクトリを作成する
mkdir dotnet-appsignals-container-lambda && \
cd dotnet-appsignals-container-lambda
-
Dockerfile を作成する
OpenTelemetry Layer と Application Signals のサポートをダウンロードして、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 ファイルには、Lambda 関数をモニタリングする AWS Application Signals のサポートに必要な OpenTelemetry 計測が含まれています。
レイヤー抽出ステップにより、以下が保証されます。
-
layer.zip のコンテンツが /opt/ directory に適切に抽出される
-
otel-instrument スクリプトに適切な実行アクセス許可が付与される
-
イメージサイズを小さく保つために一時 Layer.zip ファイルが削除される
-
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
-
OpenTelemetry Layer と Application Signals のサポートをコンテナ化された Node.js Lambda 関数に統合し、layer.zip アーティファクトをダウンロードして、それを Node.js Lambda 関数コンテナに統合することによって Application Signals モニタリングを有効にする方法について説明します。
前提条件
-
プロジェクト構造のセットアップ
Lambda 関数コンテナイメージ用のディレクトリを作成する
mkdir nodejs-appsignals-container-lambda &&\
cd nodejs-appsignals-container-lambda
-
Dockerfile を作成する
OpenTelemetry Layer と Application Signals のサポートをダウンロードして、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 ファイルには、Lambda 関数をモニタリングする AWS Application Signals のサポートに必要な OpenTelemetry 計測が含まれています。
レイヤー抽出ステップにより、以下が保証されます。
-
layer.zip のコンテンツが /opt/ directory に適切に抽出される
-
otel-instrument スクリプトに適切な実行アクセス許可が付与される
-
イメージサイズを小さく保つために一時 Layer.zip ファイルが削除される
-
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
-
OpenTelemetry Layer と Application Signals のサポートをコンテナ化された Python Lambda 関数に統合し、layer.zip アーティファクトをダウンロードして、それを Python Lambda 関数コンテナに統合することによって Application Signals モニタリングを有効にする方法について説明します。
前提条件
-
プロジェクト構造のセットアップ
Lambda 関数コンテナイメージ用のディレクトリを作成する
mkdir python-appsignals-container-lambda &&\
cd python-appsignals-container-lambda
-
Dockerfile を作成する
OpenTelemetry Layer と Application Signals のサポートをダウンロードして、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 ファイルには、Lambda 関数をモニタリングする AWS Application Signals のサポートに必要な OpenTelemetry 計測が含まれています。
レイヤー抽出ステップにより、以下が保証されます。
-
layer.zip のコンテンツが /opt/ directory に適切に抽出される
-
otel-instrument スクリプトに適切な実行アクセス許可が付与される
-
イメージサイズを小さく保つために一時 Layer.zip ファイルが削除される
-
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 関数の全般設定にある [タイムアウトとメモリ] の設定を増やします