

# Lambda でアプリケーションを有効にする
<a name="CloudWatch-Application-Signals-Enable-LambdaMain"></a>

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 でトランザクション検索を有効にすることにより、関数のパフォーマンスを完全に可視化でき、まれに発生する問題をトラブルシューティングできます。開始するには、「[トランザクション検索](CloudWatch-Transaction-Search.md)」を参照してください。

**Topics**
+ [開始方法](#Application-Signals-Enable-Lambda-Methods-Getting-Started)
+ [CloudWatch Application Signals コンソールの使用](#Enable-Lambda-CWConsole)
+ [Lambda のコンソールを開く](#Enable-Lambda-LambdaConsole)
+ [AWS CDK を使用して Lambda で Application Signals を有効にする](#CloudWatch-Application-Signals-Lambda-CDK)
+ [モデルコンテキストプロトコル (MCP) を使用して Lambda で Application Signals を有効にする](#CloudWatch-Application-Signals-Lambda-MCP)
+ [(オプション) アプリケーションの状態をモニタリングする](#CloudWatch-Application-Signals-Monitor-Lambda)
+ [Application Signals を手動で有効にします。](#Enable-Lambda-Manually)
+ [Application Signals を手動で無効化](#Disable-Lambda-Manually)
+ [Application Signals を設定する](#Configuring-Lambda-AppSignals)
+ [AWS Lambda Layer for OpenTelemetry ARN](#Enable-Lambda-Layers)
+ [Amazon ECR コンテナを使用して Lambda 関数をデプロイする](#containerized-lambda)

## 開始方法
<a name="Application-Signals-Enable-Lambda-Methods-Getting-Started"></a>

Lambda 関数で Application Signals を有効にするには、3 つの方法があります。

Lambda 関数で Application Signals を有効にしたら、その関数からのテレメトリが Application Signals コンソールに表示されるまでに数分かかります。
+ CloudWatch Application Signals コンソールの使用
+ Lambda のコンソールを開く
+ AWS Lambda Layer for OpenTelemetry を Lambda 関数ランタイムに手動で追加します。

これらの各メソッドは、AWS Lambda Layer for OpenTelemetry を関数に追加します。

## CloudWatch Application Signals コンソールの使用
<a name="Enable-Lambda-CWConsole"></a>

次の手順に従って Application Signals コンソールを使用し、Lambda 関数で Application Signals を有効にします。

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. ナビゲーションペインで、**[Application Signals]**、**[サービス]** の順に選択します。

1. **[サービス]** リスト領域で、**[Application Signals の有効化]** を選択します。

1. **[Lambda]** タブを選択します。

1. Application Signals で有効にする各関数を選択したら、**[完了]** を選択します。

## Lambda のコンソールを開く
<a name="Enable-Lambda-LambdaConsole"></a>

次の手順に従って Lambda コンソールを使用し、Lambda 関数で Application Signals を有効にします。

1. AWS Lambda コンソールの [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) を開いてください。

1. ナビゲーションペインで **[関数]** を選択したら、有効にする関数の名前を選択します。

1. **[設定]** タブを選択したら、**[モニタリングと運用ツール]** を選択します。

1. **[編集]** を選択します。

1. **[CloudWatch Application Signals と X-Ray]** セクションで、**[Application Signals を使用してアプリケーショントレースと標準アプリケーションメトリクスを自動的に収集]** および **[X-Ray を使用してエンドツーエンドの可視性を実現する Lambda サービストレースを自動的に収集]** の両方を選択します。

1. **[保存]** を選択します。

## AWS CDK を使用して Lambda で Application Signals を有効にする
<a name="CloudWatch-Application-Signals-Lambda-CDK"></a>

 このアカウントで Application Signals をまだ有効にしていない場合は、サービスの検出に必要なアクセス権限を Application Signals に付与する必要があります。詳細については、「[アカウントで Application Signals を有効にする](CloudWatch-Application-Signals-Enable.md)」を参照してください。

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 のサービスリンクロールのアクセス許可](using-service-linked-roles.md#service-linked-role-signals)」を参照してください。

1. 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'));
   ```

1. `$AWS_LAMBDA_LAYER_FOR_OTEL_ARN` をリージョンの実際の [AWS Lambda Layer for OpenTelemetry ARN](https://aws-otel.github.io/docs/getting-started/lambda#adot-lambda-layer-arns) に置き換えます。

   ```
   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 を有効にする
<a name="CloudWatch-Application-Signals-Lambda-MCP"></a>

CloudWatch Application Signals モデルコンテキストプロトコル (MCP) サーバーを使用して、会話で AI とやり取りして Lambda 関数で Application Signals を有効にできます。これは、Application Signals モニタリングを設定するための自然言語インターフェイスになります。

MCP サーバーは、要件を理解し、適切な設定を生成することで、有効化プロセスを自動化します。コンソールの手順を手動で実行したり、CDK コードを記述したりする代わりに、有効にする内容を記述するだけで済みます。

### 前提条件
<a name="CloudWatch-Application-Signals-Lambda-MCP-Prerequisites"></a>

MCP サーバーを使用して Application Signals を有効にする前に、以下を用意します。
+ MCP をサポートする開発環境 (Kiro、Claude Desktop、MCP 拡張機能付きの VSCode、その他の MCP 互換ツールなど)
+ IDE で設定された CloudWatch Application Signals MCP サーバー。詳細な設定手順については、[CloudWatch Application Signals MCP サーバーのドキュメント](https://awslabs.github.io/mcp/servers/cloudwatch-applicationsignals-mcp-server)を参照してください。

### MCP サーバーの使用
<a name="CloudWatch-Application-Signals-Lambda-MCP-Usage"></a>

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 サーバーを使用する利点
<a name="CloudWatch-Application-Signals-Lambda-MCP-Benefits"></a>

CloudWatch Application Signals MCP サーバーを使用すると、次のようないくつかの利点があります。
+ **自然言語インターフェイス:** コマンドや設定構文を覚えずに、有効にする内容を記述
+ **コンテキストに応じたガイダンス:** MCP サーバーは具体的な環境を理解し、カスタマイズされた推奨事項を提供
+ **エラーの削減:** 設定の自動生成により、手動入力エラーが最小限
+ **設定の高速化:** 意図から実装までの時間を短縮
+ **学習ツール:** 生成された設定を確認し、Application Signals の仕組みを理解

CloudWatch Application Signals MCP サーバーの設定と使用の詳細については、[MCP サーバーのドキュメント](https://awslabs.github.io/mcp/servers/cloudwatch-applicationsignals-mcp-server)を参照してください。

## (オプション) アプリケーションの状態をモニタリングする
<a name="CloudWatch-Application-Signals-Monitor-Lambda"></a>

Lambda でアプリケーションを有効にすると、アプリケーションの状態をモニタリングできます。詳細については、「[Application Signals を使用したアプリケーションの運用状態のモニタリング](Services.md)」を参照してください。

## Application Signals を手動で有効にします。
<a name="Enable-Lambda-Manually"></a>

Lambda 関数の Application Signals を手動で有効にするには、次の手順に従います。

1. AWS Lambda Layer for OpenTelemetry を Lambda ランタイムに追加します。リージョンのレイヤー ARN を確認するには、「[ADOT Lambda Layer ARNs](https://aws-otel.github.io/docs/getting-started/lambda#adot-lambda-layer-arns)」を参照してください。

1. `AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument` 環境変数の追加

   環境変数 `LAMBDA_APPLICATION_SIGNALS_REMOTE_ENVIRONMENT` を追加してカスタム Lambda 環境を設定します。デフォルトでは、Lambda 環境は `lambda:default` に設定されています。

1. AWS マネージド IAM ポリシー **[CloudWatchLambdaApplicationSignalsExecutionRolePolicy]** を Lambda 実行ロールにアタッチします。

1. (オプション) Lambda アクティブトレースを有効にし、トレースエクスペリエンスの向上を実現することをお勧めします。詳細については、「[AWS X-Ray を使用して Lambda 関数の呼び出しの視覚化](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html)」を参照してください。

## Application Signals を手動で無効化
<a name="Disable-Lambda-Manually"></a>

Lambda 関数で Application Signals を手動で無効にするには、Lambda ランタイムから AWS Lambda Layer for OpenTelemetry を削除し、`AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument` 環境変数を削除します。

## Application Signals を設定する
<a name="Configuring-Lambda-AppSignals"></a>

このセクションを使用して、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 環境変数の仕様](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/)」を参照してください。

 **すべてのライブラリ計測を有効にする** 

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
<a name="Enable-Lambda-Layers"></a>

リージョンとランタイム別の AWS Lambda Layer for OpenTelemetry ARNs の完全なリストについては、AWS Distro for OpenTelemetry ドキュメントの「[ADOT Lambda Layer ARNs](https://aws-otel.github.io/docs/getting-started/lambda#adot-lambda-layer-arns)」を参照してください。レイヤーは、Python、Node.js、.NET、Java ランタイムで使用できます。

## Amazon ECR コンテナを使用して Lambda 関数をデプロイする
<a name="containerized-lambda"></a>

コンテナイメージとしてデプロイされた Lambda 関数は、従来の方法の Lambda レイヤーをサポートしていません。コンテナイメージを使用する場合、他の Lambda デプロイ方法と同様にレイヤーをアタッチすることはできません。代わりに、ビルドプロセス中にレイヤーの内容をコンテナイメージに手動で組み込む必要があります。

------
#### [ Java ]

AWS Lambda Layer for OpenTelemetry をコンテナ化された Java Lambda 関数に統合し、`layer.zip` アーティファクトをダウンロードして、それを Java Lambda 関数コンテナに統合することによって Application Signals モニタリングを有効にする方法について説明します。

**前提条件**
+ 認証情報を使って設定した AWS CLI
+ インストールされている Docker
+ これらの手順は、x86\$164 プラットフォームを使用していることを前提としています。

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
   ```

1. **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 ファイルが削除される

1. **Lambda 関数コード** – `src/main/java/com/example/lambda/App.java:` で Lambda ハンドラーの Java ファイルを作成します

   プロジェクトは次のようになります。

   ```
   .
   ├── Dockerfile
   ├── pom.xml
   └── src
       └── main
           ├── java
           │   └── com
           │       └── example
           │           └── java
           │               └── lambda
           │                   └── App.java
           └── resources
   ```

1. **コンテナイメージをビルドしてデプロイする**

   **環境変数をセットアップする**

   ```
   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
   ```

1. **Lambda 関数を作成して設定する**

   Lambda コンソールを使用して関数を新規作成します。

   デプロイオプションとして **[コンテナイメージ]** を選択します。

   **[イメージを参照]** を選択して、Amazon ECR イメージを選択します。

1. **テストと検証 – シンプルなイベントで 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 モニタリングを有効にする方法について説明します。

**前提条件**
+ 認証情報を使って設定した AWS CLI
+ インストールされている Docker
+ .Net 8 SDK
+ これらの手順は、x86\$164 プラットフォームを使用していることを前提としています。

1. **プロジェクト構造のセットアップ**

   Lambda 関数コンテナイメージ用のディレクトリを作成する

   ```
   mkdir dotnet-appsignals-container-lambda && \
   cd dotnet-appsignals-container-lambda
   ```

1. **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 ファイルが削除される

1. **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
   ```

1. **コンテナイメージをビルドしてデプロイする**

   **環境変数をセットアップする**

   ```
   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>
   ```

1. **コンテナイメージをビルドしてデプロイする**

   環境変数をセットアップする

   ```
   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
   ```

1. **Lambda 関数を作成して設定する**

   Lambda コンソールを使用して関数を新規作成します。

   デプロイオプションとして **[コンテナイメージ]** を選択します。

   **[イメージを参照]** を選択して、Amazon ECR イメージを選択します。

1. **テストと検証 – シンプルなイベントで 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 モニタリングを有効にする方法について説明します。

**前提条件**
+ 認証情報を使って設定した AWS CLI
+ インストールされている Docker
+ これらの手順は、x86\$164 プラットフォームを使用していることを前提としています。

1. **プロジェクト構造のセットアップ**

   Lambda 関数コンテナイメージ用のディレクトリを作成する

   ```
   mkdir nodejs-appsignals-container-lambda &&\
   cd nodejs-appsignals-container-lambda
   ```

1. **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 ファイルが削除される

1. **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
   ```

1. **コンテナイメージをビルドしてデプロイする**

   **環境変数をセットアップする**

   ```
   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
   ```

1. **Lambda 関数を作成して設定する**

   Lambda コンソールを使用して関数を新規作成します。

   デプロイオプションとして **[コンテナイメージ]** を選択します。

   **[イメージを参照]** を選択して、Amazon ECR イメージを選択します。

1. **テストと検証 – シンプルなイベントで 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 モニタリングを有効にする方法について説明します。

**前提条件**
+ 認証情報を使って設定した AWS CLI
+ インストールされている Docker
+ これらの手順は、x86\$164 プラットフォームを使用していることを前提としています。

1. **プロジェクト構造のセットアップ**

   Lambda 関数コンテナイメージ用のディレクトリを作成する

   ```
   mkdir python-appsignals-container-lambda &&\
   cd python-appsignals-container-lambda
   ```

1. **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 ファイルが削除される

1. **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
   ```

1. **コンテナイメージをビルドしてデプロイする**

   **環境変数をセットアップする**

   ```
   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
   ```

1. **Lambda 関数を作成して設定する**

   Lambda コンソールを使用して関数を新規作成します。

   デプロイオプションとして **[コンテナイメージ]** を選択します。

   **[イメージを参照]** を選択して、Amazon ECR イメージを選択します。

1. **テストと検証 – シンプルなイベントで Lambda をテストします。レイヤーの統合に成功すると、Lambda が Application Signals サービスマップの下に表示されます。**

   CloudWatch コンソールに Lambda 関数のトレースとメトリクスが表示されます。

**トラブルシューティング**

Application Signals が機能しない場合は、以下を確認してください。
+ OpenTelemetry 計測に関連するエラーがないか関数ログを確認する
+ 環境変数 `AWS_LAMBDA_EXEC_WRAPPER` が正しく設定されているかどうかを確認する
+ Docker ファイル内のレイヤー抽出が正常に完了していることを確認する
+ IAM アクセス許可が正しくアタッチされているかどうかを確認する
+ 必要に応じて、Lambda 関数の全般設定にある *[タイムアウトとメモリ]* の設定を増やします

------