での Amazon CloudWatch ログの使用 AWS Lambda - AWS Lambda

での Amazon CloudWatch ログの使用 AWS Lambda

AWS Lambda は、ユーザーに代わって Lambda 関数を自動でモニタリングし、関数の障害をトラブルシューティングするのに役立ちます。関数の実行ロールに必要なアクセス許可がある限り、Lambda は関数によって処理されたすべてのリクエストのログをキャプチャし、Amazon CloudWatch Logs に送信します。

コードが正常に動作しているかどうかを検証できるように、ログ記録ステートメントをコードに挿入できます。Lambda は Logs CloudWatch と自動的に統合され、コードのすべてのログを Lambda 関数に関連付けられた CloudWatch ロググループに送信します。

デフォルトでは、Lambda は /aws/lambda/<function name> という名前のロググループにログを送信します。関数から別のグループにログを送信する場合は、Lambda コンソール、AWS Command Line Interface (AWS CLI)、または Lambda API を使用してこれを設定できます。詳細については、「 CloudWatch ロググループの設定」を参照してください。

Lambda 関数のログは、Lambda コンソール、 CloudWatch コンソール、 AWS Command Line Interface (AWS CLI)、または CloudWatch API を使用して表示できます。

注記

関数の呼び出し後にログが表示されるまで、5~10 分かかることがあります。

前提条件

実行ロールには、ログを CloudWatch Logs にアップロードするためのアクセス許可が必要です。Lambda が提供する AWSLambdaBasicExecutionRoleAWSマネージドポリシーを使用して、 CloudWatch ログのアクセス許可を追加できます。このポリシーをロールに割り当てるには、次のコマンドを実行します。

aws iam attach-role-policy --role-name your-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

詳細については、「Lambda 機能の AWS マネージドポリシー」を参照してください。

料金

Lambda ログの使用には追加料金はかかりませんが、標準の CloudWatch ログ料金が適用されます。詳細については、「 のCloudWatch 料金」を参照してください。

Lambda 関数の高度なログ記録コントロールの設定

関数のログのキャプチャ、処理、使用方法をより細かく制御できるように、Lambda には以下のログ記録設定オプションが用意されています。

  • ログの形式 - 関数のログをプレーンテキスト形式と構造化された JSON 形式から選択します

  • ログレベル - JSON 構造化ログの場合は、ERROR、DEBUG、INFO など CloudWatch、Lambda が に送信するログの詳細レベルを選択します。

  • ロググループ - 関数が CloudWatch ログを送信するロググループを選択します

JSON とプレーンテキストのログフォーマットの設定

ログ出力を JSON キー値のペアとしてキャプチャすると、関数のデバッグ時の検索やフィルタリングが容易になります。JSON 形式のログでは、タグやコンテキスト情報をログに追加することもできます。これにより、大量のログデータを自動的に分析するのに役立ちます。開発ワークフローがプレーンテキストで Lambda ログを使用する既存のツールに依存している場合を除き、ログ形式には JSON を選択することをお勧めします。

すべての Lambda マネージドランタイムについて、関数のシステムログを非構造化プレーンテキストまたは JSON 形式で CloudWatch ログに送信するかどうかを選択できます。システムログは Lambda が生成するログで、プラットフォームイベントログと呼ばれることもあります。

サポートされているランタイムでは、サポートされている組み込みログ記録メソッドのいずれかを使用すると、Lambda は関数のアプリケーションログ (関数コードが生成するログ) を構造化された JSON 形式で出力することもできます。これらのランタイムに対して関数のログ形式を設定すると、選択した設定がシステムログとアプリケーションログの両方に適用されます。

サポートされているランタイムでは、関数がサポートされているログ記録ライブラリまたはメソッドを使用している場合は、Lambda が構造化された JSON でログをキャプチャするために既存のコードを変更する必要はありません。

注記

JSON ログフォーマットを使用すると、メタデータが追加され、一連のキー値のペアを含む JSON オブジェクトとしてログメッセージがエンコードされます。そのため、関数のログメッセージのサイズが大きくなる可能性があります。

