

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS Lambda リモートデバッグ
<a name="lambda-remote-debug"></a>

 AWS Toolkit for Visual Studio Code を使用すると、クラウドで実行されている AWS Lambda 関数を VS Code で直接デバッグできます。 AWS Lambda リモートデバッグを使用すると、既存の開発ワークフローを変更することなく、実行中の関数の検査、ブレークポイントの設定、変数の検査、ステップスルーデバッグを行うことができます。

以下のセクションでは、 AWS Toolkit for Visual Studio Codeで Lambda リモートデバッグを使用する方法について説明します。

## Lambda リモートデバッグの仕組み
<a name="w2aac17c43c19b7"></a>

Toolkit は、追加の Lambda デバッグレイヤーを使用して Lambda 関数を一時的に変更し、Lambda 呼び出しタイムアウト制限を 900 秒に延長することで、リモートデバッグ AWS を有効にします。 AWS IoT セキュアトンネリングを使用して、ローカルデバッガーと Lambda ランタイム環境の間に安全な接続が確立されます。この接続により、ローカルコードブレークポイントを使用して、関数がリモートで実行される際にステップ実行できます。デバッグセッションが完了すると、すべての一時的な変更は自動的に元の設定に戻ります。

## 開始方法
<a name="w2aac17c43c19b9"></a>

### ランタイムのサポート
<a name="w2aac17c43c19b9b3"></a>

Lambda リモートデバッグは、次のランタイムをサポートしています。
+ Python (Amazon Linux 2023)
+ Java
+ Typescript/JavaScript/Node.js (Amazon Linux 2023)

**注記**  
Lambda マネージドインスタンスと OCI イメージ関数タイプは、Lambda リモートデバッグではサポートされていません。

### 前提条件
<a name="w2aac17c43c19b9b5"></a>

