CloudWatch ロググループの設定 - AWS Lambda

CloudWatch ロググループの設定

デフォルトでは、CloudWatch は関数が最初に呼び出されたときに /aws/lambda/<function name> という名前のロググループを自動的に作成します。既存のロググループにログを送信するように関数を設定したり、関数の新しいロググループを作成したりするには、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 Logs の命名規則に従う必要があることに注意してください。また、カスタムロググループ名には文字列 aws/ で始まるものを使用できません。aws/ で始まるカスタムロググループを作成すると、Lambda はロググループを作成できなくなります。この結果、関数のログは CloudWatch に送信されなくなります。

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

  2. 関数を選択します。

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

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

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

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

関数のロググループを変更するには (AWS CLI)
  • 既存の関数のロググループを変更するには、update-function-configuration コマンドを使用します。

    aws lambda update-function-configuration \ --function-name myFunction \ --logging-config LogGroup=myLogGroup
関数の作成時にカスタムロググループを指定するには (AWS CLI)
  • AWS CLI を使用して新しい Lambda 関数を作成するときにカスタムロググループを指定するには、--logging-config オプションを使用します。以下のコマンド例では、myLogGroup という名前のロググループにログを送信する Node.js Lambda 関数を作成します。

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

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

関数から CloudWatch Logs にログを送信するには、その関数に logs:PutLogEvents アクセス許可が必要です。Lambda コンソールを使用して関数のロググループを設定すると、Lambda は以下が満たされることを条件に、このアクセス許可をロールに追加します。

  • サービスの送信先が CloudWatch Logs に設定されていること

  • 関数の実行ロールが CloudWatch Logs (デフォルトの送信先) にログをアップロードするアクセス許可を持っていないこと

注記

Lambda は、Amazon S3 または Firehose ログの送信先に「Put」のアクセス許可を追加しません。

Lambda がこのアクセス許可を追加すると、任意の CloudWatch Logs ロググループにログを送信するアクセス許可が関数に付与されます。

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

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

Lambda マネージドインスタンスの CloudWatch ログ記録

Lambda マネージドインスタンスを使用する場合、CloudWatch Logs にログを送信する際には追加の考慮事項があります。

VPC ネットワーク要件

Lambda マネージドインスタンスは、VPC 内の顧客所有の EC2 インスタンスで実行されます。CloudWatch Logs にログを送信し、X-Ray にトレースを送信するには、これらの AWS API が VPC からルーティング可能であることを確認する必要があります。これには複数のオプションがあります。

  • AWS PrivateLink (推奨): AWS PrivateLink を使用して CloudWatch Logs および X-Ray サービスの VPC エンドポイントを作成します。これにより、インスタンスはインターネットゲートウェイや NAT ゲートウェイを必要とせずに、これらのサービスにプライベートにアクセスできます。詳細については、「インターフェイス VPC エンドポイントでの CloudWatch Logs の使用」を参照してください。

  • NAT ゲートウェイ: プライベートサブネットからのアウトバウンドインターネットアクセスを許可するように NAT ゲートウェイを設定します。

  • インターネットゲートウェイ: パブリックサブネットの場合は、VPC にインターネットゲートウェイが設定されていることを確認します。

CloudWatch Logs または X-Ray API が VPC からルーティングできない場合、関数ログとトレースは配信されません。

同時呼び出しとログ属性

Lambda マネージドインスタンスの実行環境は、複数の呼び出しを同時に処理できます。複数の呼び出しが同時に実行されると、それらのログエントリは同じログストリームにインターリーブされます。同時呼び出しからのログを効果的にフィルタリングして分析するには、各ログエントリに AWS リクエスト ID が含まれていることを確認する必要があります。

以下のアプローチのいずれかをお勧めします。

  • デフォルトの Lambda ランタイムロガーを使用する (推奨): Lambda マネージドランタイムによって提供されるデフォルトのログ記録ライブラリには、各ログエントリにリクエスト ID が自動的に含まれます。

  • 構造化 JSON ログ記録の実装: カスタムランタイムを構築している場合、またはカスタムログ記録が必要な場合は、各エントリにリクエスト ID を含む JSON 形式のログを実装します。Lambda マネージドインスタンスは JSON ログ形式のみをサポートします。JSON ログに requestId フィールドを含めて、呼び出しによるフィルタリングを有効にします。

    { "timestamp": "2025-01-15T10:30:00.000Z", "level": "INFO", "requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "message": "Processing request" }

リクエスト ID 属性を使用すると、CloudWatch Logs Insights クエリを使用して、特定の呼び出しの CloudWatch Logs ログエントリをフィルタリングできます。例えば、次のようになります。

fields @timestamp, @message | filter requestId = "a1b2c3d4-e5f6-7890-abcd-ef1234567890" | sort @timestamp asc

Lambda マネージドインスタンスのログ記録要件の詳細については、「Lambda マネージドインスタンスの実行環境について理解する」を参照してください。