サポートされているランタイムとログ記録メソッド

Lambda は現在、以下のランタイムの JSON 構造化アプリケーションログを出力するオプションをサポートしています。

ランタイム サポートバージョン
Java Amazon Linux 1 上の Java 8 を除くすべての Java ランタイム
Node.js Node.js 16 およびそれ以降
Python Python 3.7 以降

Lambda が関数のアプリケーションログを CloudWatch 構造化された JSON 形式で に送信するには、関数が次の組み込みログ記録ツールを使用してログを出力する必要があります。

  • Java - LambdaLogger ロガーまたは Log4j2。

  • Node.js - コンソールメソッド console.traceconsole.debugconsole.logconsole.infoconsole.error および console.warn

  • Python - 標準の Python logging ライブラリ

サポートされているランタイムで高度なログ記録コントロールを使用する方法の詳細については、「Java の AWS Lambda 関数ログ作成」、「Node.js の AWS Lambda 関数ログ作成」および「Python の AWS Lambda 関数ログ作成」を参照してください。

他のマネージド Lambda ランタイムについては、現在、Lambda は構造化された JSON 形式でのシステムログのキャプチャのみをネイティブでサポートしています。ただし、Powertools for AWS Lambda などのログ記録ツールを使用して JSON 形式のログを出力することで、どのランタイムでも構造化 JSON 形式のアプリケーションログをキャプチャできます。

既定のログ形式

現在、すべての Lambda ランタイムのデフォルトのログ形式はプレーンテキストです。

既に Powertools for AWS Lambda などのログ記録ライブラリを使用して JSON 構造化形式で関数ログを生成している場合は、JSON ログ形式を選択すればコードを変更する必要はありません。Lambda は既に JSON でエンコードされたログを二重にエンコードしないため、関数のアプリケーションログは以前と同様にキャプチャされます。

システムログの JSON 形式

関数のログ形式を JSON として設定すると、各システムログ項目 (プラットフォームイベント) は、以下のキーを含むキー値のペアを含む JSON オブジェクトとしてキャプチャされます。

  • "time" - ログメッセージが生成された時刻

  • "type" - 記録されるイベントのタイプ

  • "record" - ログ出力の内容

"record" 値の形式は、記録されるイベントのタイプによって異なります。詳細については、Telemetry API Event オブジェクトタイプを参照してください。システムログイベントに割り当てられるログレベルの詳細については、「システムログレベルのイベントマッピング」を参照してください。

比較のため、以下の 2 つの例は、プレーンテキスト形式と構造化された JSON 形式の両方で同じログ出力を示しています。ほとんどの場合、システムログイベントには、プレーンテキストで出力される場合よりも JSON 形式で出力される方が多くの情報が含まれることに注意してください。

例 プレーンテキスト:
2023-03-13 18:56:24.046000 fbe8c1 INIT_START Runtime Version: python:3.9.v18 Runtime Version ARN: arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0
例 構造化された JSON:
{ "time": "2023-03-13T18:56:24.046Z", "type": "platform.initStart", "record": { "initializationType": "on-demand", "phase": "init", "runtimeVersion": "python:3.9.v18", "runtimeVersionArn": "arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0" } }
注記

Lambda Telemetry API は常に JSON 形式で STARTREPORT などのプラットフォームイベントを送信します。Lambda が に送信するシステムログの形式を設定 CloudWatch しても、Lambda Telemetry API の動作には影響しません。

アプリケーションログの JSON 形式

関数のログ形式を JSON として設定すると、サポートされているログ記録ライブラリとメソッドを使用して書き込まれたアプリケーションログ出力は、以下のキーを持つキー値のペアを含む JSON オブジェクトとしてキャプチャされます。

  • "timestamp" - ログメッセージが生成された時刻

  • "level" - メッセージに割り当てられたログレベル

  • "message" - ログメッセージの内容

  • "requestId" (Python および Node.js) または "AWSrequestId" (Java) - 関数呼び出しの一意のリクエスト ID

