AWS Lambda Custom RuntimeでPHPからCloudWatch Logsに出力する方法

こんにちは、エンジニアの @akase244 です。

先日の記事の続きになるんですが、元々なぜLambdaでPHPを動かしたかったかというと、定期実行させているSlack用のボットをPHPで書いてて、Custom Runtimeの対応によりPHPも動くようになったし、せっかくなのでLambdaに置き換えてみようかな、という流れです。

ということで、LambdaにCloudWatch Eventsのトリガーを追加して平日12時に実行するという設定をしてみたところLambdaがなぜか動かなかったので、手っ取り早くprintデバッグしたいと思い、タイトルのとおりPHPの処理の中でCloudWatch Logsに出力できないか今回試してみました。

f:id:akase244:20190207212455p:plain:w500
CloudWatch Eventsの設定内容

やり方

「echo」を使う。これだけ。簡単。

例: echo 'LINE:'.__LINE__.PHP_EOL

bootstrapファイルの作り次第ではありますが、先日の記事で紹介したRackspace社のブログ記事のようなレスポンスの場合はechoでCloudWatch Logsに出力されます。

レスポンスの例

<?php

function sendResponse($invocationId, $response)
{
    $client = new \GuzzleHttp\Client();
    $client->post(
    'http://' . $_ENV['AWS_LAMBDA_RUNTIME_API'] . '/2018-06-01/runtime/invocation/' . $invocationId . '/response',
       ['body' => $response]
    );
}

f:id:akase244:20190208111358p:plain:w500
CloudWatch Logsでprintデバッグが出力されている様子

Lambdaではテストを作成して事前に動作検証を行うことができますが、テストの実行結果でもこのとおり。

f:id:akase244:20190208111416p:plain:w500
テストの実行結果画面

関数エディタの「Excecution Results」のエリアでもこのとおり。

f:id:akase244:20190208111442p:plain:w500
関数エディタの実行結果エリア

また、これも前回の記事で紹介しましたが、Stackery社のbootstrapファイルのようにHTTPサーバとして稼働させている場合は「error_log」を利用することでCloudWatch Logsに出力可能です。