前に、AWS SDKのリトライの挙動をnode.jsで確認する方法について書いた。
https://www.weblog-beta.com/posts/aws-sdk-retry/
「リトライの詳細を確認する」方法として、ローカルプロキシを立てる方法について書いたけど、ローカルプロキシを立てなくても確認する良い方法があった。
コードは下記。
var AWS = require('aws-sdk');
var moment = require('moment');
var util = require('util');
AWS.config.update({retryDelayOptions: {customBackoff: function(retryCount) {
return 1000;
}}});
var ep = new AWS.Endpoint('http://500.returnco.de');
var s3 = new AWS.S3({endpoint: ep, maxRetries: 3});
var params = {};
var listBucketsRequest = s3.listBuckets(params);
listBucketsRequest.on('send', function(response) {
console.log(moment().toISOString());
console.log(util.inspect(response.httpResponse.statusCode, { depth: null, maxArrayLength: null }));
console.log(util.inspect(response.httpResponse.headers, { depth: null, maxArrayLength: null }));
});
listBucketsRequest.send();
AWS SDK for JavaScriptでは、リクエストが送信された時に、AWS.Requestオブジェクトでsendイベントが発生する。
このイベントのコールバックでレスポンスを受け取った時刻とレスポンスの詳細を出力することで、ローカルプロキシを立てなくてもリトライの詳細を確認できる。
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html
あと、前に書いた文章では、循環参照しているオブジェクトをJSON.stringifyで文字列化するためにreplacerを書いたけど、Node.jsだと、util.inspectを使ってオブジェクトを文字列化することで循環参照をうまいことしてくれるので、inspectを使っている。
https://nodejs.org/api/util.html#util_util_inspect_object_options
ちなみに、errorイベントは、限界までリトライしてもリクエストに成功しなかった場合に発火する。