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
- Android
- AWS
- Bitrise
- CodePipeline
- Firebase
- HTML
- iOS
- IoT
- JavaScript
- KPI
- Linux
- Mac
- Memcached
- MGRe
- MGReのゆるガチエンジニアブログ
- MySQL
- PHP
- PICK UP
- PR
- Python
- Ruby
- Ruby on Rails
- SEO
- Swift
- TIPS
- UI/UX
- VirtualBox
- Wantedly
- Windows
- アクセス解析
- イベントレポート
- エンジニアブログ
- ガジェット
- カスタマーサクセス
- サーバ技術
- サービス
- セキュリティ
- セミナー・展示会
- テクノロジー
- デザイン
- プレスリリース
- マーケティング施策
- マネジメント
- ラボ
- リーンスタートアップ
- 企画
- 会社紹介
- 会社紹介資料
- 勉強会
- 実績紹介
- 拡張性
- 採用
- 日常
- 書籍紹介
- 歓迎会
- 社内イベント
- 社員インタビュー
- 社長ブログ
- 視察
- 開発環境