関数が使用するランタイムとログ記録方法によっては、この JSON オブジェクトには追加のキーペアが含まれる場合もあります。例えば、Node.js では、関数が console メソッドを使用して複数の引数を使用しているエラーオブジェクトをログに記録する場合、JSON オブジェクトには、errorMessageerrorTypestackTrace というキーを含む追加のキーと値のペアが含まれます。さまざまな Lambda ランタイムの JSON 形式のログの詳細については、「Python の AWS Lambda 関数ログ作成Node.js の AWS Lambda 関数ログ作成Java の AWS Lambda 関数ログ作成」を参照してください。

注記

Lambda がタイムスタンプ値に使用するキーは、システムログとアプリケーションログでは異なります。システムログの場合、Lambda はキー "time" を使用して Telemetry API との一貫性を維持します。アプリケーションログについては、Lambda はサポートされているランタイムの規則に従い、"timestamp" を使用します。

比較のため、以下の 2 つの例は、プレーンテキスト形式と構造化された JSON 形式の両方で同じログ出力を示しています。

例 プレーンテキスト:
2023-10-27T19:17:45.586Z 79b4f56e-95b1-4643-9700-2807f4e68189 INFO some log message
例 構造化された JSON:
{ "timestamp":"2023-10-27T19:17:45.586Z", "level":"INFO", "message":"some log message", "requestId":"79b4f56e-95b1-4643-9700-2807f4e68189" }

関数のログ形式の設定

関数のログ形式を設定するには、Lambda コンソールまたは AWS Command Line Interface (AWS CLI) を使用できます。関数のログ形式は、 CreateFunctionおよび UpdateFunctionConfiguration Lambda API コマンド、 AWS Serverless Application Model (AWS SAM) AWS::Serverless::Functionリソース、および AWS CloudFormationAWS::Lambda::Functionリソースを使用して設定することもできます。

関数のログ形式を変更しても、 CloudWatch Logs に保存されている既存のログには影響しません。新しいログのみが更新された形式を使用します。

関数のログ形式を JSON に変更し、ログレベルを設定しない場合、Lambda は関数のアプリケーションログレベルとシステムログレベルを自動的に INFO に設定します。つまり、Lambda はレベル INFO 以下のログ出力のみを CloudWatch Logs に送信します。アプリケーションおよびシステムログレベルのフィルタリングの詳細については、ログレベルのフィルタリング を参照してください。

注記

Python ランタイムでは、関数のログ形式がプレーンテキストに設定されている場合、デフォルトのログレベル設定は WARN です。つまり、Lambda はレベル WARN 以下のログ出力のみを CloudWatch Logs に送信します。関数のログ形式を JSON に変更すると、このデフォルト動作が変わります。Python におけるログ記録の詳細については、「Python の AWS Lambda 関数ログ作成」を参照してください。

埋め込みメトリクスフォーマット (EMF) ログを発行する Node.js 関数の場合、関数のログ形式を JSON に変更すると、 CloudWatch はメトリクスを認識できなくなる可能性があります。

重要

関数が Powertools for AWS Lambda (TypeScript) またはオープンソースの EMF クライアントライブラリを使用して EMF ログを出力する場合は、Powertools および EMF CloudWatch ライブラリを最新バージョンに更新して、 が引き続きログを正しく解析できるようにします。JSON ログ形式に切り替える場合は、関数に埋め込まれているメトリクスとの互換性を確認するためのテストを実施することもお勧めします。EMF ログを生成する node.js 関数に関するその他のアドバイスについては、「構造化された JSON ログでの埋め込みメトリクスフォーマット (EMF、Embedded Metric Format) クライアントライブラリの使用」を参照してください。

関数のログ形式を設定するには (コンソール)
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. 関数設定ページで、[モニタリングおよび運用ツール] を選択します。

  4. [ログ記録設定] ペインで、[編集] を選択します。

  5. [ログの内容][ログ形式][テキスト] または [JSON] を選択します。

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

既存の関数 (AWS CLI) のログ形式を変更するには
  • 既存の関数のログ形式を変更するには、update-function-configuration コマンドを使用します。LoggingConfigLogFormat オプションを JSON または Text に設定します。

    aws lambda update-function-configuration \ --function-name myFunction --logging-config LogFormat=JSON
