AWS LambdaではLambdaファンクションに指定したイベントソースで発生したイベントに応じてファンクションがInvokeされるのですが、イベントが発生したはずなのにファンクションが思ったようにInvokeされない!と悩むときがあるかと思います。そんなときイベントソースがイベントを送ったかどうか確認したくなるのですが、実はこれはユーザ側では難しかったりします。
というわけでそういった場合はサポートに問い合わせて調査をしてもらうわけですがイベントソースがS3の場合にサポートへ問い合わせる上で最低限必要となるのが2種類のリクエストIDです。気をつけなければいけないのはこれらは通常のアクセスログ等には記録されていないのでユーザ側で取得・記録する必要があるということです。また、状況に応じて必要になる情報は異なるので、これらだけで必ずしも原因が特定可能というわけではないこともお伝えしておきます。少なくともS3側でイベント通知の発生有無の調査には少なくともこの2種類のリクエストIDが必要ということです。
詳細はドキュメントにも記載があるのでそちらを参照頂くとして、ここでは簡単に要点のみまとめます。
必要となるのはx-amz-request-idとx-amz-id-2という2つのリクエストIDです。そしてこれらはイベントの発生元となるオブジェクト操作リクエストに対するレスポンスとしてのみ取得可能です。従ってこれらをS3のオブジェクト操作リクエストを発行する側で取得した上で何らかの手段で記録しておく必要があります。やり方としてはクライアント側でログファイルに記録する方法もありますし、モバイルなどの場合、ログ記録用のAPIなどを用意して別途サーバサイドに送って記録する方法もあります。
実際にこのリクエストIDの値を確認するには、いくつか方法がありますが簡単に試せるものとしてブラウザからS3上にリクエストした際のエラーページです。例えばS3で静的Webサイト配信の機能を利用して配信している場合にブラウザ上のアドレスバーに存在しないオブジェクトを含むURLを入れて表示すると以下のようなレスポンスが表示されます。
ここで表示されているRequestIdとHostIdがそれぞれx-amz-request-idとx-amz-id-2に対応します。
成功したリクエストでこの値を確認する場合にはレスポンスヘッダを確認する必要があります。最近のブラウザだと開発者ツールなどが提供されていて確認することが可能です。例えばchromeの場合であれば「Developer Tools」を起動した上でリクエストすることでそのリクエストに対するレスポンスのヘッダが確認できます。以下のような感じです。
この赤枠で囲った部分が必要となるリクエストIDです。
また、各言語のSDKではログ出力がサポートされています。詳細な設定方法は上記ドキュメントや各言語のドキュメントを参照頂くとして、Javaの場合は個別の出力も可能となっています。
例えば以下のように出力します。
DefaultAWSCredentialsProviderChain credentialProviderChain = new DefaultAWSCredentialsProviderChain();
AmazonS3Client client = new AmazonS3Client(credentialProviderChain);
PutObjectRequest req = new PutObjectRequest("sample-bucket", "sample.json", new File("sample.json"));
client.putObject(req);
S3ResponseMetadata md = client.getCachedResponseMetadata(req);
System.out.println("x-amz-request-id: " + md.getRequestId() + " x-amz-id-2: " + md.getHostId());
あとはここで取得した値をクライアントサイドでローカルファイルにロギングすることも別途サーバサイドに送ってロギングすることも可能ですね。