開始するには、以下の前提条件を満たしておく必要があります。
+ Toolkit で有効な AWS 認証情報を設定する必要があります AWS 。 AWS Toolkit のインストールと認証情報の設定の詳細については、このユーザーガイドの[「開始方法](https://docs.aws.amazon.com//toolkit-for-vscode/latest/userguide/setting-up.html)」トピックを参照してください。
+ Lambda 関数が AWS アカウントにデプロイされました。Lambda 関数のデプロイの詳細については、「*AWS Lambda* デベロッパーガイド」の「[最初の Lambda 関数の作成](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)」トピックを参照してください。
+ 関数をデバッグするには、適切な AWS Identity and Access Management (IAM) ポリシーとアクセス許可が必要です。Lambda のアクセス許可の詳細については、「*AWS Lambda* デベロッパーガイド」の「[AWS LambdaのAWS 管理ポリシー](https://docs.aws.amazon.com//lambda/latest/dg/security-iam-awsmanpol.html)」トピックを参照してください。以下は、 AWS ツールキットで Lambda リモートデバッグを使用するために必要な最低限のアクセス許可を含むポリシーの例です。
**注記**  
リモートデバッグは、 AWS AWS IoT セキュアトンネリングを通じて有効になります。これにより、ローカルデバッガーは Lambda ランタイム環境への安全な接続を確立できます。

  ```
  {
    "Version": "2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lambda:ListFunctions",
          "lambda:GetFunction",
          "lambda:GetFunctionConfiguration",
          "lambda:GetLayerVersion",
          "lambda:UpdateFunctionConfiguration",
          "lambda:InvokeFunction",
          "lambda:PublishVersion",
          "lambda:DeleteFunction",
          "iot:OpenTunnel",
          "iot:RotateTunnelAccessToken",
          "iot:ListTunnels"
        ],
        "Resource": "*"
      }
    ]
  }
  ```

## Lambda リモートデバッグへのアクセス
<a name="w2aac17c43c19c11"></a>

 AWS Toolkit で Lambda リモートデバッグにアクセスするには、 AWS エクスプローラーまたは Application Builder エクスプローラーの 2 つの主要なパスがあります。 AWS エクスプローラーから、ノードを介して AWS Lambda Lambda リモートデバッグにアクセスできます。アプリケーションビルダーエクスプローラーから、ローカル AWS SAM プロジェクトを通じて Lambda リモートデバッグにアクセスできます。

**AWS エクスプローラーからの Lambda リモートデバッグへのアクセス**

1. VS Code から Toolkit AWS 拡張機能を開きます。

1. Toolkit から AWS 、 AWS エクスプローラーを展開します。

1. エクスプローラーから、**[Lambda]** ノードを展開します。

1. デバッグする関数に移動し、コンテキストメニューから **[リモート呼び出し]** アイコンを選択して **[リモート呼び出し設定]** 画面を開きます。

**アプリケーションビルダーエクスプローラーからの Lambda リモートデバッグへのアクセス。**

1. VS Code から Toolkit AWS 拡張機能を開きます。

1.  AWS Toolkit から、Application Builder Explorer を展開します。

1. エクスプローラーから、デバッグする Lambda プロジェクトを含む `AWS SAM` プロジェクトを展開します。

1. デバッグする、デプロイされた `Lambda` 関数を展開します。

1. リモート関数に移動し、コンテキストメニューから **[リモート呼び出し]** アイコンを選択して **[リモート呼び出し設定]** 画面を開きます。

## Lambda リモートデバッグの使用
<a name="w2aac17c43c19c13"></a>

以下のセクションでは、 AWS Toolkit for Visual Studio Codeで Lambda リモートデバッグを使用する方法について説明します。

**注記**  
Lambda 関数には、関数コードとアタッチされたすべてのレイヤーに対して、5 つのレイヤーと合計 250 MB の制限があります。Lambda リモートデバッグを実行するには、少なくとも 1 つの空きレイヤーが必要です。

### デバッグセッションの設定
<a name="w2aac17c43c19c13b7"></a>

開始する前に、次の手順を実行してデバッグセッションを設定します。

1. * AWS エクスプローラーからの Lambda リモートデバッグへのアクセス*または前のセクションにある *Application Builder エクスプローラーからの Lambda リモートデバッグへのアクセス*の手順を完了して、**リモート呼び出し設定**メニューを開きます。

1. **[リモート呼び出し設定]** メニューから、**[リモートデバッグ]** チェックボックスを選択してリモートデバッグプロパティを表示します。

1. ローカルハンドラーファイルへの**ローカルルートパス**を指定します。
**注記**  
ローカルルートパスは、デプロイされた Lambda 関数に一致するソースコードの場所です。アプリケーションビルダーエクスプローラーでデプロイされた関数から作業している場合、ローカルルートパスが自動的に検出されます。  
ローカルに保存されたソースコードがない場合は、**[リモートコードのダウンロード]** ボタンを選択して Lambda 関数のソースコードを取得します。これにより、VS Code エディタで `handler file` が開きます。

1. **[Payload]** セクションで、テストイベントデータを取得する場所を指定します。

### ブレークポイントの設定とデバッグ
<a name="w2aac17c43c19c13b9"></a>

ブレークポイントを設定し、次の手順を実行してデバッグを開始します。

1. VS Code エディタの `handler file` から、余白部分をクリックして、デバッグを一時停止する行番号にブレークポイントを設定します。

1. ブレークポイントに問題がなければ、**[リモート呼び出し設定]** メニューに戻り、設定が正しく構成されていることを確認します。次に **[リモート呼び出し]** ボタンを選択してデバッグを開始します。

1.  AWS Toolkit は、Lambda 関数をデバッグ機能で更新し、デバッグセッションのセキュアトンネルを確立し、指定されたペイロードで関数を呼び出し、ブレークポイントに達するとプロセスを一時停止します。

1. ブレークポイントの一時停止時に、**[実行およびデバッグ]** ペインを使用して **[変数]**、**[呼び出しスタック]**、**[ブレークポイント]** を表示します。

### 関数の更新とテスト
<a name="w2aac17c43c19c13c11"></a>

クイックデプロイでコードを変更し、変更をテストするには、次の手順を実行します。

1. デバッグセッションをアクティブにした状態で、VS Code エディタで `handler file` を変更します。

1. 変更内容を保存します (**Command\$1S on macOS**、**Ctrl\$1S on Windows**)。

1. プロンプトが表示されたら、変更をデプロイすることに同意します。Toolkit AWS は、変更されたコードで Lambda 関数を更新します。

1. 新しいブレークポイントを設定し、**[リモート呼び出し]** ボタンを再度選択して、変更のデバッグとテストを続行します。
**注記**  
 または、VS Code デバッグコントロールで **[Attach debugger]** オプションの選択を解除し、**[リモート呼び出し]** ボタンを選択してデバッグなしで関数を実行できます。

### デバッグセッションの終了
<a name="w2aac17c43c19c13c13"></a>

次の各オプションにより、リモートデバッグセッションが終了し、プロジェクトからデバッグレイヤーが削除されます。
+ [**リモート呼び出し設定**] 画面から [**デバッグセットアップを削除**] を選択します。
+ VS Code のデバッグコントロールで **[disconnect]** アイコンを選択します。
+ VS Code エディタで `handler file` を閉じます。

**注記**  
以下の情報を記録します。  
Lambda デバッグレイヤーは、60 秒間非アクティブ状態が続くと自動的に削除されます。最後の呼び出しの完了時からカウントが開始されます。
デバッグプロセス中に infrastructure-as-code (IaC) マネージド (AWS SAM、 AWS CDK、Terraform) 関数にコード変更を加えた場合は、ローカルプロジェクトに保存し、ソースコントロールリポジトリの更新を検討してください。保存されていない変更は、IaC 関数が再デプロイされると上書きされます。
デバッグのみを目的として一時的な変更を加えた場合は、ソースコントロールから関数を再デプロイして、本番コードと一致するようにすることを推奨します。

### ソースマップを使用した TypeScript Lambda 関数のデバッグ
<a name="typescript-source-maps"></a>

以下のセクションでは、ソースマップを使用して TypeScript Lambda 関数をデバッグする方法について説明します。

#### 前提条件
<a name="w2aac17c43c19c13c15b5"></a>

TypeScript Lambda 関数をデバッグするには、次の前提条件を満たす必要があります。
+ TypeScript は、ソースマップオプションを有効にしてコンパイルする必要があります。詳細については、VS Code ドキュメントの「[JavaScript のソースマップのサポート](https://code.visualstudio.com/docs/typescript/typescript-debugging#_javascript-source-map-support)」トピックを参照してください。
+ インラインソースマップはサポートされていません。ソースマップを保存するには、別の `.js.map` ファイルを使用する必要があります。

#### 設定
<a name="w2aac17c43c19c13c15b7"></a>

 AWS Toolkit で TypeScript Lambda 関数の Lambda リモートデバッグを設定するには、次の手順を実行します。

1. Toolkit から AWS 、 AWS エクスプローラーを展開します。

1. エクスプローラーから、**[Lambda]** ノードを展開します。

1. TypeScript を設定する関数に移動し、コンテキストメニューから **[リモート呼び出し]** アイコンを選択して **[リモート呼び出し設定]** 画面を開きます。

1. リモートデバッグを有効にするには、**[リモートデバッグ]** チェックボックスをオンにします。

1. `TypeScript handler file` ディレクトリを指すように、**ローカルルートパス**を設定します。
**注記**  
`TypeScript handler file` は、デバッグブレークポイントを設定する場所です。

1. **[リモートデバッグの追加設定]** を展開します。

1. **[ソースマップ]** チェックボックスをオンにして、ソースマッピングを有効にします。

1. **[Out files]** フィールドを Lambda 関数のコピーのローカルディレクトリに設定します。  
**Example**  

   `app.js` と `app.map` が `.aws-sam/build/HelloWorldFunction` にある場合は、**[Out files]** の場所を `/Users/user/project/aws-sam/build/HelloWorldFunction/*` にします。
**注記**  
**Out file** パスは絶対パスである必要があります。  
 AWS SAM および AWS CDK プロジェクトの場合、 AWS Toolkit はソースマップの自動検出をサポートします。これらのプロジェクトで **Out files** フィールドが空のままの場合、ツールキットは自動的にソースマップの場所を検出しようとします。

1. 設定に問題がなければ、**[リモート呼び出し]** ボタンを選択して TypeScript 関数のデバッグを開始します。

## トラブルシューティングと高度なユースケース
<a name="troubleshooting"></a>

デバッグセッションが失敗した場合は、以下の手順を実行してトラブルシューティングプロセスを開始します。

1.  AWS Toolkit を最新バージョンに更新します。

1. **[リモート呼び出し設定]**ウェブビューを閉じ、再度開くことで、ウェブビューを更新します。

1. VS Code を完全に閉じ、再度開くことで、VS Code を再起動します。

1. VS Code コマンドパレットを開き、コマンド **AWS: Reset Lambda Remote Debugging Snapshot** を入力します。結果に表示されたら選択肢、Lambda リモートデバッグスナップショットをリセットします。

1. 問題をトラブルシューティングできない場合は、[AWS Toolkit for Visual Studio Code GitHub Issues](https://github.com/aws/aws-toolkit-vscode/issues) に問題を送信してください。

### 高度なユースケース: コード署名設定
<a name="troubleshooting-code-signing-configuration"></a>

リモートデバッグでは、Lambda 関数にデバッグレイヤーをアタッチする必要があります。関数でコード署名設定が有効で強制されている場合、 AWS Toolkit はデバッグレイヤーを関数に自動的にアタッチできません。

コード署名設定の問題を解決するには、2 つのオプションがあります。
+ コード署名を一時的に削除する。
+ 署名付きデバッグレイヤーを使用する。

#### コード署名の一時的な削除
<a name="troubleshooting-code-signing-configuration-temp-remove"></a>

`UntrustedArtifactOnDeployment : Warn` を設定してコード署名設定を更新し、デバッグプロセスの完了後に再度有効にして `Enforced` に戻します。

詳細については、「*AWS Lambda API リファレンス*」の [UpdateCodeSigningConfig](https://docs.aws.amazon.com//lambda/latest/api/API_UpdateCodeSigningConfig.html) リファレンスを参照してください。

#### 署名付きデバッグレイヤーの使用
<a name="troubleshooting-code-signing-configuration-signed-debug-layer"></a>

1. Toolkit の Lambda リモートデバッグから AWS 、**リモートデバッグの追加設定**セクションを展開します。

1. **[リモートデバッグの追加設定]** セクションで、**[レイヤーオーバーライド]** フィールドからリージョンレイヤー ARN をコピーします。

1. から AWS CLI、次のコマンドを使用してレイヤーバージョン をダウンロードし`aws lambda get-layer-version-by-arn --arn layer-arn`、 *Layer-arn* をレイヤー ARN に置き換えます。署名付きデバッグレイヤーをダウンロードする詳細な手順については、「*AWS CLI コマンドリファレンス*」の [get-layer-version-by-arn](https://docs.aws.amazon.com/cli/latest/reference/lambda/get-layer-version-by-arn.html) リファレンスを参照してください。

1. コード署名設定でレイヤーに署名し、アカウントに公開します。署名と公開のガイダンスについては、「 *AWS Serverless Application Model デベロッパーガイド*」の[AWS SAM 「アプリケーション用のコード署名の設定](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/authoring-codesigning.html)」トピックを参照してください。

1. レイヤーに署名してアカウントに公開したら、Lambda リモートデバッグの **[リモートデバッグの追加設定]** セクションに戻り、新しいレイヤー ARN を **[レイヤーオーバーライド]** フィールドに入力します。プロセスが完了すると、Lambda リモートデバッグはデフォルトのレイヤーの代わりに署名付きレイヤーを使用します。

### 高度なユースケース: SnapStart またはプロビジョニングされた同時実行による関数のデバッグ
<a name="troubleshooting-snapstart-provisioned-concurrency"></a>

SnapStart またはプロビジョニングされた同時実行で設定された Lambda 関数の場合、新しいバージョンの公開にはかなりの時間がかかります。デバッグワークフローを高速化するには、新しい`$LATEST`バージョンを発行するのではなく、関数のバージョンのみを更新するように Lambda リモートデバッグを設定できます。

1. **リモート呼び出し設定**画面から、**リモートデバッグの追加設定**を展開します。

1. Publish **version** オプションの選択を解除します。

1.  AWS Toolkit は関数`$LATEST`のバージョンのみを更新し、それを使用してデバッグするようになりました。

**注記**  
`$LATEST` バージョンでのデバッグの副作用として、障害のないデバッグ環境を確保するために、`$LATEST`バージョンを呼び出す可能性のある他のトラフィックを回避する必要があります。

### サポート対象のリージョン
<a name="troubleshooting-regions"></a>

次のエラーは、リージョンでリモートデバッグがサポートされていない場合に発生します。

```
Region ${region} doesn't support remote debugging yet
```

以下は、サポートされているリージョンの一覧です。
+ ap-east-1
+ ap-northeast-1
+ ap-northeast-2
+ ap-south-1
+ ap-southeast-1
+ ap-southeast-2
+ ca-central-1
+ eu-central-1
+ eu-north-1
+ eu-west-1
+ eu-west-2
+ eu-west-3
+ me-central-1
+ me-south-1
+ sa-east-1
+ us–east–1
+ us-east-2
+ us-west-1
+ us-west-2

### Lambda RequestEntityTooLargeException
<a name="troubleshooting-storage-limit"></a>

Lambda 関数には、関数コードとアタッチされたすべてのレイヤーに対して、5 つのレイヤーと合計 250 MB の制限があります。リモートデバッグレイヤーは約 40 MB のサイズがあるため、大きな関数パッケージまたは複数のレイヤーがある場合、関数がこの制限を超える可能性があります。詳細については、「*AWS Lambda デベロッパーガイド*」の「[Lambda: InvalidParameterValueException または RequestEntityTooLargeException](https://docs.aws.amazon.com//lambda/latest/dg/troubleshooting-deployment.html#troubleshooting-deployment-InvalidParameterValueException1)」トピックセクションを参照してください。

次のリストでは、このエラーをトラブルシューティングして修正する方法について説明します。
+ **関数のサイズを小さくする**: 関数コードを最適化し、不要な依存関係を削除します。
+ **未使用のレイヤーを削除する**: デバッグ中に、必須ではないレイヤーを一時的に削除します。
+ **外部依存関係を使用する**: 大きな依存関係を Amazon S3 などの外部ストレージに移動し、ランタイムにロードします。

### Java デバッグのトラブルシューティング
<a name="troubleshooting-java-debugging"></a>

Java Lambda 関数をデバッグするには、Lambda 関数のランタイムバージョンと一致する同じ Java バージョンがローカルにインストールされている必要があります。

たとえば、Java 25 関数をデバッグする場合、 AWS Toolkit が実行されているローカル環境に Java 25 がインストールされている必要があります。Java 21 以前のバージョンがローカルにインストールされている Java 25 関数をデバッグしようとすると、リモートデバッグは設定したブレークポイントで停止できません。

デバッグセッションを開始する前に、ローカル Java バージョンが Lambda 関数のランタイムバージョンと一致していることを確認してください。

### IoT セキュアトンネリングのクォータを超過
<a name="troubleshooting-tunnel-quota"></a>

以下は、Lambda リモートデバッグの AWS IoT セキュア*トンネリング接続の日次制限に達したときに発生するトンネルクォータ超過エラー*の例です。

```
Error creating/reusing tunnel: LimitExceededException: Exceeded quota of Lambda debugging tunnels
```

AWS IoT セキュアトンネリング接続には次のクォータがあります。
+ 無料階層の IoT セキュアトンネリングには、1 日あたり 10 個の接続が割り当てられます。
+ 各トンネルは、1 つの VS Code インスタンスを最大 12 時間サポートします。
+ クォータは AWS アカウントごと、1 日あたりに適用されます。

 AWS IoT セキュアトンネリングエラーが発生した場合は、毎日のクォータのリセットを待つか、 サポートに連絡して AWS クォータ制限の引き上げをリクエストしてください。 AWS サポート連絡先情報については、[AWS サポート連絡先ポータル](https://aws.amazon.com/contact-us/)を参照してください。 AWS IoT セキュアトンネリングの詳細については、「 *AWS IoT デベロッパーガイド*」の[AWS IoT 「セキュアトンネリング](https://docs.aws.amazon.com/iot/latest/developerguide/secure-tunneling.html)」トピックを参照してください。