関数の作成時にログ形式を設定するには (AWS CLI)
  • 新しい関数を作成するときにログ形式を設定するには、create-function コマンドの --logging-config オプションを使用します。LogFormatJSON または Text に設定します。以下のコマンド例は、Node.js 18 ランタイムを使用して構造化 JSON でログを出力する関数を作成します。

    関数の作成時にログ形式を指定しない場合、Lambda は選択したランタイムバージョンのデフォルトのログ形式を使用します。デフォルトのログ記録形式の詳細については、「既定のログ形式」を参照してください。

    aws lambda create-function --function-name myFunction --runtime nodejs18.x \ --handler index.handler --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole --logging-config LogFormat=JSON

ログレベルのフィルタリング

Lambda は、特定の詳細レベル以下のログのみが Logs に送信されるように、関数の CloudWatch ログをフィルタリングできます。関数のシステムログ (Lambda が生成するログ) とアプリケーションログ (関数コードが生成するログ) には、ログレベルのフィルタリングを個別に設定できます。

サポートされているランタイムとログ記録メソッド では、Lambda が関数のアプリケーションログをフィルタリングするために、関数コードに変更を加える必要はありません。

その他のすべてのランタイムとログ記録メソッドでは、関数コードはキー "level" とキー値のペアを含む JSON 形式のオブジェクトとして stdout または stderr にログイベントを出力する必要があります。例えば、Lambda は以下の stdout への出力を DEBUG レベルのログとして解釈します。

print('{"level": "debug", "msg": "my debug log", "timestamp": "2023-11-02T16:51:31.587199Z"}')

"level" 値フィールドが無効または欠落している場合、Lambda はログ出力にレベル INFO を割り当てます。Lambda がタイムスタンプフィールドを使用するには、有効な RFC 3339 タイムスタンプ形式で時間を指定する必要があります。有効なタイムスタンプを指定しない場合、Lambda はログに INFO レベルを割り当ててタイムスタンプを追加します。

タイムスタンプキーに名前を付ける場合は、使用しているランタイムの規則に従ってください。Lambda は、マネージドランタイムで使用されるほとんどの一般的な命名規則をサポートしています。例えば、.NET ランタイムを使用する関数では、Lambda はキー "Timestamp" を認識します。

注記

ログレベルのフィルタリングを使用するには、JSON ログ形式を使用するように関数を設定する必要があります。現在、すべての Lambda マネージドランタイムのデフォルトのログ形式はプレーンテキストです。関数のログ形式を JSON に設定する方法については、「関数のログ形式の設定」を参照してください。

アプリケーションログ (関数コードによって生成されるログ) については、以下のログレベルから選択できます。

ログレベル 標準的な使用状況
TRACE (最も詳細) コードの実行パスを追跡するために使用される最も詳細な情報
DEBUG システムデバッグの詳細情報
INFO 関数の通常の動作を記録するメッセージ
WARN 対処しないと予期しない動作を引き起こす可能性がある潜在的なエラーに関するメッセージ
ERROR コードが期待どおりに動作しなくなる問題に関するメッセージ
FATAL (詳細度が最も低い) アプリケーションの機能停止を引き起こす重大なエラーに関するメッセージ

ログレベルを選択すると、Lambda はそのレベル以下のログを CloudWatch Logs に送信します。例えば、関数のアプリケーションログレベルを WARN に設定した場合、Lambda は INFO レベルと DEBUG レベルでログ出力を送信しません。ログフィルタリングのデフォルトのアプリケーションログレベルは INFO です。

Lambda が関数のアプリケーションログをフィルタリングすると、レベルのないログメッセージにはログレベル INFO が割り当てられます。

システムログ (Lambda サービスによって生成されるログ) については、以下のログレベルから選択できます。

ログレベル 使用方法
DEBUG (詳細度が最も高い) システムデバッグの詳細情報
INFO 関数の通常の動作を記録するメッセージ
WARN (詳細度が最も低い) 対処しないと予期しない動作を引き起こす可能性がある潜在的なエラーに関するメッセージ

