AWS SDK for Rubyのコンソール出力を黙らせる方法
PICK UP POST

AWS SDK for Rubyのコンソール出力を黙らせる方法

AWS、使ってますか?
弊社はすっかりAWSにロックインされてる感があり、1日辺り31.4時間くらいはAWSと戯れてる気がします。

さて、そんなAWSですが弊社は現時点ではRuby on Railsでの開発を主としており、AWSの各種機能を使う際にもAWS SDK for Rubyを利用しています。
当然公式のSDKなのでドキュメントもしっかりとしています。
しっかりとはしているんですが、設定できる項目すべてが書かれているわけではない・・・気がします。
もしかしたらどこかに書いてあるのに気付いてないだけかもしれないですが、今回ちょっと不便だったところを解決できたので他の誰かの役に立つといいな、と思って書いてみます。

発端はSQSのパフォーマンスってどのくらいなのかしらというテストコードを書いたことです。

require 'benchmark'
Benchmark.realtime do
  10.times do
    sqs = Aws::SQS::Client.new(region: 'ap-northeast-1')
    url = 'https://sqs.ap-northeast-1.amazonaws.com/0123456789/test'
    sqs.send_message(queue_url: url, message_body: 'test')
  end
end

ざっくりですがこんな感じですね。
単純にAWSクライアントを生成してメッセージを投げる感じです。
この例では10回のループとしていますが、実際に実行すると

[Aws::SQS::Client 200 0.049089 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

[Aws::SQS::Client 200 0.010446 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

[Aws::SQS::Client 200 0.010214 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

[Aws::SQS::Client 200 0.010132 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

[Aws::SQS::Client 200 0.012679 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

[Aws::SQS::Client 200 0.018908 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

[Aws::SQS::Client 200 0.011595 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

[Aws::SQS::Client 200 0.011943 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

[Aws::SQS::Client 200 0.012488 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

[Aws::SQS::Client 200 0.023157 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

=> 0.20230929902754724

こんな風にいい感じでコンソールにログを出力してくれます。

で、これが問題なわけです。
10回程度ならまぁいいんですが、数千回、数万回のテストになると当然コンソールにその回数分のログが出ます。
出るだけならまだマシです。
ご存知の方も多いと思いますが、コンソールへの文字出力って実はすごく「重い」処理なんですね。
チリも積もればなんとやらです。

で、このログ出力を抑制したかったんですが、ドキュメントには記載がない・・・と思います。
結論から言うとクライアントのオプションとしてlogger: falseを指定してあげるといい感じになります。

require 'benchmark'
Benchmark.realtime do
  10.times do
    sqs = Aws::SQS::Client.new(region: 'ap-northeast-1', logger: false)
    url = 'https://sqs.ap-northeast-1.amazonaws.com/0123456789/test'
    sqs.send_message(queue_url: url, message_body: 'test')
  end
end
=> 0.15356540796346962

はい、めでたくBenchmarkの出力だけになり、たかだか10回のループですら50msec近い差が出てますね。

今回はSQSクライアントでのテストでしたが、AWSのクライアントはすべてSeahorse::Client::Baseが元になっているので同じように指定することで出力を抑制できると思います。

ちなみにhttp_wire_trace: trueなんてオプションを指定するとAWSクライアントが実際に行っているHTTP通信のログを表示することができます。

opening connection to sqs.ap-northeast-1.amazonaws.com:443...
opened
starting SSL for sqs.ap-northeast-1.amazonaws.com:443...
SSL established
<- "POST /0123456789/test HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded; charset=utf-8\r\n....."
-> "HTTP/1.1 200 OK\r\n"
-> "Server: Server\r\n"
-> "Date: .....\r\n"
-> "Content-Type: text/xml\r\n"
-> "Content-Length: 378\r\n"
-> "Connection: keep-alive\r\n"
-> "x-amzn-RequestId: .....\r\n"
-> "\r\n"
reading 378 bytes...
-> "<?xml version=\"1.0\"?><SendMessageResponse xmlns=\"http://queue.amazonaws.com/doc/2012-11-05/\">....."
read 378 bytes
Conn keep-alive
[Aws::SQS::Client 200 0.11416 0 retries] send_message(queue_url:"https://sqs.ap-northeast-1.amazonaws.com/0123456789/test",message_body:"test")  

=> 0.2625598100130446

こんな感じです。
さすがに長すぎなので1件分、しかも秘匿情報まで丸出しなので加工してあります。
また、ログの出力内容が増えたので実行時間も60msec近く増えていることが分かると思います。

カバー写真はフリー写真素材ぱくたそから大川“日本一インターネットで顔写真が使われている”竜弥さん。

TAG

  • このエントリーをはてなブックマークに追加
やまま
スペシャリスト やまま yamama

マンガとアニメとゲームから錬成された宇宙大好きエンジニア。 軌道エレベーターで行ける静止軌道上のコロニーに住まいを移し、ゲームやってマンガ読んでアニメ見て爆睡、ゲームやってマンガ読んでアニメ見て爆睡、という生活を夢見ながら今日もコードを書き続けるのだった。