ログレベルを選択すると、Lambda はそのレベル以下のログを送信します。例えば、関数のシステムログレベルを INFO に設定した場合、Lambda は DEBUG レベルでログ出力を送信しません。

デフォルトでは、Lambda はシステムログレベルを INFO に設定します。この設定では、Lambda はメッセージを に自動的に送信"start"して"report"ログに記録します CloudWatch。詳細度がより高いシステムログまたは詳細度がより低いシステムログを受信するには、ログレベルを DEBUG または WARN に変更します。Lambda がさまざまなシステムログイベントをマッピングするログレベルのリストを確認するには、「システムログレベルのイベントマッピング」を参照してください。

ログレベルフィルタリングの設定

関数にアプリケーションとシステムログレベルのフィルタリングを設定するには、Lambda コンソールまたは AWS Command Line Interface (AWS CLI) を使用できます。関数のログレベルは、 CreateFunctionおよび UpdateFunctionConfiguration Lambda API コマンド、 AWS Serverless Application Model (AWS SAM) AWS::Serverless::Functionリソース、および AWS CloudFormationAWS::Lambda::Functionリソースを使用して設定することもできます。

関数のログレベルをコード内で設定した場合、この設定は他のログレベル設定よりも優先されることに注意してください。例えば、Python logging setLevel() メソッドを使用して関数のログレベルを INFO に設定した場合、この設定は Lambda コンソールを使用して設定した WARN の設定よりも優先されます。

既存の関数のアプリケーションまたはシステムログレベルを設定するには (コンソール)
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. 関数設定ページで、[モニタリングおよび運用ツール] を選択します。

  4. [ログ記録設定] ペインで、[編集] を選択します。

  5. [ログの内容][ログ形式][JSON] が選択されていることを確認します。

  6. ラジオボタンを使用して、関数に必要な [アプリケーションログレベル][システムログレベル] を選択します。

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

既存の関数のアプリケーションまたはシステムログレベルを設定するには (AWS CLI)
  • 既存の関数のアプリケーションログレベルまたはシステムログレベルを変更するには、update-function-configuration コマンドを使用します。--system-log-levelDEBUGINFO、または WARN のいずれかに設定します。--application-log-levelDEBUGINFOWARNERROR、または FATAL のいずれかに設定します。

    aws lambda update-function-configuration \ --function-name myFunction --system-log-level WARN \ --application-log-level ERROR
関数の作成時にログレベルのフィルタリングを設定するには
  • 新しい関数を作成するときにログレベルのフィルタリングを設定するには、create-function コマンドの --system-log-level および --application-log-level オプションを使用します。--system-log-levelDEBUGINFO、または WARN のいずれかに設定します。--application-log-levelDEBUGINFOWARNWARN、または FATAL のいずれかに設定します。

    aws lambda create-function --function-name myFunction --runtime nodejs18.x \ --handler index.handler --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole --system-log-level WARN \ --application-log-level ERROR

システムログレベルのイベントマッピング

Lambda によって生成されるシステムレベルのログイベントについて、以下の表は各イベントに割り当てられるログレベルを定義しています。表に記載されているイベントの詳細については、「Lambda Telemetry API Event スキーマリファレンス」を参照してください。

イベント名 条件 割り当てられたログレベル
initStart runtimeVersion が設定されている INFO
initStart runtimeVersion が設定されていない DEBUG
initRuntimeDone status=success DEBUG
initRuntimeDone status!=success WARN
initReport initializationType=snapstart INFO
initReport initializationType!=snapstart DEBUG
initReport status!=success WARN
restoreStart runtimeVersion が設定されている INFO
restoreStart runtimeVersion が設定されていない DEBUG
restoreRuntimeDone status=success DEBUG
restoreRuntimeDone status!=success WARN
restoreReport status=success INFO
restoreReport status!=success WARN
start - INFO
runtimeDone status=success DEBUG
runtimeDone status!=success WARN
レポート status=success INFO
レポート status!=success WARN
拡張子 state=success INFO
拡張子 state!=success WARN
logSubscription - INFO
telemetrySubscription - INFO
logsDropped - WARN
注記

Lambda Telemetry API は常にプラットフォームイベントの完全なセットを出力します。Lambda が に送信するシステムログのレベルを設定 CloudWatch しても、Lambda Telemetry API の動作には影響しません。

カスタムランタイムによるアプリケーションログレベルのフィルタリング

関数にアプリケーションログレベルのフィルタリングを設定すると、バックグラウンドで Lambda は AWS_LAMBDA_LOG_LEVEL 環境変数を使用してランタイムのアプリケーションログレベルを設定します。また、Lambda は AWS_LAMBDA_LOG_FORMAT 環境変数を使用して関数のログ形式を設定します。これらの変数を使用して、Lambda の高度なログ記録コントロールをカスタムランタイムに統合できます。

Lambda コンソール、AWS CLI、および Lambda API でカスタムランタイムを使用して関数のログ記録設定を設定できるようにするには、これらの環境変数の値をチェックするようにカスタムランタイムを設定します。その後、選択したログ形式とログレベルに従ってランタイムのロガーを設定できます。

CloudWatch ロググループの設定

デフォルトでは、 は関数が最初に呼び出されたときに、 という名前/aws/lambda/<function name>のロググループ CloudWatch を自動的に作成します。既存のロググループにログを送信するように関数を設定したり、関数の新しいロググループを作成したりするには、Lambda コンソールまたは AWS CLI を使用できます。また、 CreateFunctionおよび UpdateFunctionConfiguration Lambda API コマンドと AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function リソースを使用して、カスタムロググループを設定することもできます。

同じロググループに CloudWatch ログを送信するように複数の Lambda 関数を設定できます。例えば、1 つのロググループを使用して、特定のアプリケーションを構成するすべての Lambda 関数のログを保存できます。Lambda 関数にカスタムロググループを使用する場合、Lambda が作成するログストリームには関数名と関数バージョンが含まれます。これにより、同じロググループを複数の関数に使用しても、ログメッセージと関数の間のマッピングは保持されます。

カスタムロググループのログストリームの命名形式は、次の規則に従います。

YYYY/MM/DD/<function_name>[<function_version>][<execution_environment_GUID>]

カスタムロググループを設定する場合、ロググループ用に選択した名前はCloudWatch 、ログの命名規則 に従う必要があります。また、カスタムロググループ名には文字列 aws/ で始まるものを使用できません。aws/ で始まるカスタムロググループを作成すると、Lambda はロググループを作成できなくなります。その結果、関数のログは に送信されません CloudWatch。

関数のロググループを変更するには (コンソール)
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. 関数設定ページで、[モニタリングおよび運用ツール] を選択します。

  4. [ログ記録設定] ペインで、[編集] を選択します。

  5. ログ記録グループペインのCloudWatch ロググループ で、カスタム を選択します。

  6. カスタムロググループ に、関数が CloudWatch ログを送信するロググループの名前を入力します。既存のロググループの名前を入力すると、関数はそのグループを使用します。入力した名前のロググループが存在しない場合、Lambda はその名前で関数の新しいロググループを作成します。

関数のロググループを変更するには (AWS CLI)
  • 既存の関数のロググループを変更するには、update-function-configuration コマンドを使用します。既存のロググループの名前を指定すると、関数はそのグループを使用します。指定した名前のロググループが存在しない場合、Lambda はその名前で関数の新しいロググループを作成します。

    aws lambda update-function-configuration \ --function-name myFunction --log-group myLogGroup
関数の作成時にカスタムロググループを指定するには (AWS CLI)
  • AWS CLI を使用して新しい Lambda 関数を作成するときにカスタムロググループを指定するには、--log-group オプションを使用します。既存のロググループの名前を指定すると、関数はそのグループを使用します。指定した名前のロググループが存在しない場合、Lambda はその名前で関数の新しいロググループを作成します。

    以下のコマンド例では、myLogGroup という名前のロググループにログを送信する Node.js Lambda 関数を作成します。

    aws lambda create-function --function-name myFunction --runtime nodejs18.x \ --handler index.handler --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole --log-group myLogGroup

実行ロールのアクセス許可

関数がログを CloudWatch Logs に送信するには、 アクセスlogs:PutLogEvents許可が必要です。Lambda コンソールを使用して関数のロググループを設定するときに、関数にこのアクセス許可がない場合、Lambda はデフォルトでそれを関数の実行ロールに追加します。Lambda はこのアクセス許可を追加すると、任意の CloudWatch Logs ロググループにログを送信するアクセス許可を関数に付与します。

Lambda が関数の実行ロールを自動的に更新しないようにして、代わりに手動で関数の実行ロールを編集するには、[アクセス許可] を展開し、[必要なアクセス許可を追加] のチェックを外します。

AWS CLI を使用して関数のロググループを設定しても、Lambda は logs:PutLogEvents アクセス許可を自動的に追加しません。まだアクセス許可がない場合は、関数の実行ロールにアクセス許可を追加します。このアクセス許可は、 AWSLambdaBasicExecutionRole管理ポリシーに含まれています。

Lambda コンソールでログにアクセスする

Lambda コンソールを使用してログを表示するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. [モニター] を選択します。

  4. でログを表示する CloudWatchを選択します。

AWS CLI を使用したログへのアクセス

AWS CLI は、コマンドラインシェルでコマンドを使用して AWS サービスとやり取りするためのオープンソースツールです。このセクションの手順を完了するには、以下が必要です。

AWS CLI および --log-type コマンドオプションを使用して、呼び出しのログを取得します。レスポンスには、LogResultフィールドが含まれ、このフィールドには、呼び出しから base64 コードされた最大 4 KB のログが含まれます。

例 ログ ID を取得します

次の例は、LogResultという名前の関数のmy-functionフィールドからログ ID を取得する方法を示しています。

aws lambda invoke --function-name my-function out --log-type Tail

次のような出力が表示されます。

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
例 ログをデコードします

同じコマンドプロンプトで、base64 ユーティリティを使用してログをデコードします。次の例は、my-functionの base64 でエンコードされたログを取得する方法を示しています 。

aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode

AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。これをデフォルト設定にするには、aws configure set cli-binary-format raw-in-base64-out を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「AWS CLI でサポートされているグローバルコマンドラインオプション」を参照してください。

以下の出力が表示されます。

START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB

base64このユーティリティは、Linux、macOS、および Windows の Ubuntu で使用できます。macOS ユーザーは、base64 -Dを使用する必要があります 。

例 get-logs.sh スクリプト

同じコマンドプロンプトで、次のスクリプトを使用して、最後の 5 つのログイベントをダウンロードします。このスクリプトはsedを使用して出力ファイルから引用符を削除し、ログが使用可能になるまで15秒待機します。この出力には Lambda からのレスポンスと、get-log-events コマンドからの出力が含まれます。

次のコードサンプルの内容をコピーし、Lambda プロジェクトディレクトリに get-logs.sh として保存します。

AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。これをデフォルト設定にするには、aws configure set cli-binary-format raw-in-base64-out を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「AWS CLI でサポートされているグローバルコマンドラインオプション」を参照してください。

#!/bin/bash aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name stream1 --limit 5
例 macOS および Linux (専用)

同じコマンドプロンプトで、macOS と Linux ユーザーが次のコマンドを実行して、スクリプトが実行可能であることを確認する必要があります。

chmod -R 755 get-logs.sh
例 最後の 5 つのログイベントを取得します

同じコマンドプロンプトで、次のスクリプトを実行して、最後の 5 つのログイベントを取得します。

./get-logs.sh

以下の出力が表示されます。

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }

ランタイム関数のロギング

コードが期待どおりに動作していることをデバッグして検証するには、プログラミング言語の標準ログ機能を使用してログを出力します。Lambda ランタイムは、関数のログ出力を CloudWatch Logs にアップロードします。言語固有の手順については、以下のトピックをご参照ください。

次のステップ